分区表机制
概述
Flash 可以包含应用程序,用户资源等多种不同类型的数据。为了更方便的使用 flash 资源,我们于是提出了分区表的解决方案。
分区表中的每个条目都包括以下几个部分: Name
(分区名)、 Offset
(分区相对flash基址的偏移量)、 Size
(分区大小) 以及 Flag
(暂时未使用)。
使用分区表
在使用分区表时,可打开项目配置菜单 menuconfig
,并进入 Partition Table 菜单,在 Partition Table 栏下选择一种分区表方案。我们提供了三种预置的分区表和一种用户自定义的分区表,下面是预置的分区表,最后一种是用户自定义的分区表。
“partition_table_normal.txt, no OTA”
“partition_table_large.txt, no OTA”
“partition_table_with_ota.txt, with OTA”
“partition_table_custom.txt, no OTA”
内置分区表样式
以下是 “partition_table_normal.txt” 选项的分区表信息摘要:
# name, offset, size, flag
ft, 0x0, 0x2000, 0x0
bootloader, 0x2000, 0xC000, 0x0
partition_table, 0xE000, 0x1000, 0x0
app, 0xF000, 0x100000, 0x0
nvs, 0x1F0000, 0x8000, 0x0
以下是 “partition_table_large.txt” 选项的分区表信息摘要:
# name, offset, size, flag
ft, 0x0, 0x2000, 0x0
bootloader, 0x2000, 0xC000, 0x0
partition_table, 0xE000, 0x1000, 0x0
app, 0xF000, 0x1E1000, 0x0
nvs, 0x1F0000, 0x8000, 0x0
以下是 “partition_table_with_ota.txt” 选项的分区表信息摘要:
# name, offset, size, flag
ft, 0x0, 0x2000, 0x0
bootloader, 0x2000, 0xC000, 0x0
partition_table, 0xE000, 0x1000, 0x0
app, 0xF000, 0x122A00, 0x0
app_ota, 0x131A00, 0xAE600, 0x0
user, 0x1E0000, 0x2000, 0x0
nvs, 0x1F0000, 0x8000, 0x0
这三种分区表中,Normal的分区不带app_ota和user分区,SDK 默认使用Large 这个分区表,可以从Kconfig配置中指定其他分区表。
ft分区:芯片的出厂固件,启动时将默认加载这个文件。
bootloader:存放bootloader的启动程序,完成OTA升级文件的解压和固件更新。
partition_table:存放分区表信息,包括各个分区的名称,地址,大小和FLAG。
app:存放应用程序。
app_ota:存放OTA升级的应用程序压缩包。
user:用户自定义分区,目前SDK框架没有使用。
nvs:非易失存储分区,用于NVS模块的key-value数据存放,该分区需要一块做垃圾回收,所以nvs的大小需要大于等于2*0x1000。
注意
ft,是芯片出厂固件,用户不能修改其中的内容。
注意
ft,bootloader,partition_table这3个分区的配置 不能修改 。app,app_ota,nvs这3个分区 不能修改名称 ,可以修改地址和大小。
用户自定义分区表
如果想要根据自己的程序使用灵活性更高的分区表,那么请在 menuconfig
的 Partition Table 菜单中选择 Custom partition table 选项,启用自定义的分区表功能。之后在工程根目录下添加一个 partition_table_custom.txt
文件即可,在编译时构建系统会自动识别并进行处理。
以下是 “Custom partition table” 选项的分区表信息摘要:
# name, offset, size, flag
ft, 0x0, 0x2000, 0x0
bootloader, 0x2000, 0xC000, 0x0
partition_table, 0xE000, 0x1000, 0x0
app, 0xF000, 0x1D1000, 0x0
user, 0x1E0000, 0x2000, 0x0
nvs, 0x1F0000, 0x8000, 0x0
字段之间的空格会被忽略,任何以
#
开头的行(注释)也会被忽略。TXT 文件中的每个非注释行均为一个分区定义。
user 是一个用户自己配置的分区的示例,我们在使用时只需要合理的设置 offset 和 size 字段的内容即可。
ft,bootloader,partition_table 这3个分区不能改,app,nvs 这2个分区名称不能改,地址和大小可以修改。
烧写与擦除分区表
按照规则填写相应的分区表文件的内容,之后编译并烧录项目工程固件。烧录固件的过程中会将工程目录下的所有分区表都进行烧录,如果想要清除已经存在的分区表里的内容,则在编译命令后面加上 -e
选项即可。