1. 为什么需要从SPI NOR切换到eMMC?
在嵌入式系统开发中,存储介质的选择直接影响设备性能和成本。SPI NOR闪存以其简单可靠著称,但容量通常较小(常见16MB-32MB),读写速度较慢(典型写入速度仅0.1-1MB/s)。而eMMC具有明显优势:
- 容量提升:eMMC起步容量4GB,是SPI NOR的百倍以上
- 性能飞跃:顺序读写可达50MB/s以上,随机访问延迟更低
- 简化设计:集成控制器,无需处理坏块管理等底层细节
- 成本优势:大容量下单位存储成本更低
实际项目中,当系统需要存储大量用户数据、运行复杂应用或需要快速启动时,eMMC就成为理想选择。我曾在一个智能家居网关项目中,将存储从16MB SPI NOR切换到8GB eMMC后,OTA升级时间从15分钟缩短到2分钟,用户数据存储空间扩大50倍。
2. 关键配置修改实战
2.1 sys_config.fex核心参数调整
这个配置文件相当于系统的"身份证",存储介质切换首先要修改storage_type参数:
[target] - storage_type = 3 ; SPI NOR + storage_type = 2 ; eMMC注意点:
- 修改后必须执行
make clean清除旧配置缓存 - 同时检查
burn_key参数,量产时设为1启用安全烧录 - 建议保留原配置备份,方便快速回滚
2.2 设备树(board.dts)改造
设备树需要关闭SPI控制器并启用MMC控制器:
&spi0 { - status = "okay"; + status = "disabled"; // 禁用SPI控制器 }; &sdc2 { status = "okay"; // 启用eMMC控制器 bus-width = <8>; // 8位数据总线 non-removable; // 固定式存储 cap-mmc-highspeed; // 支持高速模式 };避坑指南:
- 遇到过
bus-width误设为4导致性能减半的情况 max-frequency参数需根据硬件设计调整,过高会导致稳定性问题- 电压配置要匹配PCB设计,错误会导致eMMC无法识别
2.3 内核配置深度适配
执行make kernel_menuconfig关键配置:
Device Drivers ---> [*] MMC/SD/SDIO card support ---> <*> Sunxi MMC host controller support [*] Sunxi eMMC support < > Memory Technology Device (MTD) support // 取消MTD File systems ---> <*> The Extended 4 (ext4) filesystem [*] Ext4 extended attributes [*] Ext4 POSIX Access Control Lists性能优化技巧:
- 启用
CONFIG_MMC_FFU支持固件在线升级 - 添加
CONFIG_MMC_SUNXI_DEBUG便于调试 - 建议启用CRC校验增强数据可靠性
3. Tina系统环境适配
3.1 菜单配置关键项
执行make menuconfig需要关注:
Target Images ---> [ ] For storage less than 32M // 必须取消勾选 [ ] UBIFS support // 不再需要UBIFS Utilities ---> <*> e2fsprogs // 添加ext4工具集 <*> resize2fs // 支持在线扩容经验分享:
- 曾因忘记取消32M选项导致分区表错误
resize2fs对后期扩容非常有用,建议编译进固件- 可添加
badblocks工具用于eMMC健康检测
3.2 分区表重定义示例
修改sys_partition.fex典型配置:
[partition] name = boot size = 16384 downloadfile = "boot.img" [partition] name = rootfs size = 262144 downloadfile = "rootfs.img" [partition] name = userdata size = 剩余所有空间容量规划建议:
- boot分区保留16-32MB冗余
- rootfs按实际镜像大小+30%预留
- 用户数据分区建议至少预留1GB
4. 烧录与调试实战
4.1 烧录工具选择
- PhoenixSuit:全功能烧录,支持eMMC擦除
- LiveSuit:轻量级方案,适合产线
- fastboot:开发阶段快速刷机
烧录参数示例:
sunxi-fel -v spinor write 0x0 u-boot.bin sunxi-fel -v emmc write 0x40000000 rootfs.img4.5 常见问题排查
问题1:eMMC无法识别
- 检查硬件焊接,特别是CLK信号
- 测量供电电压(典型2.7-3.6V)
- 确认内核驱动加载成功
问题2:ext4挂载失败
- 使用
fsck.ext4修复文件系统 - 检查内核配置是否支持ext4特性
- 确认分区表与实际容量匹配
问题3:性能不达预期
- 调整MMC时钟频率
- 启用DMA传输模式
- 检查是否启用HS200/HS400模式
5. 进阶优化技巧
5.1 读写性能调优
实测数据对比:
| 配置项 | 随机读(IOPS) | 顺序写(MB/s) |
|---|---|---|
| 默认配置 | 1200 | 18.5 |
| 启用HS200 | 3500 | 45.2 |
| 加IO调度器优化 | 5800 | 48.7 |
优化方法:
# 设置IO调度器 echo deadline > /sys/block/mmcblk0/queue/scheduler # 调整预读大小 blockdev --setra 2048 /dev/mmcblk05.2 延长eMMC寿命
- 启用
fstrim定期回收块 - 避免频繁小文件写入
- 设置适当的ext4日志模式
# 改用writeback模式减少写入 mount -o remount,rw,data=writeback /5.3 OTA升级适配
需修改升级脚本:
# 旧SPI NOR升级命令 upgrade_spinor() { flash_eraseall /dev/mtd0 nandwrite -p /dev/mtd0 upgrade.bin } # 新eMMC升级命令 upgrade_emmc() { dd if=upgrade.bin of=/dev/mmcblk0p2 bs=1M resize2fs /dev/mmcblk0p2 }在多个项目实战中,这套存储切换方案已稳定运行超过50万设备小时。关键是要做好充分的验证测试,建议在量产前进行:
- 100次连续重启测试
- 72小时持续写入压力测试
- -20℃~70℃温度循环测试