MicroPython 十六进制文件¶
构建 MicroPython 时,编译器会生成一个包含 MicroPython 固件的 Intel Hex文件。然后可以将其他数据添加到此文件中,以包含有关 MicroPython 版本或启动时执行的 Python 代码的信息。
使用的一般内存布局是:
0x00000000
: MicroPython 固件启动 - 高达 248 KB0x0003e000
: 附加脚本的开始(可选) - 最多 8 Kbs0x100010c0
: UICR 客户[16] 注册,MicroPython 信息的开始 - 28 字节
笔记
如果您追加任何数据或修改 Intel Hex 文件,请确保数据存储的地址以递增顺序进行。如果有地址向后跳转,DAPLink 将无法刷新文件。
UICR 格式(micro:bit V1)¶
用户信息配置寄存器 (UICR) 是可用于存储用户特定设置的非易失性存储器区域。前 128 字节是保留的,但我们可以使用其他 128 字节来存储任意数据。
MicroPython 从 UICR 客户 [16] 寄存器开始以小端存储以下信息:
0x100010c0
: 具有魔法值的 4 字节整数0x17eeb07c
0x100010c4
: 带值的 4 字节整数0xffffffff
0x100010c8
: 带值的 4 字节整数0x0000000a
(闪存页面大小的日志基数为 2,为 1024 字节)0x100010ca
: 带值的 2 字节整数0x0000
(固件的起始页)0x100010cc
:2 字节整数存储固件使用的页数0x100010d0
: 带值的 4 字节整数0xffffffff
0x100010d4
: 4 字节整数,版本字符串在固件中的地址0x100010d8
: 带值的 4 字节整数0x00000000
布局表(micro:bit V2)¶
为 micro:bit V2 构建 MicroPython 时,闪存布局表会附加到 hex 文件。
布局表是一个 16 字节条目的序列。最后一个条目包含标题(包括幻数)并与页面末尾对齐,这样布局表的最后一个字节就是它所在页面的最后一个字节。这样可以快速轻松地搜索为了。
布局表具有以下格式。所有整数值都是无符号的并存储小端。
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e
ID HT REG_PAGE REG_LEN HASH_DATA
(additional regions)
...
MAGIC1 VERSION TABLE_LEN NUM_REG PSIZE_LOG2 MAGIC2
The values are:
ID - 1 byte - region id for this entry, defined by the region
HT - 1 byte - hash type of the region hash data
REG_PAGE - 2 bytes - starting page number of the region
REG_LEN - 4 bytes - length in bytes of the region
HASH_DATA - 8 bytes - data for the hash of this region
HT=0: hash data is empty
HT=1: hash data contains 8 bytes of verbatim data
HT=2: hash data contains a 4-byte pointer to a string
MAGIC1 - 4 bytes - 0x597F30FE
VERSION - 2 bytes - table version (currently 1)
TABLE_LEN - 2 bytes - length in bytes of the table excluding this header row
NUM_REG - 2 bytes - number of regions
PSIZE_LOG2 - 2 bytes - native page size of the flash, log-2
MAGIC2 - 4 bytes - 0xC1B1D79D
此布局表用于将 MicroPython 的版本和当前内存布局传达给蓝牙客户端,并启用部分刷新 (仅更新 Python 脚本,并将 MicroPython 的现有版本保留在闪存中)。
创建firmware.hex 文件的步骤¶
micro:bit V1¶
这适用于 micro:bit V1 的 MicroPython,其来源可以在这里找到:bbcmicrobit/micropython.
yotta 工具用于构建 MicroPython,但在此之前,Makefile 必须生成额外的文件以准备构建,然后将额外的数据添加到 hex 文件中。
运行命令执行以下步骤: make all
- 该
tools/makeversionhdr.py
脚本microbitversion.h
使用包含构建信息的宏创建文件 - Yotta 构建源代码并使用固件创建一个裸十六进制文件
- 该
tools/adduicr.py
脚本将 UICR 添加到裸十六进制 - 最终的十六进制文件放在
build/firmware.hex
- 用户可以选择使用
tools/makecombinedhex.py
(或其他工具)附加脚本
micro:bit V2¶
这适用于 micro:bit V2 的 MicroPython,其来源可以在这里找到:microbit-foundation/micropython-microbit-v2.
这是 MicroPython 到 micro:bit 的一个端口,它使用 CODAL 作为底层目标平台。
运行make
命令执行以下步骤:
- 创建构建输出目录,运行 cmake,并确保代码库存在(通过 cmake)
- 构建
libmicropython.a
(来自 中的源代码src/codal_port/
)和 CODAL 应用程序(来自 中的源代码src/codal_app/
)。 - 运行
addlayouttable.py
以将布局表添加到 .hex 文件中 -
MICROBIT.hex
在src/
目录中创建 microbit-micropython 固件,可以将其复制到 micro:bit。
包括用户脚本¶
本节适用于 micro:bit V1 和 V2。
用户脚本存储在 MicroPython 文件系统中,如果main.py
存在脚本,它会在 MicroPython 启动时运行。还可以从 main.py
文件或 REPL 中包含和执行其他 Python 脚本。
在Python编辑器 使用 microbit-fs创建文件系统,它包括在HEX文件。Python 编辑器必须将文件系统添加到 MicroPython V1 和 V2 的 HEX 文件中,然后将两者组合成一个通用 HEX 文件,以确保与两种硬件变体兼容。
附加脚本格式(已弃用)¶
这种将脚本附加到 MicroPython 末尾的方法最初用于 micro:bit V1,但不再使用。Python 文件现在存储在
文件系统中并且 main.py
是程序入口点。
MicroPython 检查地址处的前 2 个字节0x0003e000
是否有魔法字符串,以指示是否有附加脚本。如果找到魔法字符串,它将自动执行存储在那里的 Python 代码,除非main.py
MicroPython 文件系统中存储了一个文件。
0x0003e000
: 2 字节“MP”0x0003e002
: 2 字节,附加脚本的长度(以字节为单位)的小端整数(不包括这个 4 字节的标头)0x0003e004
: 以字节形式存储的脚本,供 MicroPython 使用 utf-8 解码。