首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

闪存在嵌入式Linux系统中的应用 04

闪存在嵌入式Linux系统中的应用 04

 除这这些不同之外,各种闪存文件系统也存在一些共性。由于闪存的写入次数有限,为了避免局部因频繁写入而过早失效,必须使写入操作尽量均匀分布到所有位置上,即平衡损耗(wear leveling)。这导致了更新文件时必须做异位更新,而不能像在磁盘或RAM中那样简单地原位更新,从而引起一系列复杂的问题。首先,异位更新会导致闪存块中出现越来越多的过期页面,它们与有效页面混杂在一起,形成所谓的脏块(dirty  blocks)。当所有的闪存块都成为脏块后,就没有闪存块可供擦除再分配了。因此,基于闪存的文件系统都有垃圾回收器,用于将分散的过期页面集中在一起,形成空闪存块(free blocks)。由此引起的另一个问题是文件系统在使用时不能用到接近填满,否则也会导致类似的问题。其次,树状结构的文件索引中存在大量的互相引用,某个节点的改变会引起该节点本身及直接和间接引用它的一系列节点的异位更新。
  从以上的分析可以看出,NANDFLASH上的文件系统是一把双刃剑。它确实可以提供清晰的软件层次和使用上的方便,但同时也会降低操作效率,并具有潜在的可靠性问题。关键是如何合理使用,扬长避短。其实,对于写入量小(一个擦除块之内),并且不频繁的数据,可以跳过文件系统,通过ioctrl()函数直接操作闪存。这样做的缺点是破坏了软件层次,要求应用软件开发人员了解一部分硬件的细节,在应用程序中完成一些本应属于驱动程序的底层功能(如块擦除,发现和标记坏块等);优点是可以抛开复杂的文件系统,不需要挂载及卸载,更不存在文件系统的完整性问题,平衡损耗等措施可以视需要取舍,尤其在意外掉电时,该方法可将所有的读/写错误都限制在相对较小的局部,具有较好的应对掉电的能力。
  2.4 闪存烧写支持
  系统中的各种闪存可以用不同的方法写入数据,各种方法都有优缺点。可供选择的方法主要有两种:在芯片焊接前用通用的编程器烧写;在芯片焊接后进行在系统烧写(ISP)。使用通用的编程器可以快速大量地烧写芯片,适合大批量生产,但芯片一旦焊到印制板上,这种方法就不能用了。在系统编程(ISP)适合烧写已经焊在印制板上的芯片,通常1次只能写1块板子,但是不需要专用的设备,只要有1台计算机和相应的连接电缆(如USB电缆)及配套软件就可以工作,非常适合小批量生产和软件升级。另外,通过ISP软件提供的硬件寄存器读/写和目标存储器读/写功能,还可以实现一定程度上的电路板测试和调试功能。
  具体到AT91系列芯片可以借助芯片内固化的SAM-BA BOOT(见图1)提供的支持,通过USB或调试串口烧写系统中的闪存,尤其是通过USB烧写十分方便快捷,烧写Linux核心映像到NANDFLASH只需要几秒。对于AT91SAM9261,使用这种编程方式需要满足几个条件:
  (1)AT91SAM9261的BMS引脚在复位期间保持高电平;
  (2)SPl0的CS0对应的芯片不存在,或者对应的芯片中不存在有效的启动代码;
  (3)PC机与目标板之间通过串口或USB口连接;
  (4)PC机上安装SAM-BA工具软件。
  PC机上的SAM-BA工具软件可以支持对目标系统多种存储器的读/写,默认情况下可以支持DATAFLASH,NANDFLASH、内部SRAM和外部SDRA-M。尤其是对DATAFLASH的支持非常不错,可以自动识别各种不同容量的芯片,写入速度也比较快。但是它对NANDFLASH的支持并不理想,对于某些NANDFLASH芯片,操作会失败。对于NORFLASH,则根本不提供现成的支持。不过它提供了基于COM技术的动态库,并且公开了编程接口,可以使用C/C++程序或TCL脚本控制烧写过程,对于不提供官方支持的芯片,可以自行编写代码扩展的SAMBA的功能。以扩展NORFLASH编程功能为例,需要自行编写的有以下部分:
  (1)下载到目标板上运行的arm代码。这部分程序在SAM-BA v2.4中称为monitor,在SAM-BA v2.8中称为applet,其实就是供芯片内固化的SAMBA B00T调用的功能扩展部分;
  (2)PC机上的TCL脚本或C/C++程序。用于初始化硬件(如SDRAM控制器),向目标板下载monitor/applet,以及传送目标程序代码和控制烧写过程。

  如果使用TCL脚本,在相关脚本更改完成后,运行SAMBA工具软件,会出现新添加的NORFLASH标签页,如图4所示。在扩展的各部分功能基础之上,还可以编写一个综合性的自动化脚本,将所有的程序代码及数据(如Bootstrap,U-Boot,U-Boot的环境变量、内核映像、各分区的文件系统映像等)一次性写入目标板上不同芯片内的各个指定地址,以简化编程操作,提高生产效率。

  3 结语
  闪存是目前嵌入式系统中广泛应用的非易失存储介质,具有可以重复写入和存储容量大等优点,但是也存在写入次数有限,操作稍显复杂和速度慢等缺陷。若使用不当,会引起性能和可靠性方面的问题。通过深入分析现有闪存相关的硬件、软件特点,在系统中按需要采取具有针对性的应用方式,设计的系统在闪存应用方面获得了较好的效果:系统启动时间较短,工作稳定,顺利通过了高温老化试验及长达数月的现场应用考验。另外,采用自动化脚本与监控程序结合的闪存烧写设计,不仅简化了生产过程,还提供了一定程度上硬件调试的支持。
返回列表