在 platformio.ini中添加以下内容,直接对openOCD调试服务器设置正确的flag
debug_server =
C:\Users\Maxi\.platformio\packages\tool-openocd\bin\openocd.exe
-s C:\Users\Maxi\.platformio\packages\tool-openocd\scripts
-f interface\stlink.cfg
-c "transport select hla_swd"
-c "set CPUTAPID 0x2ba01477"
-f target\stm32f1x.cfg
-c "reset_config none"
添加了是否允许写入Channel的标记数组,防止系统初始化时自动更新Channel。
应用Arduino String库进行float转字符串的部分改用char *dtostrf(double val, signed char width, unsigned char prec, char *s),转换为char *形式
MicroPython依赖Byte Code的执行,编译阶段将.py文件转换为.mpy文件,再通过mpy-tool.py生成Byte Code,由内置虚拟机运行,与Java类似。编译时应用了字符串驻留,多次出现的字符串仅存储一次,驻留字符串称为qstr(unique string)。Byte Code执行时依赖虚拟机入口表VM entry table找到对应模块的入口,从而找到对应的Function binary code,其中所有Function通过Dictionary形式存储。每个Dictionary拥有自己的QSTR作为key,包括builtin的QSTR和用户扩展的QSTR。通过哈希值和长度进行比较QSTR来保证效率。
主要任务是将MicroPython编译为静态库。
使用的Linux发行版为WSL1下的Ubuntu-18.04 LTS
首先下载以下软件包用于编译ESP-IDF
sudo apt-get install git wget flex bison gperf python python-pip python-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util
设置Python3为默认Python版本
sudo apt-get install python3 python3-pip python3-setuptools
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
克隆ESP-IDF代码仓库。ESP-IDF是包含ESP32 API和用于操作工具链的脚本的开发框架
mkdir ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
export ESPIDF=$HOME/esp/esp-idf
由于MicroPython仅支持特定版本的ESP-IDF,需要切换到特定版本对应的分支。
cd ports/esp32
make ESPIDF= #将显示支持版本的哈希值
cd $ESPIDF
git checkout <Current supported ESP-IDF commit hash>
git submodule update --init --recursive
安装Python依赖包
cd esp-idf
pip3 install -r requirements.txt
使用IDF脚本安装编译工具链
./install.sh
设置环境变量
vim ~/.bash_profile
# 添加下一行指令
# export IDF_PATH=$HOME/esp/esp-idf
source ~/.bash_profile
进入micropython/port/esp32
cd micropython/port/esp32
source $ESPIDF/export.sh
由于MicroPython的esp32工程没有CMake,因此不支持idf.py,这里使用传统GNU Make。在Makefile中修改型号、波特率、端口等信息。WSL1中端口/dev/ttySX对应Windows设备管理器中的COMX。
...
ESPIDF = $(IDF_PATH)
PORT ?= /dev/ttyS6
BAUD ?= 115200
FLASH_MODE ?= dio
FLASH_FREQ ?= 40m
FLASH_SIZE ?= 4MB
...
然后编译mpy-cross,mpy-cross用于将标准Python脚本编译为.mpy文件
cd mpy-cross
make mpy-cross
编译ESP32固件
cd ports/esp32
make submodules
make
在build文件夹中将生成firmware.bin文件。
接下来将固件烧录进ESP32,如果为第一次烧录需要首先将flash清空
make erase
然后烧录固件
make deploy
之后使用串口调试工具即可进入MicroPython的REPL
picocom -b 115200 /dev/ttySX
运行结果

py/目录中包含了MicroPython的核心实现,包括编译器、运行时以及核心库等,将MicroPython编译为静态库主要从这里着手。需要修改Makefile,引入ar命令,将代码编译为.a文件。
观察目录中的py/mkenv.mk、py/mkrule.mk和py/py.mk这三个Makefile。前者为后者定义各种变量;后者提供了本工程的编译规则,github仓库下载的默认版本会在编译时在对应芯片的build/py/目录下为py/目录下的*.c文件生成对应的/build/py/*.o文件。py/py.mk用于辅助各个port的编译,指明了编译micropython核心库的各个目标文件路径。
本文章使用limfx的vsocde插件快速发布