设为首页 收藏本站
查看: 1219|回复: 0

[软件发布] MicroPython 如何嵌入汇编

[复制链接]

尚未签到

发表于 2016-10-27 10:57:14 | 显示全部楼层 |阅读模式
欢迎加入运维网交流群:263444886   DSC0000.png
                  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])  上述代码使用了一些新的概念:
  . 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 的寄存器或其里边的调用内容。以下是使用了这些参数的函数:
    @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)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-291997-1-1.html 上篇帖子: JPress 0.3.0 发布,WordPress 的 Java 代替版 下篇帖子: Bokeh 0.12.2rc3 发布,Python 交互式可视化库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表