移植micropython的最小工程到lpc5500微控制器(4) - 下载固件到芯片中

155 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

移植micropython的最小工程到lpc5500微控制器(4) - 下载固件到芯片中

使用Ozone配合JLink调试器下载程序到板子上

----- 中间隔了大约一周的时间 -----

build生成的firmware.elf文件,除了使用命令行版本的GDB工具之外,还可以使用同JLink同源的Ozone上位机工具下载程序到芯片上。这里使用Ozone的好处在于,可以在图形化界面中实现类似于IAR或者Keil的下载、单步调试等功能。更令人惊喜的是,由于未经优化的elf文件包含了一部分程序源代码的信息,在使用Ozone甚至可以实现源代码层面上的单步调试。另外Ozone目前已经是一个跨平台的工具,在Linux系统中也可以使用Linux版的Ozone。

这里简要说明使用Ozone下载micropython固件并调试的几个重点步骤。

Ozone支持elf文件、hex文件和bin文件,但由于hex和bin文件中只是二进制存储单元的内容,所以只能下载但不能进行源代码的单步调试。

选择build生成的micropython固件文件

ozone_elf_file.PNG

指定启动固件后开始的PC指针和栈顶地址

ozone_startup.PNG

这里使用默认的配置(如图)即可,但实际上我认为初始的PC指针值也可以选择“Read from Base Vector Table”。如果使用默认的“ELF Entry Point”,我严重怀疑同ld文件中的ENTRY命令有关:

/* Entry Point */
ENTRY(Reset_Handler)

最后导入elf文件成功之后的界面就是这个样子:

ozone_load_firmware.PNG

轻戳左上角的绿色小按钮,下载并开始调试。之后有一个下载的进度条。下载成功之后,可以使用相应的按钮进行单步调试,观察代码的执行情况。

ozone_debug.PNG

全速运行后,在串口终端中同板子上运行的micropython进行交互,测试工作正常,移植成功。

micropython_terminal.PNG

关于lpc55s69芯片的一些问题及解决方案

hardfault的问题,降低频率(到96MHz)可以正常运行。之前运行在150MHz主频的时候,总是莫名起来在执行strcmp函数的时候出现hardfault。这个问题卡住我一周,差点让我放弃继续调试。

软件浮点库和硬件浮点库的问题,需要选择合适的。实际上软件库和硬件库都可以使用。之前在没发现100M主频导致hardfault的情况是,总是以为是没有找到特定可用的浮点支持库导致的。但后来排除了hardfault的问题之后,用软件库和硬件库都可以正常工作,区别仅在于其原本设计的那样,是否启用硬件的FPU加速浮点计算。

后记

那个mpy文件到底是干啥用的,还是没有深究,但是不包含就编译不过,所以暂时还得留着它。

----- 2021-02-09 -----

撰写本文的中间发生了一些事情,自己在写后续几个部分的时候耽搁了不少时间,导致一开始列下来的小标题在后来都忘记了当时的构思,所以记录得比较粗糙。不过目前至少把完整的过程和能想到的点都记录下来了。后续进一步整理素材准备成文的时候,会重新对全文进行构思,届时希望能找回最初的灵感。

----- 2022-07-17 -----

mpy文件是使用MicroPython交叉编译器从Python源文件编译成Python的字节码文件,mpy文件可以被编译进MicroPython的固件中。在v1.19.1中,对mpy文件的字节码进行了进一步的优化。

在后来的一个阶段,我曾经成功把mpy的编译过程精简掉。但再后来,为了支持LFS文件系统,我把这个功能加了回来。支持将MicroPython的文件系统加载到spiflash中,加载文件系统的过程,就是通过Python编写,经过mpy-cross编译后,集成到固件中的。