“数据不怕多,就怕没地方放。”上一章学会了在屏幕上画像素。但画什么?当然是电子书内容。一本 EPUB 可能有几十 MB,这些数据不可能塞进芯片内部。CrossPoint Reader 的解决方案:SD 卡。 这一章要搞清楚三件事:SD 卡怎么和芯片通信、文件系统怎么组织数据、多任务同时访问时怎么避免”打架”。
6.1 为什么需要 SD 卡
ESP32-C3 的存储困境
芯片内部有 16MB Flash,但几乎被占满了:SPI 模式连接
SD 卡通过 SPI 模式连接到 ESP32-C3,与墨水屏共享同一条 SPI 总线——因为芯片引脚有限。两个设备靠各自独立的 CS(Chip Select)引脚区分:6.2 FatFS 文件系统
为什么选 FAT32
SD 卡是”裸”的存储介质,需要文件系统才能用文件夹和文件名组织数据。CrossPoint Reader 使用 FAT32,因为兼容性最好:- Windows / macOS / Linux / Android / ESP32 都能读写
- 用户把 SD 卡插到任何设备都能操作文件
/sd/ 路径后,就能用标准文件 API 访问。
FAT32 限制:单文件不超过 4GB。对电子书完全不是问题。
目录结构约定
books/,系统文件藏在以点号开头的隐藏目录中互不干扰。
6.3 线程安全的文件操作
问题:两个任务同时读写
CrossPoint Reader 用 FreeRTOS 运行多个任务(详见第 7 章)。假设 UI 任务在读封面图,网络任务在写入新上传的书——两个任务同时操作 SD 卡会怎样?解决方案:互斥锁 + RAII
同一时刻只允许一个任务操作 SD 卡,用 FreeRTOS 的互斥锁(Mutex)实现。CrossPoint Reader 用 C++ 的 RAII 模式自动管理锁:宏封装:每次 SD 卡调用都安全
HalStorage::open() 时完全不知道锁的存在——锁被封装在底层。就像银行柜台自动处理排队,你只需说”我要取钱”。
6.4 NVS:芯片内部的小仓库
什么是 NVS
ESP32-C3 内部还有一个小仓库——NVS(Non-Volatile Storage),是 ESP-IDF 提供的键值存储,直接写在芯片 Flash 上:NVS vs SD 卡
| 特性 | NVS | SD 卡 |
|---|---|---|
| 容量 | ~24KB | 几 GB - 几百 GB |
| 速度 | 快 | 中等 |
| 可靠性 | 高(Flash 内部) | 中等(可能被拔出) |
| 适合存什么 | 小配置、标记位 | 文件、书籍、缓存 |
CrossPoint Reader 中的 NVS 用途
1. 设备类型缓存:首次开机通过 I2C 扫描检测硬件型号(~100ms),结果存入 NVS,后续开机直接读取(~1ms)。 2. 关键启动设置:某些在 SD 卡挂载前就需要的设置(如 SPI 总线速度),额外在 NVS 中保存一份。 3. OTA 升级状态:记录升级进度标记,断电重启后能判断上次升级是否完成,必要时回滚。24KB 够用吗? 一个键值对通常几十字节,存上百个配置项也用不完。大文件是 SD 卡的活儿。
6.5 缓存目录管理
为什么需要缓存
EPUB 本质是 ZIP 压缩包(内含 HTML、CSS、图片)。每次翻页都去解压、解析 XML、排版——对 160MHz 的 CPU 太慢了。策略:首次打开做完整解析,结果保存为二进制缓存,之后直接读缓存。a1b2c3d4),避免文件名冲突和特殊字符问题。
| 缓存文件 | 内容 | 大小 |
|---|---|---|
book.bin | 元数据(书名、作者、章节列表、总页数) | ~1 KB |
section.bin | 章节内容的二进制索引 | 几 KB |
progress.bin | 阅读进度(当前章节、页码、书签) | ~100 B |
cover.bin | 封面图预处理缓存 | 几 KB |
缓存失效与重建
6.6 存储系统全局视图
本章要点
- 内部 Flash 不够用:16MB 被固件和字体占满,电子书必须存在 SD 卡上。
- SPI 共享总线:SD 卡与墨水屏共享 SPI,通过 CS 引脚分时复用,不能同时操作。
- FAT32 文件系统:兼容性最好,所有主流系统都能读写。用户可直接用电脑往 SD 卡拷书。
- 线程安全:互斥锁防止多任务同时操作 SD 卡。RAII 模式(StorageLock)自动管理加锁解锁,杜绝忘释放锁的隐患。
- NVS 键值存储:芯片内部 24KB 小仓库,存设备型号、关键设置、OTA 状态等小而重要的数据。
- 缓存系统:首次解析结果以二进制格式缓存在 SD 卡上,再次打开直接读取。通过版本号和文件指纹实现自动失效重建。
下一章预告:第 7 章我们将深入 FreeRTOS——屏幕在刷新的同时按键还能响应,WiFi 在传文件的同时界面还能显示进度条。这一切背后是多任务调度机制。