20201008组会

FRC控制器

  1. CS32F103C8T6的platformIO调试方法:

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"
  1. 添加了是否允许写入Channel的标记数组,防止系统初始化时自动更新Channel。

  2. 应用Arduino String库进行float转字符串的部分改用char *dtostrf(double val, signed char width, unsigned char prec, char *s),转换为char *形式

MicroPython

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编译为静态库。

  1. 尝试直接将MicroPython固件烧录进ESP32

使用的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-crossmpy-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

运行结果

avatar

  1. 将MicroPython编译为静态链接库

py/目录中包含了MicroPython的核心实现,包括编译器、运行时以及核心库等,将MicroPython编译为静态库主要从这里着手。需要修改Makefile,引入ar命令,将代码编译为.a文件。

观察目录中的py/mkenv.mkpy/mkrule.mkpy/py.mk这三个Makefile。前者为后者定义各种变量;后者提供了本工程的编译规则,github仓库下载的默认版本会在编译时在对应芯片的build/py/目录下为py/目录下的*.c文件生成对应的/build/py/*.o文件。py/py.mk用于辅助各个port的编译,指明了编译micropython核心库的各个目标文件路径。


本文章使用limfx的vsocde插件快速发布