何为负面清单
我喜欢Python,也在实际工程中使用。Python用于Web和数据分析已经积累了大量经验。但是在嵌入式领域依然是比较新的。MicroPython作为主流的嵌入式Python,我们必须要明确它的边界和对策,否则,许多朋友会步入一些误区。
MicroPython ESP8266 Port 问题
除了最初的STM32F4的PyBoard,ESP8266版本可能是最普及的MicroPython硬件,甚至多过BBC的MicroBit。但是ESP8266的廉价却有着对应的缺陷:
- GPIO资源过少,因为它原来只是一个Modem;
- 缺乏JTAG接口,所以调试上会存在更多困难;
- ESP8266与PyBoard通过USB MSD支持文件系统不同,对外接口只有串口和WiFi,固件下载存在一定难度。
ESP8266内部有Bootcode,而用户固件放置在外部Flash中。应该说ESP8266几乎不会变砖。但是MicroPython需要二级Boot。
- Bootcode,启动MicroPython运行时固件;
- MicroPython,通过WebREPL,串口来加载用户脚本。
用户脚本下载途径
- 通过REPL的Ctrl-A/Ctrl-E模式批量传输脚本,并保存在文件系统中;
- 通过WebREPL,提供websocket协议来实现文件传输;
- 通过MicroPython File Uploader.exe专门工具实现ASCII文件传输(闭源);
- 通过uPyLoader工具和base64编码加载固件。
- 通过uPyCraft工具加载固件。
然而,这三种方式都有对应的问题:
- Ctrl-A/Ctrl-E不支持二进制文件传输,且"\r\n"等字符串会被直接替换成回车和换行符;
- WebREPL经常无故启动不了;
- File Uploader闭源,经常宕机,且不支持二进制文件;
- uPyLoader比较慢。
- uPyCraft (未测试)。
基于串口的脚本下载
嵌入式系统中,串口是普遍存在的,即使没有硬件串口,也可以使用软件模拟串口。所以MicroPython虽然拥有五花八门各种传输方式。但是我个人觉得应该将某种终端软件普遍支持的文件传输方式固化在MicroPython标准库中。比如:Kermit/X/Y/Z-Modem或者基于网络的FTP/SCP方式。
当然实现方式越简单越好。其实128B字符串配合ACK/NACK确认的X-Modem实现起来非常简单,且占用资源很少,此外利用base64来传输二进制文件。整体流程是:
b2a_base64(local_file),转换为ASCII进行传输;
a2b_base64(remote_file),转换为BIN存储到ESP闪存中。
我参考了uPyLoader的实现方式,准备设计一些简单的命令行操作。和uPyLoader采用自定义协议不同,我想使用Terminal软件已经支持的协议来实现。
由于这种方式需要预先在用户脚本空间先下载一个upload.py脚本。可以通过REPL的Ctrl-E方式先行下载(脚本不能太大,也不能有回车和换行符)。当然也可以在编译固件时直接编译进去。
既然要预先编译脚本,不如将常见的操作以模块形式一起加载到用户脚本空间。届时,只需要在REPL中调用一些函数,既可以实现操作系统的常见操作。
>>> from helper import ls, cat
>>> ls()
['download.py', 'webrepl_cfg.py', 'simple_web_server.py', 'upload.py', 'helper.py', 'libs']
>>> cat('webrepl_cfg.py')
PASS = 'allan'
网友评论