将非.py
文件打包进固件并调用(仅适用于乐鑫 ESP
系列芯片)。
MicroPython
编译固件过程中可以自动编译打包用户添加的.py
文件,对于其它类型的用户文件就无能为力了。
这里使用 littlefs for Python 工具,将文件写入littlefs v2
分区并生成一个分区文件,再把这个分区文件写入已有固件中实现文件打包。
使用此方法打包的文件使用上与用户自行上传的文件无异。
注:以下提及的分区表均是以
ESP32
系列的partitions-4MiB.csv
文件为例。
先观察一下分区表文件内容:
Name | Type | SubType | Offset | Size | Flags |
---|---|---|---|---|---|
nvs | data | nvs | 0x9000 | 0x6000 | |
phy_init | data | phy | 0xf000 | 0x1000 | |
factory | app | factory | 0x10000 | 0x1F0000 | |
vfs | data | fat | 0x200000 | 0x200000 |
其中:
factory
:为MicroPython
程序(app)分区vfs
:为用户分区,用于保存用户上传的代码文件这两个分区之间已经没有可用空间了(参考提交 e1a84a),要打包文件可以选择以下两种方法。
先说缺点,那就是固件文件体积会增大,最终生成的固件大小为:
vfs_offset = 0x200000
vfs_size = 0x200000
total_size = vfs_offset + vfs_size
# = 4194304 bytes
# = 4 MiB
也就是分区表文件名中注明的文件大小。
注:由于
ESP32
等芯片的固件烧录起始地址为0x1000
,所以最终生成的固件大小为:
total_size = vfs_offset + vfs_size - 0x1000
具体操作方法如下:
修改config.py
文件内容,将vfs_offset
和vfs_size
的值分别填入对应位置,例如:
class Partition(object):
# 根据实际情况设置
IS_ESP32_ESP32S2 = False
OFFSET = 0x200_000 # 偏移地址
SIZE = 0x200_000 # 分区大小
参考 如何打包文件 章节进行后续操作。
这里说的复杂不仅是指操作步骤较多,而且还要根据一些规则进行计算,最后也是最重要的,需要自行搭建MicroPython
开发环境编译固件。
之前找到一个可以修改固件分区表的软件 mp-image-tool-esp32,如果可以修改的话就不需要自行编译固件了。
简单来说,这个方法的操作流程如下:
vfs
分区之前(或之后)增加一个资源分区vfs
分区大小在开始具体操作之前,需要先计算出资源分区占用的存储空间大小,以/example/files
文件夹下的文件为例,计算方法如下:
block_size = 4096 # file system block size
total_size = 195427 # 9 files, 2 folders
block_count = total_size // block_size + 10 # at least 10 blocks
image_size = block_count * block_size
# = 233472 = 0x39000
其中:
block_size
:为块大小,固定值4096
,可以使用 os.statvfs 查看,分区大小必须为块大小的整倍数
total_size
:为文件夹下文件的总大小
block_count
:为分区总块数,因为分区中还要保存文件属性等信息,所以块总数要在原有基础上至少增补 10 个大小
image_size
:为资源分区实际大小,这个十六进制数0x39000
后边需要用到
接下来就可以开始修改分区表了,这里只展示需要修改的部分。
这是原分区表
Name | Type | SubType | Offset | Size | Flags |
---|---|---|---|---|---|
vfs | data | fat | 0x200000 | 0x200000 |
这是修改后的分区,在vfs
之前增加了一个resource
分区。
Name | Type | SubType | Offset | Size | Flags |
---|---|---|---|---|---|
resource | data | fat | 0x200000 | 0x39000 | |
vfs | data | fat | 0x239000 | 0x1c7000 |
其中:
resource_offset
:保留原分区表vfs_offset
的数值resource_size
:填写上边经过计算得到的image_size
的数值vfs_offset
:填写resource_offset + resource_size
的数值vfs_size
:填写原分区表vfs_offset + vfs_offset
- vfs_offset
的数值分区表文件修改完成后,根据自己的需求编译固件并得到固件文件,之后参考 不修改分区表(简单) 章节进行后续操作,特别注意一点,修改config.py
文件内容时,要将resource_offset
和resource_size
的值分别填入对应位置。
要将/example/files/
文件夹中的所有文件打包进固件文件中,可以使用如下命令:
# 查看使用说明
$ python3 combine_files.py
# Usage:
# python3 combine_files.py <firmware_file> <user_file_folder>
# 使用 不修改分区表 方法,按需修改 config.py 文件
# esp32c3_firmware_origin.bin 可视为从官方下载的固件文件
$ python3 combine_files.py ./example/esp32c3_firmware_origin.bin ./example/files/
# 或
# 使用 修改分区表 方法,按需修改 config.py 文件
# esp32c3_firmware_fixed.bin 为修改过分区表并自行编译的固件文件
$ python3 combine_files.py ./example/esp32c3_firmware_fixed.bin ./example/files/
要读取资源文件,只需要将资源分区挂载到系统中即可:
注:使用 不修改分区表(简单) 方法打包的固件不需要挂载资源分区。
import esp32, os
res = esp32.Partition.find(esp32.Partition.TYPE_DATA, label='resource')
if res:
os.mount(res[0], '/res')
开发板使用repl
模式运行main.py
文件:
$ ab --repl
# 选择正确的端口,使用快捷键 ctrl + r 运行 main.py 文件
ab 工具使用方法见 AMPY Batch Tool 项目说明文档。
演示过程中将在repl
中逐一显示以下内容:
mua.pbm
图片chushibiao.txt
文本内容chushibiao.bin
字库信息完整输出内容如下:
>>> Run local file
[1] main.py
[3] config.py
[4] combine_files.py
Choose a file: 1
Press enter to preview bitmap...
.....................................................................................
................@@@..................................................................
..........@@@@@@@@@@@@@..............................................................
.......@@@@@@@@@@@@@@@@@@............................................................
......@@@@@@@@@@@@@@@@@@@@...........................................................
.....@@@@@@@@@@@@@@@@@@@@@@..........................................................
....@@@@@@@@@@@@@@..@@@@@@@@.........................................................
...@@@@@@....@@.......@@@@@@@........................................................
..@@@@@@...............@@@@@@........................................................
..@@@@@................@@@@@@........................................................
..@@@@@................@@@@@@@.......................................................
..@@@@@.................@@@@@@.......................................................
.@@@@@@................@@@@@@@.......................................................
.@@@@@@................@@@@@@@.......................................................
.@@@@@@@...............@@@@@@..............@@@@@.....................................
.@@@@@@@@.............@@@@@@@............@@@@@@@.....................................
..@@@@@@@@...........@@@@@@@@...........@@@@@@@@@....................................
..@@@@@@@@@.........@@@@@@@@@..........@@@@@@@@@@@....................@@.............
..@@@@@@@@@@@.....@@@@@@@@@@..........@@@@@@.......................@@@@@@@...........
...@@@@@@@@@@@...@@@@@@@@@@@..........@@.........................@@@@@@@@@...........
....@@@@@@@@@@@@@@@@@@@@@@@................@@@@@@@@@@@@@@.......@@@@@@@@@@@..........
.....@@@@@@@@@@@@@@@@@@@@@..............@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@@@..........
.......@@@@@@@@@@@@@@@@..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........
..........@@@@@@@@@@...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........
................@@@@..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........
.................@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........
...................@...........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........
...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........
..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........
.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........
............................@@@@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@@.
............................@@@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@@.
...........................@@@......@@@@@@@@@@@@@@@@@@@@@@@@@@....@@@@@@@@@@@.....@@.
...........................@@........@@@@@@@@@@@@@@@@@@@@@@@@......@@@@@@@@@@@@@@@@@.
...........................@@........@@@@@@@@@@@@@@@@@@@@@@@@......@@@@@@@@@@@@@@@@@.
..........................@@@.......@@@@@@.@@..@@@@@@@@@@@@@.......@@@@@@@@@@@@@@@@@.
..........................@@@.......@@@@@@.......@@..@@@@@@@........@@@@@@@@@@@@@@@..
..........................@@@.......@@@@@@...........@@@@@@@.......@@@@@@@@@@@@@@@@..
..........................@@@@.....@@@@@@@..........@@@@@@@@.......@@@@@@@@@@@@@@@@..
..........................@@@@@@@@@@@@@@@@@.........@@@@@@@@.......@@@@@@@@@@@@@@@@..
..........................@@.@@@.@@.@@@@@@@.........@@@@@@@@@......@@@@@@@@@@@@@@@@..
..........................@@.@@..@@.@@@@@@@.........@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@..
..........................@@.@@.@@..@@@@@@@@.......@@@@@@@@.@@.@@@@@@@@@@@@@@@@@@@@..
..........................@@@@@.@@.@@@@@@@@@@......@@@@@@@..@@.@@..@@@@@@@@@@@@@@@@..
...........................@@@@@@@.@@@@@@@@@@@@..@@@@@@@@@.@@..@@..@@@@@@@@@@@@@@@...
...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@.@@@..@@@@@@@@@@@@@@@...
............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@...
............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...
.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....
.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....
..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....
...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....
................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....
.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....
..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....
...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......
....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......
.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@......
...........................................@@@@@@@@@@@@@@@@@@@@@@@@@..@@@....@@......
.......................................@.........@@@@@@@@@@@.@@@......@@.............
.......................................@@....................@@.......@@.............
.............................................................@@.......@@.............
.....................................................................................
.....................................................................................
Press enter to preview text...
出师表
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄
,引喻失义,以塞忠谏之路也。
宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必得裨补阙漏,有所广益。
将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计
日而待也。
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有
一年矣。
先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所
以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
今当远离,临表涕零,不知所言。
Press enter to preview fontlib...
HZK Info: /res/chushibiao.bin
file size : 14350
font height : 16
data size : 32
scan mode : 1 (Vertical)
byte order : 0 (LSB)
format : 0 (MONO_VLSB)
characters : 427
Press enter to preview chars data...
半: b'\x00DHP@\xfe@PHD\x00\x00\x00\x00\x00\x00\x02\x02\x02\x02\x02\x1f\x02\x02\x02\x02\x02\x00\x00\x00\x00\x00'
中: b'\x00\xf8\x88\x88\x88\xfe\x88\x88\x88\x88\xf8\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1f\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00'
而: b'\x02\xf2\x12\x12\xf2\x1a\x16\xf2\x12\x12\xf2\x02\x00\x00\x00\x00\x00\x1f\x00\x00\x0f\x00\x00\x0f\x00\x10\x1f\x00\x00\x00\x00\x00'
表: b'@DTT\xd4~\xd4TTTD@\x00\x00\x00\x00\x04\x04\x02\x1f\x10\x08\x01\x06\x04\x19\x08\x00\x00\x00\x00\x00'
业: b' @\x80\x00\xfe\x00\x00\xfe\x00\xc00\x00\x00\x00\x00\x00\x10\x10\x11\x10\x1f\x10\x10\x1f\x11\x10\x10\x10\x00\x00\x00\x00'
未: b'@HHHH\xfeHHHH@\x00\x00\x00\x00\x00\x08\x08\x04\x02\x01\x1f\x01\x02\x04\x08\x08\x00\x00\x00\x00\x00'
道: b'@B\xcc\x00\x04\xf4V\\TV\xf4\x04\x00\x00\x00\x00\x10\x08\x07\x08\x10\x17\x15\x15\x15\x15\x17\x10\x00\x00\x00\x00'
出: b'\x00\x00< \xfe <\x00\x00\x00\x00\x00\x00\x00\x1f\x08\x08\x08\x0f\x08\x08\x08\x08\x1f\x00\x00\x00\x00\x00'
天: b' """\xa2~\xa2"""" \x00\x00\x00\x00\x10\x10\x08\x06\x01\x00\x01\x02\x04\x08\x10\x10\x00\x00\x00\x00'
帝: b'\xe4$\xa4\xac\xb4\xe6\xb4\xac\xa4$\xe4\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x1f\x00\x08\x0f\x00\x00\x00\x00\x00\x00\x00'
: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
师: b'\x00\xf8\x00\xfe\x00\xf4\x14\x14\xfc\x14\x14\xf4\x00\x00\x00\x00\x10\x13\x08\x07\x00\x07\x00\x00\x1f\x00\x04\x07\x00\x00\x00\x00'
下: b'\x02\x02\x02\x02\x02\xfe\x12"B\xc2\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
先: b'\x00PHN\xc8H~\xc8HH@@\x00\x00\x00\x00\x10\x10\x08\x06\x01\x00\x00\x0f\x10\x10\x10\x1c\x00\x00\x00\x00'
殂: b'\x84t\x9c\x14\xf6\x04\xfe"""\xfe\x00\x00\x00\x00\x00\x10\x08\x04\x03\x10\x10\x1f\x11\x11\x11\x1f\x10\x00\x00\x00\x00'
,: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
创: b'@ \xf0(&$\xe8\x10\x00\xf8\x00\xfe\x00\x00\x00\x00\x00\x00\x0f\x10\x11\x12\x11\x1c\x00\x03\x10\x1f\x00\x00\x00\x00'
崩: b'\x00\x00\xee\xa8\xa8\xe8\x08\xee\xa8\xa8\xa8\xee\x00\x00\x00\x00\x10\x08\x07\x02\x12\x1f\x10\x0f\x02\x02\x12\x1f\x00\x00\x00\x00'
今: b'@@ \x10(F\x08\x10 @@\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x11\r\x03\x01\x00\x00\x00\x00\x00\x00\x00'
Press enter to preview chars...
................ ................ ................ ................ ................ ................ ................
.....@.......... ...@............ .....@.......... ................ ................ ...@..@......... .....@..........
..@..@...@...... ...@.@@@@@@@.... .@@@@@@@@@@..... ................ ................ ...@..@......... @@@@@@@@@@@.....
..@..@...@...... .@.@....@....... .....@.......... ................ ................ ..@@@@@@@@...... ...@...@........
..@..@...@...... .@.@.@@@@@@@.... ..@@@@@@@@...... ................ ................ .@....@......... ....@.@.........
..@@@@@@@@...... .@.@.@..@..@.... .....@.......... ................ ................ ......@......... @@@@@@@@@@@.....
.....@.......... .@.@.@..@..@.... @@@@@@@@@@@@.... ................ ................ .@@@@@@@@@@@.... @....@....@.....
.....@.......... .@.@.@..@..@.... ....@.@......... ................ ................ ....@..@........ @.@@@@@@@.@.....
.@...@....@..... .@.@.@..@..@.... ...@..@..@...... ................ ................ ....@..@........ ..@..@..@.......
.@...@....@..... .@.@.@..@..@.... ..@@...@........ ................ ................ ...@...@........ ..@..@..@.......
.@...@....@..... ...@.@..@.@@.... @@.@...@@....... ................ ................ ...@...@...@.... ..@..@..@.......
.@@@@@@@@@@..... ..@.....@....... ...@.@...@@..... ................ ................ ..@....@...@.... ..@..@.@@.......
.@........@..... @@......@....... ...@@....@...... ................ ................ @@......@@@@.... .....@..........
................ ................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................ ................
....@......@.... ....@..@........ .....@.......... .....@.......... @@@@@@@@@@@@.... .....@.......... .@....@..@......
....@@.....@.... ....@..@........ .....@.......... .@...@...@...... ......@......... .....@.......... ..@.@@@@@@@@....
...@..@..@.@.... ....@..@........ .@@@@@@@@@...... ..@..@..@....... .....@.......... .@@@@@@@@@@..... ..@....@........
..@....@.@.@.... ....@..@..@..... .....@.......... ...@.@.@........ .@@@@@@@@@@..... .@...@....@..... .....@@@@@@.....
.@@@@@@..@.@.... @...@..@..@..... .....@.......... .....@.......... .@..@..@..@..... .@...@....@..... .....@....@.....
@.@...@..@.@.... .@..@..@.@...... @@@@@@@@@@@..... .@@@@@@@@@...... .@..@..@..@..... .@...@....@..... @@@..@@@@@@.....
..@...@..@.@.... ..@.@..@.@...... .....@.......... .....@.......... .@..@..@..@..... .@@@@@@@@@@..... ..@..@....@.....
..@.@.@..@.@.... ..@.@..@@....... ....@@@......... .....@.......... .@..@..@..@..... .@...@....@..... ..@..@@@@@@.....
..@..@...@.@.... ....@..@........ ...@.@.@........ @@@@@@@@@@@..... .@..@..@..@..... .....@.......... ..@..@....@.....
..@....@...@.... ....@..@........ ..@..@..@....... .....@.......... .@..@..@..@..... .....@.......... ..@..@@@@@@.....
..@....@...@.... ....@..@........ @@...@...@@..... .....@.......... .@..@..@..@..... .....@.......... .@.@............
...@@@@@..@@.... @@@@@@@@@@@@.... .....@.......... .....@.......... .@.......@@..... .....@.......... @...@@@@@@@@....
................ ................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................
..@....@...@.... ....@.@@@@@..... ................ .....@.......... .@@@@@@@@@@..... @@@@@@@@@@@@....
..@....@...@.... @@@@@@@...@..... ................ .....@.......... .....@.......... .....@..........
..@@@@@@@@@@.... ..@...@...@..... ................ ....@.@......... .....@.......... .....@..........
................ .@@@@.@...@..... ................ ...@...@........ .....@.......... .....@@.........
..@@@@.@@@@@.... .@..@.@@@@@..... ................ ..@.@...@....... @@@@@@@@@@@@.... .....@.@........
..@..@.@...@.... .@..@.@...@..... ................ @@...@...@@..... .....@.......... .....@..@@......
..@@@@.@@@@@.... @.@.@.@...@..... ................ ................ ....@.@......... .....@...@......
..@..@.@...@.... ...@..@@@@@..... ................ ..@@@@@@@....... ....@.@......... .....@..........
..@@@@.@@@@@.... ...@..@...@..... ...@@........... .......@........ ...@...@........ .....@..........
..@..@.@...@.... ..@...@...@..... ...@@........... ......@......... ...@....@....... .....@..........
.@...@.@...@.... .@....@...@..... ....@........... ......@......... ..@......@...... .....@..........
@...@@@...@@.... @...@@@@@@@@.... ...@............ .....@.......... @@........@@.... .....@..........
................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................
................ ................ ................ ................ ................ ................
Testing done.
ab 工具
安装及使用说明请访问 AMPY Batch Tool 查看
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。