在嵌入式系统设计中,存储方案的选择与优化往往决定了产品的稳定性和性能边界。全志V3s作为一款高性价比的嵌入式处理器,搭配SPI Nor Flash的存储方案在成本敏感型应用中尤为常见。本文将深入探讨16MB/32MB Nor Flash的分区策略设计精髓,以及JFFS2文件系统与Nor Flash硬件特性的完美契合之道。
全志V3s的启动链堪称精妙的设计典范。当系统上电时,处理器首先从固化在芯片内部的BROM(Boot ROM)开始执行,随后加载SPI Flash中的SPL(Secondary Program Loader),再由SPL引导完整的U-Boot。这个启动过程对存储介质的布局有着严苛的要求。
典型存储分区构成:
c复制// 典型分区表示例 (mtdparts参数)
mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs)
关键提示:分区边界必须与Flash擦除块大小对齐(通常为64KB),否则会导致擦写操作失败。这是许多新手容易忽略的细节。
分区设计绝非简单的空间划分,而是需要综合考量以下因素:
2.1 容量规划黄金法则
| 组件 | 16MB Flash分配 | 32MB Flash分配 | 设计考量 |
|---|---|---|---|
| Bootloader | 1MB | 1MB | 固定大小,兼容各种启动模式 |
| DTB | 64KB | 64KB | 预留扩展余量 |
| Kernel | 4MB | 8MB | 考虑内核功能裁剪空间 |
| RootFS | 10.94MB | 22.94MB | 动态调整,最大化利用空间 |
2.2 地址对齐的硬性要求
XT25F128B Nor Flash的物理特性决定了我们必须遵守:
bash复制# 计算rootfs分区大小的Shell命令
# 16MB Flash: 16M - 1M(uboot) - 64K(dtb) - 4M(kernel) = 0xAF0000
FLASH_SIZE=16
UBOOT_SIZE=1
DTB_SIZE=0.0625
KERNEL_SIZE=4
ROOTFS_SIZE=$(echo "$FLASH_SIZE - $UBOOT_SIZE - $DTB_SIZE - $KERNEL_SIZE" | bc)
echo "RootFS size: ${ROOTFS_SIZE}MB"
2.3 实战中的权衡艺术
在Nor Flash上选择文件系统时,JFFS2之所以成为不二之选,源于其与硬件特性的深度适配:
3.1 磨损均衡机制
3.2 掉电安全设计
3.3 性能优化特性
bash复制# JFFS2镜像生成命令详解
mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -d rootfs/ -o jffs2.img
参数解析:
-s 0x100:页大小256字节-e 0x10000:擦除块大小64KB-p 0xAF0000:分区总空间10.94MB-d rootfs/:源目录-o jffs2.img:输出镜像4.1 U-Boot的关键配置点
在include/configs/sun8i.h中添加:
c复制#define CONFIG_BOOTCOMMAND "sf probe 0; " \
"sf read 0x41800000 0x100000 0x10000; " \
"sf read 0x41000000 0x110000 0x400000; " \
"bootz 0x41000000 - 0x41800000"
#define CONFIG_BOOTARGS "console=ttyS0,115200 earlyprintk panic=5 rootwait " \
"mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2"
4.2 Linux内核的必要选项
code复制Device Drivers →
Memory Technology Device (MTD) support →
<*> Command line partition table parsing
<*> SPI-NOR device support
File systems →
Miscellaneous filesystems →
<*> Journalling Flash File System v2 (JFFS2) support
4.3 设备树SPI节点配置
dts复制&spi0 {
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <50000000>;
#address-cells = <1>;
#size-cells = <1>;
};
};
5.1 烧录工具链配置
bash复制# 安装sunxi-tools
git clone -b spi-rebase https://github.com/Icenowy/sunxi-tools.git
cd sunxi-tools
make && sudo make install
# 进入FEL模式的方法
1. 不插卡且Flash为空
2. TF卡中写入fel-sdboot.sunxi
3. 上电时拉低SPI_MISO引脚
# 全盘烧录命令
sudo sunxi-fel -p spiflash-write 0 flashimg.bin
5.2 性能监测手段
/proc/mtd查看分区信息vmstat -m观察JFFS2内存使用cat /proc/jffs2_stats获取文件系统状态5.3 寿命延长策略
/sys/class/mtd/mtdX/wear_leveling_count在实际项目中,我曾遇到过一个典型案例:某智能家居设备频繁出现文件系统损坏。经过分析发现是日志系统直接写入Nor Flash导致。解决方案是将/var/log挂载为tmpfs,并通过网络定期上传日志,最终使产品寿命提升了3倍以上。这种实战经验正是嵌入式工程师最宝贵的财富。