# 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)

