MicroPython 包涵可内联的汇编,允许用户使用汇编语言作为 Python 的子程序,且你可以像正常使用函数般使用它们。
1、返回值
内联汇编函数用特定的函数装饰器标示。我们从最简单的例子下手: - @micropython.asm_thumb
- def fun():
- movw(r0, 42)
复制代码你可以在脚本或是解释器里边使用该函数。该函数没有任何参数且返回数值42 。r0 是一个寄存器,其中的数值在函数返回值返回时被更改。MicroPython 一直将 r0视为一个整数并将其作为整数变量供使用者调用。 如果使用了命令 print(fun( )) 将能看到数值42被打印出来。
2、汇编语言基础
稍微复杂一些些,我们尝试点亮一盏灯: - @micropython.asm_thumb
- def led_on():
- movwt(r0, stm.GPIOA)
- movw(r1, 1 << 13)
- strh(r1, [r0, stm.GPIO_BSRRL])
复制代码上述代码使用了一些新的概念3、接受参数
内联汇编语言最多可以接收四个参数。一旦被使用,必须为 r0,r1,r2,r3 的寄存器或其里边的调用内容。以下是使用了这些参数的函数: - @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 里边。 - @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)
复制代码 |