16MB Flash,新增功能的时候发现flash不够用了,查看分区表,备份分区占了三千多K,所以想研究一下能不能通过调整分区,将备份分区尽量变小以腾出空间添加新功能。由于之前没有做过此类尝试,故留下此文以便不时之需。

分区现状

分区信息

dev:    size   erasesize  name
mtd0: 00030000 00001000 "uboot"
mtd1: 00510000 00001000 "boot"
mtd2: 00530000 00001000 "system"
mtd3: 00530000 00001000 "bk"
mtd4: 00050000 00010000 "userdata"
mtd5: 00010000 00001000 "productdata"

分区说明

分区 大小(KB) name
mtd0 192 uboot
mtd1 5184 boot
mtd2 5312 system
mtd3 5312 bk
mtd4 320 userdata
mtd5 64 productdata

mtd0: uboot分区,该分区不会进行升级
boot: 内核和文件系统,有升级需求
system: 业务层程序,有升级需要
bk: 备份分区
userdata: 配置分区,没有升级需求
productdata: 出厂配置分区,没有升级需求

分区调整

调整原则

  1. 保持uboot、userdata、productdata三个分区大小和顺序不变
  2. 将boot、system分区拆分成3个较小的分区,从而减小bk分区,5184 + 5312 + 5312 = 15808 / 4 = 3952k
  3. 考虑到flash分区需要64K对齐,新分区如下
    分区 大小(KB) name
    mtd0 192 uboot
    mtd1 3968 boot
    mtd2 3968 system
    mtd3 3968 bk
    mtd4 320 userdata
    mtd5 64 productdata
    mtd6 3712 new

调整步骤

调整文件系统

调整大小,保证新的img大小不会超过新分区

uboot

原配置

#define MTDPARTS_DEFAULT       "mtdparts=nor0:192K(uboot),5184K(boot),5312K(system),5312K(bk),320K(userdata),64K(productdata)"
#define CONFIG_BOOTCOMMAND "sf probe 0;sf read 0x21000000 0x30000 0x510000;bootm 0x21000000;"

新配置

#define MTDPARTS_DEFAULT       "mtdparts=nor0:192K(uboot),3968K(boot),3968K(system),3968K(bk),320K(userdata),64K(productdata),3712K(new)"
#define CONFIG_BOOTCOMMAND "sf probe 0;sf read 0x21000000 0x30000 0x3E0000;bootm 0x21000000;"

文件系统

由于需要支持OTA,新分区需要保证能够卸载,才能重新烧写,所以原则上新分区的文件不能是需要运行的二进制和依赖的动态库