# MicroPython 资源管理器 **Repository Path**: walkline/micropython-resource-manager ## Basic Information - **Project Name**: MicroPython 资源管理器 - **Description**: 将非 .py 文件打包进固件并调用 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 7 - **Created**: 2022-01-13 - **Last Updated**: 2025-01-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: MicroPython, 固件文件 ## README

MicroPython 资源管理器

### 项目介绍 将非`.py`文件打包进固件并调用(仅适用于`乐鑫 ESP`系列芯片)。 ### 关于文件打包 `MicroPython`编译固件过程中可以自动编译打包用户添加的`.py`文件,对于其它类型的用户文件就无能为力了。 这里使用 [littlefs for Python](https://github.com/jrast/littlefs-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](https://github.com/micropython/micropython/commit/e1a84a0c6f7ddc0335b4a78a2ea3bcc5f2176965)),要打包文件可以选择以下两种方法。 #### 1. 不修改分区表(简单) 先说缺点,那就是固件文件体积会增大,最终生成的固件大小为: ```python 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` 具体操作方法如下: 1. 修改`config.py`文件内容,将`vfs_offset`和`vfs_size`的值分别填入对应位置,例如: ```python class Partition(object): # 根据实际情况设置 IS_ESP32_ESP32S2 = False OFFSET = 0x200_000 # 偏移地址 SIZE = 0x200_000 # 分区大小 ``` 2. 参考 [如何打包文件](#如何打包文件) 章节进行后续操作。 #### 2. 修改分区表(复杂) 这里说的复杂不仅是指操作步骤较多,而且还要根据一些规则进行计算,最后也是最重要的,需要自行搭建`MicroPython`开发环境编译固件。 之前找到一个可以修改固件分区表的软件 [mp-image-tool-esp32](https://github.com/glenn20/mp-image-tool-esp32),如果可以修改的话就不需要自行编译固件了。 简单来说,这个方法的操作流程如下: * 在`vfs`分区之前(或之后)增加一个资源分区 * 压缩`vfs`分区大小 * 将打包好的文件写入资源分区 在开始具体操作之前,需要先计算出资源分区占用的存储空间大小,以`/example/files`文件夹下的文件为例,计算方法如下: ```python 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](https://docs.micropython.org/en/latest/library/os.html#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`的数值 分区表文件修改完成后,根据自己的需求编译固件并得到固件文件,之后参考 [不修改分区表(简单)](#1-不修改分区表简单) 章节进行后续操作,**特别注意一点,修改`config.py`文件内容时,要将`resource_offset`和`resource_size`的值分别填入对应位置**。 ### 如何打包文件 要将`/example/files/`文件夹中的所有文件打包进固件文件中,可以使用如下命令: ```bash # 查看使用说明 $ python3 combine_files.py # Usage: # python3 combine_files.py # 使用 不修改分区表 方法,按需修改 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/ ``` ### 如何读取文件 要读取资源文件,只需要将资源分区挂载到系统中即可: > 注:使用 [不修改分区表(简单)](#1-不修改分区表简单) 方法打包的固件不需要挂载资源分区。 ```python import esp32, os res = esp32.Partition.find(esp32.Partition.TYPE_DATA, label='resource') if res: os.mount(res[0], '/res') ``` ### 查看演示内容 开发板使用`repl`模式运行`main.py`文件: ```bash $ ab --repl # 选择正确的端口,使用快捷键 ctrl + r 运行 main.py 文件 ``` > ab 工具使用方法见 [AMPY Batch Tool](https://gitee.com/walkline/a-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](https://gitee.com/walkline/a-batch-tool) 查看 * [分区表 - ESP32](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/partition-tables.html) * [ESP32-C3 MicroPython 固件编译环境搭建教程](https://gitee.com/walkline/esp32-c3_micropython_firmware) ### 合作交流 * 联系邮箱: * QQ 交流群: * 走线物联:[163271910](https://jq.qq.com/?_wv=1027&k=xtPoHgwL) * 扇贝物联:[31324057](https://jq.qq.com/?_wv=1027&k=yp4FrpWh)

走线物联扇贝物联