1、课程导论:什么是分区表?为什么需要分区表?分区表在嵌入式系统中的作用。
各位同学好,我是老周。做嵌入式开发十几年了,从最早的 51 单片机一路做到现在的多核 RISC-V 芯片。今天咱们聊一个特别基础、但又特别容易被忽视的东西——分区表。
说实话,我刚入行那会儿,根本不知道什么叫分区表。那时候 Flash 小,程序简单,一把烧进去就完事了。直到有一次,我在一个量产项目上吃了大亏……嗯,这个坑咱们后面细说。
1.1 什么是分区表?
分区表,说白了就是一张“地图”。它告诉芯片:你的 Flash 空间该怎么划分,哪块放程序,哪块放数据,哪块留着做升级。
你想想看,一个 16MB 的 Flash,如果不做分区,那就像一个大仓库,所有东西都堆在一起。程序、配置、日志、字库……全混着放。找东西?根本找不到。
分区表的核心作用:把 Flash 空间划分成若干个逻辑区域,每个区域有固定的起始地址、大小和用途。
我个人的习惯是,拿到一个新芯片,第一件事就是看它的 Flash 大小,然后规划分区。这一步做不好,后面全是坑。
1.2 为什么需要分区表?
你可能会问:我不分区行不行?程序直接烧到 0x0000 地址,跑起来不就行了?
行,但仅限于最最简单的场景。一旦你的产品需要以下功能,分区表就是刚需:
- OTA 升级:需要两个程序区,一个跑当前版本,一个放升级包。没有分区表,你怎么知道新程序该写到哪里?
- 参数存储:Wi-Fi 密码、校准数据、用户配置……这些不能跟着程序一起擦除吧?得单独划一块区域。
- 日志记录:设备运行日志、错误信息,需要循环写入。没有分区,日志写满了会把程序区覆盖掉。
- 文件系统:SPIFFS、LittleFS 这些文件系统,需要一块连续的 Flash 空间。分区表就是它们的“地盘”。
- 多固件支持:比如一个芯片同时跑 Bootloader、App、Recovery 三个固件,每个都得有自己的独立空间。
我曾经在一个智能家居项目上,因为没规划好分区,导致 OTA 升级时新固件把参数区给覆盖了。结果呢?所有设备升级后 Wi-Fi 配置全丢,用户得重新配网……那叫一个惨。从那以后,我再也不敢跳过分区表设计这一步。
1.3 分区表在嵌入式系统中的作用
分区表的作用,可以归纳为三点:
| 作用 | 说明 | 我遇到的典型场景 |
|---|---|---|
| 空间隔离 | 不同功能的数据互不干扰,程序区不会误写参数区 | OTA 升级时,新固件只写 App 分区,不动其他区域 |
| 地址管理 | 每个分区有固定地址,Bootloader 知道该从哪里启动 | Bootloader 根据分区表跳转到 App 入口地址 |
| 灵活扩展 | 调整分区大小或新增分区,只需修改分区表配置 | 产品迭代时,日志分区从 64KB 扩到 128KB |
说白了,分区表就是嵌入式系统的“宪法”。它规定了每个模块的权限和边界。没有它,系统就是一团乱麻。
我的建议:哪怕你只是做个简单的 LED 灯控,也养成规划分区的习惯。把程序区、参数区、日志区分开。这个习惯,能帮你省掉无数个调试的夜晚。
1.4 分区表的核心逻辑
下面这张图,是我自己画的分区表核心逻辑。你看一遍,基本就懂了。
你看,分区表就像一本“地址簿”。Bootloader 启动时,先查分区表,找到 App 的起始地址,然后跳过去执行。参数区、日志区也一样,通过分区表找到自己的“地盘”。
1.5 一个简单的分区表示例
以 ESP32 为例,它的分区表通常长这样:
# ESP32 分区表示例(partitions.csv)
# 名称, 类型, 子类型, 偏移量, 大小, 标志
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
app0, app, ota_0, 0x10000, 0x1F0000,
app1, app, ota_1, 0x200000, 0x1F0000,
spiffs, data, spiffs, 0x3F0000, 0x10000,
这个表定义了 5 个分区:
- nvs:存储 Wi-Fi 配置、校准数据等非易失性参数
- otadata:记录当前应该从哪个 OTA 分区启动
- app0 / app1:两个固件分区,用于 OTA 升级
- spiffs:文件系统,存放网页、字库等静态资源
注意:分区表的偏移量和大小必须对齐 Flash 的擦除块大小(通常是 4KB)。不对齐的话,烧录时会报错,甚至导致芯片无法启动。我曾经因为这个原因,浪费了整整一天去排查……
1.6 小结
好了,这一章咱们聊了分区表的基本概念。总结一下:
- 分区表就是 Flash 的“地图”,告诉芯片每块空间的用途
- 没有分区表,OTA 升级、参数存储、日志记录都无从谈起
- 分区表的核心作用是空间隔离、地址管理和灵活扩展