嵌入式linux下Flash使用
一、Flash分类、特性
-
NOR Flash:主要用于存储启动代码、操作系统、固件和 BIOS 等应用。读取速度很快,适合对实时性要求较高的应用,价格高,容量小,一个16M的NOR Flash和128M的NAND Flash价格相当。
-
NAND Flash:主要用于文件存储、数据备份、图像、视频、音频等数据存储。更大的存储容量,但相对读取速度较慢,价格便宜,容量大,物理损坏比较敏感,通常需要配合错误检测与校正 (ECC) 或其他故障保护机制来提高数据的可靠性和完整性。
-
SPI Flash:与 NOR Flash 类似,但 SPI Flash 通常采用串行接口,可以通过 SPI 协议访问和编程,相比之下,SPI Flash 和 NOR Flash 的使用寿命更长,数据的稳定性和可靠性更高。
-
eMMC Flash:内嵌了闪存芯片和控制器,通常被用作固态硬盘(SSD)或嵌入式系统的主存储器,使用速度比 NAND Flash 更快,存储密度也更高。eMMC Flash 存储介质在性能、稳定性和可靠性方面都具有一定的优势。
二、Flash在嵌入式linux设备里的分区 (分区是在uboot阶段使用命令进行)
1、简介:在嵌入式系统中,一般使用 bootloader 程序以及文件系统进行启动和管理。因此,Flash 存储器的分区信息(包括分区表、分区大小、起始地址等)通常会被保存在 Flash 中的某个位置或者文件系统中的某个文件中。具体的存储位置和命名方式会根据开发板和 Flash 存储器的不同而有所不同。
2、查看 Flash 存储器的分区信息:: cat /proc/mtd 如需查看分区起始地址,可将其大小逐级累加。
3、可以使用 MTD 工具集( mtd-utils
)中的命令行工具进行操作,要使用如下命令,需要安装 mtd-utils 软件包。
(执行命令也需要root权限)
mtd_debug read <device> <offset> <len> <dest-filename>
mtd_debug write <device> <offset> <len> <source-filename>
mtd_debug erase <device> <offset> <len> (实际开发中如 mtd5 专门用来存配置信息,可以通过这些函数直接读写)
(1)、擦除指令: mtd_debug erase /dev/mtd0 0 512 表示擦除MTD0分区中从偏移0开始的512字节大小的区域
(2)、写指令: nandwrite 或 mtd_debug write /dev/mtd0 0 data.txt 表示将data.txt文件的内容写入到MTD0分区的偏移为0处(也可以是其他文件类型,如bin等。)
(3)、 读指令: mtd_debug read /dev/mtd0 0 1024 /usr/data/data.bin 表示从MTD0分区的偏移为0处开始读取1024字节的数据并输出到data.bin 文件中,使用绝对路径指定文件存放位置。用
cmp original.bin data.bin 比较,确认输出是否正确(有差异才会输出信息),
也可以将这两个命令合并成一个命令,通过管道 |
将它们连接起来,例如:mtd_debug read /dev/mtd0 0 1024 data.bin| cmp original_data.bin data.bin
(4)、其他指令:flash_erase、flash_read 和 mtd_debug read一样,都用于从 NOR Flash 存储设备中读取数据,flash_read
命令是 u-boot 自带命令行工具,需要在 u-boot 环境中执行,即进入 u-boot 命令行。mtd_debug read
可以在读取时对数据进行比较。
三、如何给Flash分区
1、简介:通常是通过所用的 bootloader 来定义和设置的。如:U-Boot 、RedBoot 等
2、进入 U-Boot 命令行模式,执行 printenv
命令查看当前环境变量,确认 mtdparts
的设置方式(常用的是“mtdparts=xxx:yyy[,…]”形式)。如下是nxp某开发板源码目录下include/configs/mx6ullevk.h所对应的配置:
3、以 mtdparts=phys_addr:0xpartition_size@offset,的形式设置分区信息。
4、在 U-Boot 命令行模式下通过 saveenv
命令保存设置的分区信息,并通过 printenv
命令验证分区信息是否保存成功。
例如,设置2个分区的方法:
以上命令创建了两个分区:boot 和rootfs,boot 分区偏移量为0x0,大小为0x40000,rootfs 分区偏移量为0x40000,大小为0x100000。