利用MicroPython原始REPL模式在线代码更新

利用MicroPython原始REPL模式在线代码更新MicroPython交互式解释器的原始模式(原始REPL)并不常用,其本意是用于对设备进行在线更新程序。实质上其与粘贴模式相似,只是关闭了字符的回显(即不像粘贴模式下可以马上直观地看到你所粘贴的代码),并且能够进行代码流控。

大家好,欢迎来到IT知识分享网。

MicroPython交互式解释器的原始模式(原始REPL)并不常用,其本意是用于对设备进行在线更新程序。实质上其与粘贴模式相似,只是关闭了字符的回显(即不像粘贴模式下可以马上直观地看到你所粘贴的代码),并且能够进行代码流控。

REPL下输入Ctrl+A可进入原始模式,之后便可在该模式下向设备发送python代码,发送完毕后再输入Ctrl+D,设备便会首先回复字符串”OK”,然后编译和执行所接收到的python代码。之后,设备会依代码执行情况返回相应输出结果或错误信息。最后,输入Ctrl+B会退出原始模式而返回REPL友好的常规工作模式。

原始粘贴(raw-paste)模式是原始REPL下的另一种工作模式,其包含了流控机制,可以对代码边接收边编译,这对于设备高速下载代码更加可靠,同时也更节省RAM资源(相较于原始模式,其无需在编译之前保留代码的完整副本)。

(注,本篇如下提到的类似b”\x05A\x01″字样为Python中的bytes类对象实例,其中,\x05即十六进制0x05,其在bytes中以\x为开头,A即为ASCII码的字符A。这属于Python中的常规表示方式,类似均可按这种规则理解)

原始粘贴模式使用如下的流控协议:

1. 输入Ctrl+A进入原始REPL模式。

2. 向设备写入如下3字节内容:b”\x05A\x01″ (实际对应Ctrl+E,字符“A”和Ctrl+A)。

3. 从设备读取2字节数据以确定其是否进入了原始粘贴模式:

  • 若其返回b”R\x00″,表示设备虽然正确理解了此命令但本身不支持该模式;
  • 若其返回b”R\x01″,表示设备确实能够支持并且已经按照命令进入了该模式;
  • 另外,其还可能返回b”ra”,表示设备不支持原始粘贴模式,该情况下还附带有进一步提示信息:b”w REPL; CTRL-B to exit\r\n>”返回,你只需读取后忽略掉即可。
  • 4. 此时,如果设备已经进入原始粘贴模式则继续下面步骤,否则其会回退到原始REPL模式。

    5. 从设备读取两字节数据,该数据为流控协议中的“窗口宽度自增值”(window-size-increment),需将其转换为16位无符号小端整数值来理解。并且应该将下面用到的“剩余窗口宽度值”(remaining-window-size)变量初始化设置为该值。

    6. 向设备写入程序代码:

  • 若有代码需要发送,最多可发送“剩余窗口宽度值”所表示的字节数。随着发送过程的进行,随之减小“剩余窗口宽度值”变量值。
  • 若“剩余窗口宽度值”已经减小到零,或者发送完一个代码段后需要从设备读取1字节数据以决定后续操作,即可读取。该字节为b”\x01″时,可以继续进行代码传输,按照第5步所述将“剩余窗口宽度值”变量设置为“窗口宽度自增值”所示值。该字节为b”\x04″时,表示设备希望结束代码传输过程,此时应该向设备写入b”\x04″,并且之后不应再给设备发送代码。(注意,只要“剩余窗口宽度值”还大于零,设备会持续消费所收到的数据,而没有必要马上就按照此处所述在发送完一个代码段后立刻读取1字节数据并进行相应动作)
  • 7. 所有代码均写入设备后,接着写入b”\x04″以指示代码传输结束。

    8. 从设备读取数据,直到接收到b”\x04″。此时,设备已经接收并编译了所发送的所有代码,正在执行。

    9. 设备输出所执行代码的任何结果信息。再之后,b”\x04″会首先被输出,接着为任何未被捕获的异常,再接着为b”\x04″,最后其会返回原始REPL模式然后输出b”>”。

    按照该协议,若在REPL常规模式下输入如下代码:

    b"\x01\x05A\x01print(123)\x04" # \x01 对应Ctrl+A \x05对应Ctrl+E

    则该设备会回应大致如下内容:

    b"\r\nraw REPL; CTRL-B to exit\r\n>R\x01\x80\x00\x01\x04123\r\n\x04\x04>"

    而REPL的原始粘贴模式正确使用方法大致分解如下:

    # Step 1: 进入原始REPL模式 write: b"\x01" read: b"\r\nraw REPL; CTRL-B to exit\r\n>" # Step 2-5: 进入原始粘贴模式 write: b"\x05A\x01" # R\x01表示进入了该模式 # \x80\x00 表示了当前"窗口宽度自增值",十进制表示为128 # \x01表示可以继续传输代码 read: b"R\x01\x80\x00\x01" # Step 6-8: 写入程序代码 write: b"print(123)\x04" read: b"\x04" # Step 9: 代码执行并读取结果 read: b"123\r\n\x04\x04>"

    在本例中,“窗口宽度自增值”为128,从开始到现在总共有两个窗口宽度的数据可用,一个为从开始到该”窗口宽度自增值”所示值,一个为从显式发送b”\x01″开始到最后。因此,这意味着在等待或检查更多后续传入的带流控代码数据之前,最多可以写入256字节数据。

    MicroPython源码树下tools/pyboard.py程序就使用了原始REPL模式,包括原始粘贴模式,来执行基于MicroPython运行的python代码。

    注:获取及时更新,点击关注吧…

    免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/86550.html

    (0)
    上一篇 2024-10-03 22:15
    下一篇 2024-10-04 17:45

    相关推荐

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    关注微信