MicroPython 如何嵌入汇编-悦德财富

MicroPython 包涵可内联的汇编,允许用户使用汇编语言作为 Python 的子程序,且你可以像正常使用函数般使用它们。

1、返回值

内联汇编函数用特定的函数装饰器标示。我们从最简单的例子下手:


1

2

3

    @micropython.asm_thumb

    def fun():

    movw(r0, 42)

你可以在脚本或是解释器里边使用该函数。该函数没有任何参数且返回数值42 。r0 是一个寄存器,其中的数值在函数返回值返回时被更改。MicroPython 一直将 r0视为一个整数并将其作为整数变量供使用者调用。

如果使用了命令 print(fun( )) 将能看到数值42被打印出来。

2、汇编语言基础

稍微复杂一些些,我们尝试点亮一盏灯:


1

2

3

4

5

  @micropython.asm_thumb

    def led_on():

    movwt(r0, stm.GPIOA)

    movw(r1, 1 << 13)

    strh(r1, [r0, stm.GPIO_BSRRL])

上述代码使用了一些新的概念:

. stm 为 pyboard 的微处理器提供了一系列内容以便于连接寄存器。尝试在 REPL 里运行 import stm 和 help(stm) 。这将得到一清单的有用内容:

. stm.GPIOA 对应外围设备GPIOA 在内存中的地址。在 pyboard 板上红色的led 灯对应 A端口,PA13 引脚;

. movwt 将32位数值放入寄存器中。其可视为由两个指令集组成的简便函数:先是 movw 然后 movt 。movt 将16位立即数移 动。

.strh 存储半字数据。上述代码里将r1的低16位数值存入 r0 +stm.GPIO_BSRRL 的内存地址中。这将按照 r0 里设定的数值将 A 端口对应的引脚设置为高。例程中r0的第13位值被置位,故PA13 被拉高。因此红色LED 灯被点亮。

3、接受参数

内联汇编语言最多可以接收四个参数。一旦被使用,必须为 r0,r1,r2,r3 的寄存器或其里边的调用内容。以下是使用了这些参数的函数:


1

2

3

    @micropython.asm_thumb

    def asm_add(r0, r1):

    add(r0, r0, r1)

这里使用了 r0=r0+r1 的计算。由于将结果放入了 r0 中,故其为返回结果。尝试运行asm(1,2),将能得到 3 的返回值。

4、循环

我们可以分配 label(my_label)的标号,然后使用 b(my_label) 跳转到该分支,或者用 bgt(my_lable)进行有条件的跳转。下面例程使绿色的 LED 灯闪烁,闪烁次数存放在 r0 里边。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

    @micropython.asm_thumbdef flash_led(r0):

    # get the GPIOA address in r1

    movwt(r1, stm.GPIOA)

    # get the bit mask for PA14 (the pin LED #2 is on)

    movw(r2, 1 << 14)

    b(loop_entry)

    label(loop1)

    # turn LED on

    strh(r2, [r1, stm.GPIO_BSRRL])

    # delay for a bit

    movwt(r4, 5599900)

    label(delay_on)

    sub(r4, r4, 1)

    cmp(r4, 0)

    bgt(delay_on)

    # turn LED off

    strh(r2, [r1, stm.GPIO_BSRRH])

    # delay for a bit

    movwt(r4, 5599900)

    label(delay_off)

    sub(r4, r4, 1)

    cmp(r4, 0)

    bgt(delay_off)

    # loop r0 times

    sub(r0, r0, 1)

    label(loop_entry)

    cmp(r0, 0)

    bgt(loop1)

https://www.yuedecaifu.com/
https://www.yuedecaifu.com/front/bidAction/index
https://www.yuedecaifu.com/front/invest/investHome
https://www.yuedecaifu.com/front/invest/investPlatform
https://www.yuedecaifu.com/front/debt/debtHome
https://www.yuedecaifu.com/login
https://www.yuedecaifu.com/front/principal/principalGuaranteeHome
https://www.yuedecaifu.com/front/wealthinfomation/home

https://www.yuedecaifu.com/
https://www.yuedecaifu.com/front/bidAction/index
https://www.yuedecaifu.com/front/invest/investHome
https://www.yuedecaifu.com/front/invest/investPlatform
https://www.yuedecaifu.com/front/debt/debtHome
https://www.yuedecaifu.com/login
https://www.yuedecaifu.com/front/principal/principalGuaranteeHome
https://www.yuedecaifu.com/front/wealthinfomation/home

时间: 2024-12-22 17:21:07

MicroPython 如何嵌入汇编-悦德财富的相关文章

Python在实时嵌入式系统开发中扮演的五个主要角色-悦德财富

Python已经成为相当热门的程序语言.它以著名的Monty Python喜剧组命名,属于面向对象和解释型语言(非编译型).该属性使得Python具有良好的跨平台性,比如Linux和Windows,或是诸如Raspberry Pi等单板计算机.随着Python的日益普及,人们可能会问,在实时嵌入式系统中是否也有Python的一席之地. 答案是肯定的.下面是开发人员发现Python在实时嵌入式系统开发中有可能扮演的五个主要角色. 作用# 1设备调试和控制 在嵌入式软件开发过程中,开发人员常常需要分

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/sys

搜易贷、钱多多、礼德财富这3家p2p网站技术(皮肤架构性能安全)之比较

搜易贷.钱多多.礼德财富同属p2p网站,也同为自己研发的网站. 下面从美观设计,架构设计,性能安全设计来了解下 美观设计:一般网民从皮肤来观察,会觉得搜易贷优于后面2家,嗯,作为专业人士大多也会这么认为的,但专业人士还有这样的体会,毕竟老牌搜狐创新方面还是强些,更客观更符合人性. 架构设计:应用层3家都采用的是mvc的模式,应用后台也采用的是java,(抛开分布式高性能高可用性等架构设计外)比较而言,搜易贷更合理更科学,这里要说的是,搜易贷是搜狐技术团队的原班人马及搜狐长年积累的技术标准,因此在

嵌入汇编

本文介绍内核C语言程序中接触到的嵌入式汇编(内联汇编)语句.具有输入和输出参数的嵌入式汇编语句的基本格式为:asm("汇编语句" :输出寄存器 :输入寄存器 :会被修改的寄存器); 除第一行外,后面带冒号的行若不使用就都可以省略.其实asm是内联汇编语句的关键词:"汇编语句"是你写汇编指令的地方:"输出寄存器"表示这段嵌入汇编执行完之后那些寄存器用于存放输出数据.输入寄存器表示在开始执行汇编代码时,这里指定的寄存器会存放输入值."会被修

实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

/* getpid.c */ #include <unistd.h> #include <stdio.h> int main() { pid_t pid; pid = getpid(); printf("pid = %d \n",pid); return 0; } 上面是使用函数库API 运行结果: 下面是嵌入汇编代码: /* getpid_asm.c */ #include <unistd.h> #include <stdio.h> i

通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制

作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用API和gcc嵌入汇编的方式调用system_call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量打印在屏幕上,就必须调用printf,而printf这个函数内部就使用了write这个系统调用.操作系统之所以以system ca

[汇编] C语言中嵌入汇编

>_<" 下面是在C语言中嵌入汇编的例子,下面是三点要注意的~ 1.内联式汇编 2._asm关键字 3.并不是所有中断都能被支持 1 #include<iostream> 2 #include<windows.h> 3 #include<tchar.h> 4 using namespace std; 5 6 int _tmain(int argc, _TCHAR * argv[]) 7 { 8 9 int data1=0x000000; 10 in

在c语言中嵌入汇编语句,对于我来说相当难。

今天早上在csdn论坛上看到一个帖子http://topic.csdn.net/u/20120917/14/82f42e17-977a-4824-95bd-7b79db15d283.html:“C语言中嵌入汇编,究竟有何意义?” 其中看到一个例子是在c语言中插入一段汇编代码获取CPU的主频,制造商和型号的: //=====================================================================================/*