当前位置:首页 > 单片机 > 单片机
[导读]1引言目前,嵌入式系统大多采用用JAFFS和YAFFS文件系统,但JAFFS文件系统主要用于NOR FLASH,由于NOR FLASH 内部结构的局限性,只适合于小容量的存储,并且NOR FLASH读写速度慢,不能满足系统实时性的需要,在我的测

1引言

目前,嵌入式系统大多采用用JAFFS和YAFFS文件系统,但JAFFS文件系统主要用于NOR FLASH,由于NOR FLASH 内部结构的局限性,只适合于小容量的存储,并且NOR FLASH读写速度慢,不能满足系统实时性的需要,在我的测试过程中,在NAND FLASH上挂载的JFFS2文件系统很不稳定,经常有CRC错误产生。特别是进行写操作的时候,每次复位都会产生CRC错误,可以说支持NAND FLASH的 JFFS2文件系统目前还不成熟。YAFFS(Yet Another Flash File System)类似于JFFS/JFFS2,是专门为 NAND闪存设计的嵌入式文件系统,适用于大容量的存储设备.YAFFS内部实现层和NAND FLASH接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去,与JFFS相比,YAFFS减少了一些功能,因此速度更快,占用内存更少,更能满足系统实时性的要求。

2 硬件平台的简介

本系统采用目标机+宿主机开发模式,目标平台是ARM-S3C2410,宿主机是PC机+Linux操作系统.S3C2410是ARM920T处理器核的 32位微控制器,它是SAMSUNG公司专门为PDA、Internet设备和手持设备等专门开发的微处理器.该芯片还包含有16KB一体化的 Cache/MMU,这一特性使开发人员能够将Linux操作系统移植到基于该处理器的目标系统中.

该目标板的主要系统资源有:64M的 SDRAM、8M的NAND FLASH、32M的NOR FALSH、LCD控制器RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWM的Timer、并行I/O口、8路1O位ADC、Touch Screen接口、I2C接口、I2S接口、2个USB接口控制器、2路SPI,主频最高可达203MHz.

3 嵌入式文件系统的概述

众所周知,文件系统是操作系统的一个重要的组成部分,每个操作系统都有自己的文件系统,文件系统直接影响着操作系统的稳定性和可靠性.Linux下的文件系统通常有两种,即日志式和非日志式文件系统,常见的嵌入式文件系统有 JFFS2,CRAMFS,RAMDISK,YAFFS文件系统,嵌入式文件系统的任务是对文件进行管理,其工作包括提供对逻辑文件的操作(包括检索、新增、修改、删除、拷贝)接口,方便用户操作文件和目录.

由于本文采用的Linux内核版本为2.6.14,不支持设备文件系统,可以在 /dev目录下手动添加设备结点.本系统的根文件系统为RAMDISK(虚拟硬盘),通过修改根文件系统下的/dev目录,使用命令mknod创建 mtdblock块设备文件,以便挂载YAFFS文件系统.

4 Yaffs文件系统的介绍

YAFFS(Yet Another Flash File System)文件系统是专门针对NAND 闪存设计的嵌入式文件系统,是一种类似于 JFFS/JFFS2 的专门为 Flash 设计的嵌入式文件系统,与JFFS 相比,它减少了一些功能,因此速度更快、占用内存更少,YAFFS不支持压缩,更适合存储容量大的系统. 目前有YAFFS和YAFFS2两个版本,两个版本的主要区别在于YAFFS2 能够更好的支持大容量的NAND FLASH芯片.

YAFFS文件系统有些类似于JFFS/JFFS2 文件系统,与之不同的是JFFS1/2 文件系统最初是针对NOR FLASH的应用场合设计的,而NOR FLASH 和NAND FLASH本质上有较大的区别,所以尽管JFFS1/2 文件系统也能应用于NAND FLASH,但由于它在内存占用和启动时间方面针对NOR 的特性做了一些取舍,所以对 NAND FLASH来说通常并不是最优的方案,YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作,YAFFS中是从头到尾对块搜索,所以在垃圾收集上JFFS的速度慢,但是能延长NAND FLASH的寿命.

YAFFS将文件组织成固定大小(512字节)的数据段。每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名等信息。为了提高文件数据块的查找速度,文件的数据段被组织成树形结构。 YAFFS在文件进行改写时总是先写入新的数据块,然后将旧的数据块从文件中删除。YAFFS使用存放在页面备用空间中的ECC进行错误检测,出现错误后会进行一定次数的重试,多次重试失败后,该页面就被停止使用。

YAFFS充分利用了NAND闪存提供的每个页面16字节的备用空间,参考了 SmartMedia的设定,备用空间中6个字节被用作页面数据的ECC,2个字节分别用作块状态字和数据状态字,其余的8字节(64位)用来存放文件系统的组织信息,即元数据。由于文件系统的基本组织信息保存在页面的备份空间中,因此,在文件系统加载时只需要扫描各个页面的备份空间,即可建立起整个文件系统的结构,而不需要像JFFS 那样扫描整个介质,从而大大加快了文件系统的加载速度。

5 Linux-2.6.14内核代码的修改

1.在arch/arm/mach-s3c2410/devs.c文件中添加static struct mtd_partition partition_info[]创建分区信息,使YAFFS文件系统位于mtdblock3.
static struct mtd_partition partition_info[]={
        [0] = {
                .name   = "u-boot",
             .size   = 0x00020000,
             .offset = 0x00000000,
        },
        [1] = {
                .name   = "param",
                .size   = 0x00010000,        
 .offset = 0x00020000,
        },
        [2] = {
                .name   = "kernel",
                .size   = 0x00100000,
                .offset = 0x00030000,
        },
        [3] = {
                .name   = "root",
                .size   = 0x01900000,
                .offset = 0x00130000,
        },
        [4] = {
                .name   = "user",
                .size   = 0x025d0000,
                .offset = 0x01a30000,
        }
};注意,这里的分区信息应与U-BOOT中保持一致.

2.YAFFS 的校验算法和MTD NAND FLASH驱动的校验算法不同,如果在内核中由MTD来处理ECC,会造成MTD 认为所有的page都校验错误.所以要把要把NAND驱动中的ECC校验关闭.采用YAFFS2自带的校验算法,基于这个考虑,在drivers/mtd/nand/s3c2410.c中,将 chip->eccmode=NAND_ECC_SOFT修改为chip->eccmode=NAND_ECC_SOFT.

3.从开源网站下载YAFFS2文件系统的源码,在宿主机下用tar xzvf yaffs2.tar.gz命令解压,在移植的内核目录下建立yaffs文件夹,并将需要的文件拷贝到yaffs文件夹下.简单介绍下yaffs文件系统代码的函数功能.
# mkdir $LINUXDIR/fs/yaffs
    # cp Makefile.kernel $LINUXDIR/fs/yaffs/Makefile
    # cp Kconfig $LINUXDIR/fs/yaffs
    # cp *.c *.h  $LINUXDIR/fs/yaffs

4.修改fs/Kconfig,vi Kconfig ,添加 source "fs/ /Kconfig" 

5.修改Makefile文件:
# cd  $LINUXDIR/fs
# vi  Makefile    obj-$(CONFIG_YAFFS_FS) += yaffs/

6 配置和编译内核

1.选中对MTD(memory technology device内存技术设备)的支持.
Memory Technology Device (MTD)
support   --->                                                     
[﹡]   MTD concatenating support                                          
• MTD partitioning support                                           
[﹡]     RedBoot partition table parsing                                  
[﹡]     Command line partition table parsing                             
 User Modules And Translation Layers                                
• Direct char device access to MTD devices                           
• Caching block device access to MTD devices  

MTD 主要是用于访问memory设备(ROM、flash)的Linux的子系统.MTD可以使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口.

2.选中NAND Device Support
•  NAND Device Support --->
[﹡] Verify NAND page writes
•  NAND Flash support for S3C2410/S3C2440 SoC 
•  S3C2410 NAND driver debug 
[﹡] S3C2410 NAND Hardware ECC 

这样就完成了内核对NAND FLASH的支持.

3.由于添加了YAFFS2文件系统,所以在内核的配置菜单 [File systems] 中的 [miscellaneous filesystems] 中增加了 [Yaffs2 file systems support] 选项.这个选项就是 YAFFS2的配置内容.
File systems --->     Miscellaneous filesystems ---> 
•  YAFFS2 file system support 
 --- 512 byte / page devices 
•  Lets Yaffs do its own ECC 
•  Use the same ecc byte order as Steven Hill's nand_ecc.c 
 --- 2048 byte (or larger) / page devices  
•  Autoselect yaffs2 format  
•  Disable lazy loading  
•  Turn off wide tnodes  
•  Turn off debug chunk erase check  
•  Cache short names in RAM

选择这个选项的全部内容,保存配置,然后退到终端,输入make zImage,重新编译内核,这样就就完成了对YAFFS文件系统的定制.

7 测试挂载的YAFFS文件系统

1.用imagewrite命令将YAFFS文件系统的映像文件烧写到mtdblock3分区.
2.在ramdisk根文件系统中创建挂载目录,使用命令mkdir /mnt/yaffs. 
3.  执行mount –t yaffs /dev/mtdblock/3 /mnt/yaffs来挂载YAFFS文件系统.
4.  由于内核配置了proc文件系统,用cat /proc/mounts 可以查看已经成功挂载了YAFFS文件系统,用ls /mnt/yaffs可以查看YAFFS文件系统的内容.

8 结束语

本文为开发者提供了在ARM9平台上移植YAFFS文件系统的方法和过程的参考,创新之处是在当前嵌入式应用中比较新的2.6内核上测试完成的.测试过程中 YAFFS稳定性能比JFFS2文件系统要稳定的多,而且mount分区的时间也比JFFS2文件系统少的多。需要注意一点是,即使NAND FLASH 是512+16B的,不需要使用YAFFS2,也必须将对2kpage的NAND FLASH的支持这一项选上,否则编译无法通过.由于ARM- S3C2410不支持大容量的NAND FLASH,所以flash是512+16B / page的,即使你选择的是YAFFS2文件系统,内核也会自动选择挂载为YAFFS1文件系统,由于实验系统的局限性,本文只在ARM-S3C2410平台上实现了YAFFS1文件系统的移植,在功能更强大ARM 芯片系列中已经加入了对大容量(512M)的NAND FLASH的支持,支持YAFFS2文件系统,移植方法与YAFFS文件系统移植方法大致相同.

参考文献:
[1] 杜春雷,ARM体系结构与编程[M]。北京:清华大学出版社,2003
[2] 潘巨龙,黄宁,ARM9嵌入式系统构建与应用[M]。北京:北京航空航天大学出版社,2006
[3] 陈 春,ARM9嵌入式技术及Linux高级实践教程[M]。北京:北京航空航天大学出版社,2005
[4] Wookey and Tak—Shing,Porting the Linux Kernel to a New ARM Platform,SOLUTIONS JOURNAL,2002,4:52—57
[5] 郝淑风等.基于ARM的uCLinux启动引导实现的分析[J].微计算机信息,2005,8-2:50—52

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

据《日经新闻》报道,软银旗下英国芯片制造商Arm计划到2025年销售AI芯片。该公司专门成立一个AI芯片部门,并将在2025年春季之前制造出原型产品,并于秋季开始大规模生产。

关键字: 软银 AGI ARM AI芯片

业内消息,近日日本软件银行集团(SoftBank Group)旗下安谋国际科技公司(Arm)计划研发人工智能(AI)芯片,先成立一个AI芯片部门,目标是明年春季建立AI芯片原型产品,然后将量产工作交由代工厂制造,预估20...

关键字: ARM AI芯片

Arm CPU正在从根本上推动AI变革,并造福地球。Arm架构是未来AI计算的基石。​

关键字: ARM AI

近日,Arm推出了Arm® Ethos™-U85神经网络处理器(NPU)和Arm Corstone™-320物联网参考设计平台,旨在满足海量的数据处理和大规模计算,加速推进边缘AI的发展进程。

关键字: ARM

为了赶超云计算市场上的竞争对手,谷歌正试图通过定制的Arm服务器芯片降低云计算服务成本。

关键字: 谷歌 ARM 定制芯片

嵌入式开发作为一个融合了计算机软硬件和系统工程的综合性领域,其成功与否往往取决于三个核心要素的有效整合与协调。这三个要素分别是:硬件平台的选择与设计、软件开发及其优化、以及系统级的设计与集成。深入理解并熟练掌握这三个方面...

关键字: 嵌入式开发 ARM

随着汽车软件数量爆发式的增长,整个行业都需要重新思考汽车产品的开发流程。为此,Arm推出了丰富的硬件IP、新的系统IP,以及全新的汽车计算与计算子系统产品路线图,旨在为各种汽车应用实现性能、功能安全、可扩展等方面的支持。

关键字: ARM 汽车电子

知名移动芯片设计公司ARM最近迈出重要一步,它正式推出汽车芯片设计。ARM推出的芯片设计方案名叫Neoverse,随同芯片一起推出的还有面向汽车制造商、汽车供应商的新系统。

关键字: ARM 汽车芯片 芯片

随着通用人工智能的发展,数据中心的计算需求逐步提高。针对多模态数据、大模型的推理和训练需要更高的算力支持,而随着算力提升与之而来的还需更关注在功耗方面的优化。对于头部云计算和服务厂商而言,针对专门用例提高每瓦性能变得至关...

关键字: ARM 服务器 AI Neoverse CSS

一直以来,riscv架构都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来riscv架构的相关介绍,详细内容请看下文。

关键字: riscv ARM riscv架构
关闭
关闭