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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于MicroPython 如何嵌入汇编-悦德财富的主要内容,如果未能解决你的问题,请参考以下文章

调查显示前3大编程语言:JavaScript, Python, Java-悦德财富

如何在Micropython汇编语言中测试浮点寄存器的符号

如何在C语言中嵌入汇编?

如何把汇编程序嵌入到C语言中

MicroPython内核开发笔记:书内嵌入实验任务

如何在C或C++代码中嵌入ARM汇编代码