原先一直在ARM架构下编写Cpython,先来说说ARM架构优缺点:
1、系统资源足够,虽然python的性能不怎样,但完全不用担心运行效率,愉快的编写逻辑就可以了
2、有现成的操作系统,所以一些比如联网,维护等工作不用操心
3、硬件成本高,IO不够充足,对硬件底层一些控制力不够好,这也是我想换平台的原因

ESP32这款芯片不多做介绍了,网上资料很多,主要是低功耗,低成本,还自带WIFI和蓝牙,完全符合我项目的要求。
支持mpy的ESP WROOM-32
micropython是一个固件(小系统),其语言是Python的精简版,经过优化可在微控制器和受限环境中运行,最初支持的是pyboard这个硬件平台,后来作者把这个固件不断更新,得以支持不同单片机芯片,例如STM32,ESP8266,ESP32等等

系统Bootload,ESP-IDF
连接UART,板子启动看到信息,首先是bootload,ESP-IDF信息,随即进入熟悉的python命令行模式

从cpy移植到mpy很轻松,语言基本不变,mpy支持的基本模块也挺多的,比如json之类,只要重写联网、IO控制这一块代码,这些mpy官方接口文档都有很好的说明,对照用就可以了,社区也有很多案例,这就是开源的好处,我只用了一天就把项目移植好了,用的开发工具是mu-editor,支持文件管理。但是接下的事情让我很痛苦。。。爆内存了

然后分析原因,ESP官方称设计RAM有520K,除去系统需要留给mpy可用的最多100多K了,实际项目运行后空余内存不足20K,但项目有个超大的Dict表用来存储采集的数据,运行到这里内存就不足了,一般python程序员不太会关心硬件内存问题,至于什么heap,stack区的区别,还有如何把常量编译后存储在flash rom上以节省内存,这些也都是我后面把项目改成arduino后才慢慢明白的

又花了一天时间尝试区优化mpy的程序,甚至于在运行时把采集数据直接写入本地文本,都以失败告终,这个项目用UART1这个口采集数据(UART0被系统占用作为调试用了,esp32有3个UART可用)在项目中使用了两组硬件定时器(1个从serial缓存收集数据,一个处理和存数数据),为什么要用machine Timer这个是因为速度快,之前python中直接使用Thread,while是不行的,本身现在mpy硬件都不支持多线程,很容易跑程序跑死。

继续查阅资料,MicroPython官方文档有说明,RAM优化方案 1、使用mpy-cross产生mpy文件 2、把程序编译到固件,都尝试后发现改善不多,所以只能暂时放弃,最近已经把项目移植到了arduino上,在同样的硬件平台,运行良好。

近期发现: 原来ESP32有一款带SPIRAM的(8M,16M...),原理就是扩展了外部RAM,而且MicroPython官方固件已经支持了SPIRAM的使用,具体型号是:ESP32WROVER 但手上没有这款芯片,等到了以后再做测试吧。

Last modification:March 15th, 2020 at 08:14 pm
如果觉得我的文章对你有用,打赏杯咖啡吧