datasheet
超过460,000+ 应用技术资源下载
pdf

基于ARM的嵌入式数据存储系统研究

  • 1星
  • 日期: 2014-03-05
  • 大小: 2.67MB
  • 所需积分:1分
  • 下载次数:2
  • favicon收藏
  • rep举报
  • 分享
  • free评论
标签: 基于ARM的嵌入式数据存储系统研究

随着电子技术的不断发展,嵌入式系统越来越多地在控制类、消费类、通讯类等电子产品广泛应用,嵌入式技术也越来越和人们的生活紧密结合。同时,计算机硬件的发展以及数据量的增加,对存储设备的要求也越来越高。 本文深入研究了嵌入式系统中数据存储和数据交换,提出了一套完整的嵌入式系统中数据存储和数据交换的设计方案,并详细介绍了其实现过程。Flash存储器由于体积小、功耗低、性能稳定等特点在便携式电子产品中得到了广泛的应用。Flash存储器主要有两种形式:Nor Flash和Nand Flash。Nor Flash具有XIP特性,可以直接在芯片上执行代码,而且读取速度较快。Nand Flash存储密度大、容量大、生产工艺简单、性价比高,但是控制方式复杂而且可能会存在一定的坏块。SD卡是近年来流行的大容量便携式存储卡。本系统中,我们以Flash和SD卡作为数据存储介质。在存储介质的选择方面,在系统内部采用了体积小、容量大、成本低的Flash,并采用Nor和Nand Flash相结合的方案:在Nor Flash上存储与系统相关的软件和程序,在Nand Flash上存储用户数据。系统外部采用安全性高、容量大、性能佳的SD卡作存储容量扩展。实现了基于Atmel公司ARM系列MCU的Flash存储器和SD卡的硬件电路的设计及底层驱动程序的设计。 本研究分别根据Nor和Nand Flash数据存储和操作特点,分析了JFFS2和YAFFS的特点以及各自的存储方式、断电保护、损耗平衡、垃圾回收等一系列的策略和机制,并在Nor和Nand Flash上实现并优化了这些管理机制。在SD上则采用目前主流操作系统(Windows,Linux等)所支持的FAT16文件格式,完成了从磁盘格式化到文件的读写等标准API函数,实现了嵌入式系统的高速数据交换。

太原科技大学 硕士学位论文 基于ARM的嵌入式数据存储系统研究 姓名:王拾亦 申请学位级别:硕士 专业:控制理论与控制工程 指导教师:闫学文 20090701 中 文摘 要 随着电子技术的不断发展,嵌入式系统越来越多地在控制类、消费类、通讯类 等电子产品广泛应用,嵌入式技术也越来越和人们的生活紧密结合。同时,计算机 硬件的发展以及数据量的增加,对存储设备的要求也越来越高。本论文深入研究了嵌 入式系统中数据存储和数据交换,提出了一套完整的嵌入式系统中数据存储和数据 交换的设计方案,并详细介绍了其实现过程。 Flash存储器由于体积小、功耗低、性能稳定等特点在便携式电子产品中得到了 广泛的应用。Flash存储器主要有两种形式:Nor FlashSDNand Flash。Nor Flash具有 XIP特性,可以直接在芯片上执行代码,而且读取速度较快。Nand Flash存储密度大、 容量大、生产工艺简单、性价比高,但是控制方式复杂而且可能会存在一定的坏块。 SD卡是近年来流行的大容量便携式存储卡。本系统中,我们以FlashSEISD卡作为数据 存储介质。在存储介质的选择方面,在系统内部采用了体积小、容量大、成本低的 Flash,并采用Nor和Nand Flash相结合的方案:在Nor Flash上存储与系统相关的软件 和程序,在Nand Flash上存储用户数据。系统外部采用安全性高、容量大、性能佳的 SD卡作存储容量扩展。实现了基于Atmel公司ARM系列MCU的Flash存储器和SD卡的 硬件电路的设计及底层驱动程序的设计。 为了有效的管理存储介质上的数据,同时为了方便与PC进行数据交换,必须采 用一种标准的格式组织数据,这就需要用文件系统把数据以文件的形式组织起来。 本文分别根据Nor和Nand Flash数据存储和操作特点,分析了JFFS2和YAFFS的特点以 及各自的存储方式、断电保护、损耗平衡、垃圾回收等一系列的策略和机制,并在 Nor和Nand Flash上实现并优化了这些管理机制。在SD上则采用目前主流操作系统 (Windows,Linux等)所支持的FATl6文件格式,完成了从磁盘格式化到文件的读写等 标准API函数,实现了嵌入式系统的高速数据交换。 关键词:AT91RM9200;Flash存储器;SD卡;Linux设备驱动;文件系统 ABSTRACT With the constant development of electronic technology,embedded system is increasingly and widely used in such type of electronic product as control,consumption,communication,etc.Embedded technology is contacted with people’S life more and more closely.At the same time,the requirement of storage device is also developing due to the development of hardware of computer and the increasing of data.This paper has studied data storage and exchange in embedded system deeply,and has put forward to a set of intact design plan of data storage and exchange in embedded system, and has introduced its realization course in detail. Flash memories have been widely used due to their small size,low power consumption,characterized by stable performance in portable electronic products.Flash memory mainly has two forms:Nor Flash and Nand Flash.Nor Flash supports XIP.the codes can be executed directly in the chip,and high reading speed.Nand Flash memory has high density,large capacity,simple production technology,and the high performance—price ratio. However,its control is complex and has a certain degree of bad blocks.The SD card,a portable memory card which has big capacity,is popular in recent years.In this system,we use Flash and SD card as the data storage medium. In the choice of storage medium,we use Flash memory witch is small, hi曲一capacity and low cost inside the system.A combination of Nor flash and Nand Flash is used in the system.We store the program of system related data on Nor Flash,and users’data on Nand Flash.Use SD card witch is high security,high capacity and good performance to expand storage capacity. Based on ARM series MCU of Samsung,realized the design of the hardware circuit of Flash memory and SD card,and the design of the low level driver. In order to manage the data on the storage medium effectively,and the III convenience of data exchange with PC,one standard form must be adopted tO organize the data,which needs to store the data in the form of file with the file system.In this paper,we propose the data management requirements based on the characteristics of Flash,then analyze a series of strategies and mechanisms about data store,power failure protection,wear leveling, garbage collection and etc,and optimize these mechanisms to achieve.We use FAT 1 6 that is widely supported by maj or operating system(Windows, Linux,etc.)to manage the data on SD card.Accomplish almost all API functions such as formatting magnetic disc,reading and writing file,ere,and realized the high—speed data exchange between embedded system and PC. Key words:AT9 1 RM9200;SD Card;Flash memory;Linux device driver; File system Ⅳ 声尸 明 本人郑重声明:所呈交的学位论文,是本人在指导教师的指导下, 独立进行研究所取得的成果。除文中已经注明引用的内容外,本论文 不包含其他个人或集体已经发表或撰写过的科研成果。对本文的研究 做出重要贡献的个人和集体,均已在文中以明确方式标明。本声明的 法律责任由本人承担。 储签名:晕签垒! 日期:型4乙[. 关于学位论文使用权的说明 本人完全了解太原科技大学有关保管、使用学位论文的规定,其 中包括:①学校有权保管、并向有关部门送交学位论文的原件、复印 件与电子版;②学校可以采用影印、缩印或其它复制手段复制并保存 学位论文;③学校可允许学位论文被查阅或借阅;④学校可以学术交 流为目的,复制赠送和交换学位论文;⑤学校可以公布学位论文的全 部或部分内容(保密学位论文在解密后遵守此规定)。 储繇显丝鱼! 导师签名: !鱼!兰兰 啉型i:么竺二 日期:兰二孕:么:![. 第一章绪论 第 弟一一旱章 三百绪下论匕 引言 随着电子技术的不断发展,嵌入式系统越来越多地在控制类、消费类、通讯类 等电子产品广泛应用,嵌入式技术越来越和人们的生活紧密结合。而几乎所有的嵌 入式系统都面临一个数据存储和交换的问题。本文基于起重机数据采集系统的开发, 设计了一套以Flash Memory与SD卡为核心存储设备的嵌入式数据存储系统。起重机 数据采集系统相当于飞机上的“黑匣子”,采集并存储起重机运行时的数据。当起 重机运行时,数据采集模块负责采集起重机的各种运行数据,通过数据总线把采集 回的数据先存入存储模块,再将数据取出传到PC机上进行处理分析。 1.1嵌入式系统简介 嵌入式系统本身是一个模糊的定义。由于目前嵌入式系统在工业、服务业、消 费电子领域的应用范围日益扩大,而且,嵌入式应用千差万别,使得给出“嵌入式 系统”一个明确的定义变得很困难。根据IEEE(I雪际电气与电子工程师协会)的定义, 嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”【l】。这主要是从 应用上进行定义的,目前看其定义并不能充分表达出嵌入式系统的精髓。 “嵌入性”、“专用性"与“计算机系统”是嵌入式系统的三个最基本要素。 今天,国内普遍认同的定义是:嵌入式系统是以应用为中心,以计算机技术为基础, 并且软硬件是可裁剪的,适用于对功能、可靠性、成本、体积、功耗等严格要求的 专用计算机系统。嵌入式系统的实质是一种专用的控制特定设备或对象、完成特定 任务的计算机系统。嵌入式技术的核心思想,是最大限度地对硬件和软件量身定做, 以提高效率、性价比、实时性等。以生活中常见实例来讲,手机、数字视频设备等 电子产品都可认为是一个嵌入式系统或其中以嵌入式系统为重要核心,它们分别具 有通信、视频处理方面的针对性功能。现代生活产品、生产设备中嵌入式系统的影 子无处不在。与通用计算机系统相比,嵌入式系统一般具有如下特点: (1)嵌入式系统以专用性为最大特点,通常具有特定应用目的与场合要求,硬件 和软件量身打造。 (2)嵌入式系统一般对系统可靠性、执行速度和效率有特定要求,系统硬件设计 要求可靠,软件代码质量要求高,软件一般都固化在存储器芯片本身中,而不是存 储于磁盘等载体中。 基T-ARM的嵌入式数据存储系统研究 (3)嵌入式系统一般在成本、体积、功耗等方面具有较好表现,这得益于其量身 打造的特点,结构精简没有冗余,元器件选择遵循特定要求,总体性价比高。 (41嵌入式系统一般不具备自举开发能力,开发需要专门的开发工具和开发环 境,多采用主机目标机交叉开发方式。 嵌入式系统主要包括硬件和软件两部分。硬件部分包括处理器、存储器及外部 设备、I/O端口和图形控制器等;软件部分包括操作系统(OS)和用户应用程序。嵌入 式系统硬件的核心是嵌入式微处理器。它的功能、外设集成度、速度、功耗、体积、 成本、可靠性和电磁兼容性等方面均受到应用要求的制约,是各个半导体厂商之间 竞争的热点。嵌入式系统的软件是实现嵌入式系统功能的关键,软件要求固化存储, 代码的高质量、高可靠性和高实时性在许多场合也是基本要求。多任务嵌入式操作 系统是知识集成的平台,是嵌入式系统走向工业标准化道路的基础,是嵌入式系统 研究的重要方向。现在人们讲嵌入式系统时,某种程度上是指近些年来比较热门的 具有操作系统的嵌入式系纠21。 嵌入式系统已普遍应用于国民经济的各个行业,并且,随着嵌入式技术的发展, 其在人们生产、生活中的应用将更加广泛。我国国内的嵌入式市场处于整体启动阶 段,嵌入式市场的发展空间十分广阔。 1.2嵌入式系统的现状和发展趋势 近些年来,嵌入式系统的发展异常迅速,深入地渗透到各行各业。随着1971年Intel 推出第一片微处理器4004,其后各厂家迅速推出了8位、16位的微处理器。70年代, 以这类微处理器构成的嵌入式系统得到了迅猛的发展,广泛应用于工业仪器仪表、 医疗设备、机器人和家用电器等领域。到了80年代,随着微电子工艺水平的提高, 集成电路制造厂商开始把微处理器与外围I/O、A/D、D/A、串口、RAM和ROM相结 合起来,集成到一块芯片上,构成了面向I/O设计的微控制器,即单片机。单片机的 出现使得嵌入式系统应用更方便、更小型化,推动了嵌入式系统在仪器仪表、电脑 配件、智能设备上的应用。至lJ20世纪90年代,单片机、微处理器的性能又得到了很 大的提高,以DSP、ARM等32位处理器为代表的面向特定应用、高性能微处理器纷 纷推出,在分布控制、柔性制造、数字化通信、数字化家电和个人数字助理等领域 得到了广泛应用。 目前,嵌入式微处理器正朝着高速、高集成度和低功耗方向发展。片上系统 (System On a Chip,soc)设计使得嵌入式系统体积做得更小,功耗大幅降低,是未来 2 第一量绪论 手持设备的主要发展方向。当然,从总量来说,单片机系统在嵌入式系统中还将占 大多数。因为它能满足一般的控制需要,并且简单、稳定和廉价,在低端应用领域 中仍然占据主导地位。 嵌入式系统的复杂程度、功能规模的不同,对嵌入式系统软件系统的要求也不 同。对于一些简单的嵌入式应用系统,一般采用比较简单的单片机系统,软件部分 比较简单,不区分操作系统和应用程序,软件整体就是一个模块,全部由应用设计 人员自行设计开发。这类系统在实时性、系统效率等方而能够做得比较好。但这种 软件结构只适合于简单的应用系统,对于复杂的、多任务并行的系统,软件开发难 度比较大,扩展性差,并不易修改。 目前,随着微处理器速度以及芯片集成度的大幅度提高,嵌入式系统得到了飞 速的发展。随着嵌入式系统在通讯、数字化仪表、手机¥口PDA等方面的应用,嵌入 式操作系统得到了广泛应用,出现了许多复杂程度不同的嵌入式操作系统。同时, 围绕几种主流嵌入式操作系统的应用和发展,对于嵌入式系统应用软件的研究也逐 步展开,主要涉及网络协议和图形界面等方面。嵌入式系统软件的发展主要体现在 以下几个方面【列: (1)规模越来越大 早些年朦胧的嵌入式系统,如汽车上的倒车雷达、中控门锁等等,通常只有几 十行或上百行的代码。现在一些高端的嵌入式设备,如飞机、导弹上,仅一个飞行 控制系统就会达到几十万行的代码。 (2)操作系统的支持 当嵌入式系统越来越复杂时,如果仍采用人工的方式进行系统的各种调度,开 发难度很大,实时性、可靠性和可维护性都难以保证。引入操作系统进行任务的管 理和调度大大方便了应用系统的开发,使得系统的结构更加清晰,维护和扩展更加 方便。 (3)多任务且具有实时性 在多任务嵌入式操作系统中,合理的任务调度必不可少。单纯通过提高处理器 速度是无法达到目的的,这就要求嵌入式系统的软件必须具有多任务调度能力。现 在,多任务实时操作系统在这一领域的地位显得越来越重要。 (4)强大的联网功能 大部分传统的嵌入式操作系统都是孤立的单一系统,但在网络日益重要的今天, 越来越多的嵌入式系统有了联网的要求。嵌入式系统与各种网络相连,尤其是与 3 基于ARM的嵌入式数据存储系统研究 Intemet的连接,给系统提出了很多新的要求。系统需要支持TCPfIP协议和相关应用 程序,并且需要安全认证和控制问题,这些要求使应用系统变得更加复杂,需要更 多的资源。这时就需要具有网络功能的嵌入式系统的支持。 (5)窗口交互功能 当前,很多应用领域都要求嵌入式系统能够提供传统只有在PC和高端系统中才 能提供的类]以Windows的窗口交互系统。这对运行空间和运行速度都有苛刻要求的嵌 入式系统提出了挑战。 目前,嵌入式系统软件的发展趋势主要体现在以实时操作系统(RTOS)为基础的 软件平台专业化和商品化。操作系统是嵌入式系统的软件开发平台,最关键的部分 是操作系统内核。内核的基本功能包括任务管理、定时管理、存储器管理、资源管 理、事件管理、系统管理、消息管理、队列管理等。这些管理功能是通过内核服务 函数形式交给用户调用的,也就是操作系统(0S)的应用编程接口(API)。OS的引入, 解决了嵌入式软件开发标准化的难题。 1.3课题的研究背景和意义 目前,嵌入式系统已逐步发展成为一门学科,推动嵌入式系统朝着系统化、规 范化的方面发展。嵌入式系统学科和产业的发展使得设计人员能够从容地面对越来 越复杂的应用需求,通过软件和硬件的模块化设计大大地简化和加快了应用系统的 开发。 嵌入式计算机在应用数量上远远超过各种通用计算机,广泛应用于制造工业、 过程控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品 等领域。目前随着微处理器速度以及芯片集成度的大幅度提高,嵌入式系统得到了 飞速的发展,正走向人们生活的各个方面,手机、MP3、PDA、机顶盒等消费类电 子产品琳琅满目,展现在人们面前的嵌入式系统产品是功能更强、更人性化、更智 能的小家电。工厂中各类智能仪表、控制系统、手持设备等也都逐步装备了功能更 强的嵌入式系统,使得数据采集、传送和控制更加先进,操作更方便。 目前,嵌入式系统的数量大、种类多,想躲避嵌入式系统的发展潮流是不可能 的。虽然嵌入式市场的增长主要是嵌入式系统的应用增多,但不可小视微处理器的 高速发展。我们知道,ARM7系列微处理器的典型处理速度为0.9MIPS/MHz,常见的 ARM7芯片系统的主时钟为20"-"133MHz;ARM9系列处理器的典型处理速度为 1.1MIPS/MHz,常见的ARM9的系统时钟频率为100~233MHZ。面对要求越来越高 4 第一章绪论 的消费群体,或者为满足更高端应用的需要,使用高性能的处理器己成为必然趋势。 本系统采用的是Atmel的ARM9处理器AT91RM9200,它有丰富的外设资源,这可以 简化的硬件外围电路的设计,功耗低,在正常操作模式下最大功耗只有24.4mA,而 且工作温度范围是.40℃"--85℃,可工作在比较恶劣的气候条件下,能适应本课题所 设计的系统主要面向于户外、环境变化比较大的场合下的要求【41。 从20世纪08年代开始,市场上出现各种各样的商用嵌入式操作系统,这些操作 系统大部分都是为专有系统开发的,从而逐步演化成了现在各种形式的操作系统百 家争鸣的局面。这些操作系统有Vxworks、pSOS、Neculeus、QNX、Linux、uC/OS 和WindowsCE等。免费型的目前主要有Linux和uC/0S。由于Linux的源代码是公开的、 免费的,功能强大,稳定,健壮;非常优秀的网络功能,图像,文件管理功能,以 及多任务支持功能;可裁剪性,有成千上万的开发人员支持;有大量的且不断增加的 开发上具。本课题选择了Linux作为研究的操作系统【5】。 Flash存储器(Flash Memory)是一种非易失性固态存储器,它是完全非易失性 存储器,能提供可靠的数据掉电保护;而且它可以在线写入,存取速度快,是一种 高可靠性、高密度的固态存储设备。随着闪存容量大小、存储密度的提高及价格的 不断降低,各种Flash存储器己逐渐成为嵌入式系统中最主要的存储设备。 从总体发展趋势上看,由于嵌入式系统复杂性的不断提高及大容量存储器的出 现,如何方便、高效地管理存储设备已成为嵌入式系统开发中的一个重要问题。而 且,作为嵌入式系统的主要组成部分,存储子系统的性能直接决定了系统整体性能 的高低,而系统的其它组件及各种应用更要求系统能够提供一种统一、通用的存储 器控制及访问机制。因此,对Flash存储器设备的管理及访问技术研究成为了嵌入式 系统中一个十分重要的课题,它不仅在嵌入式系统I/0管理与访问机制上有一定学术 研究意义,而且对嵌入式系统设计开发有着重要的应用指导价值。 SD卡(Secure Digital Memory Card)是一种基于半导体快闪记忆器的新一代记忆 设备。由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。 SD卡具备串行和随机存取能力。可以通过专用优化速度的串行接口访问,数据 传输可靠。其接口完全符合最新的消费者标准,叫做SD卡系统标准,由SD卡系统规 范定义。SD卡系统是一个新的大容量存储系统,基于半导体技术的变革。它的出现, 提供了一个便宜的、结实的卡片式的存储媒介。 由于它具有安全性高,容量大,性能佳,环境适应性好等优点。使它在短短三、 四年的时间里已渗入到不同数码媒体中,如轻便型数码相机、手提摄录机、手提电 基于ARM的嵌入式数据存储系统研究 脑、掌上电脑、MP3播放机、多功能电视机等,成为当今世界上被采用的最多的闪存 卡接口。市面上主流的PDA、数码相机、MP3的闪存卡接口大多为SD卡,同时仿照CFI 接口的成功经验,SD接口也开发成为了新一代的SDl0接口,通过SD卡的总线连接其 他外设,例如无线网卡、摄像头等,在数码领域得到的广泛应用。纵然SD卡具有如 此多的优点,而其作为在工业数据采集系统中的应用还不是很多。而且,利用SD卡 体积小、成本低、容量大、安全高速、可移动存储等优点,可充分提高系统的灵活 性及性价比。 1.4本文结构及主要内容 第一章,绪论。主要介绍了嵌入式系统以及嵌入式系统的现状,讨论了本课题 的研究背景与意义。 第二章,系统整体介绍。介绍了系统的整体设计方案及各个模块的功能特征等。 硬件方面主要介绍了删9处理器AT91RM9200芯片的工作原理以及各个功能模块 的特性。软件方面论述TLinux操作系统的原理与特征,最后论述了嵌入式软件开发 平台的搭建,为整体系统开发打下基础。 第三章,系统硬件设计。描述了各个存储模块与ARM处理器的硬件接口。 第四章,存储模块设计。主要介绍了存储模块,包括Flasy memory、SD卡基于 Linux下的驱动实现。 第五章,文件系统设计。主要讨论了本系统中各个功能模块的文件系统的实现。 第六章,总结与展望。 6 第二二章系统整体介绍 第二章系统整体介绍 2.1系统整体设计方案 本文基于起重机的运行数据采集系统的开发,本系统作为整个系统中的存储模 块用来保存系统中的运行程序及采集数据,既要完成整个系统操作系统及全部运行 代码的存储以及采集数据的存储,还要设计移动存储设备以完成与PC机的数据交换。 本系统要求性能可靠,存取速度快,而且断电数据不丢失。 从整体看,硬件方面主要包括删处理器,SD洲内存,Flash存储模块,SD 卡存储模块,系统整体硬件结构如图2.1所示。软件方面主要包括嵌入式Linux操作系 统,底层硬件驱动模块、文件系统及上层应用程序。 数据采集模块l > AT9lRM9200 ■●●●■■■●■■●■■■■●●●●●■●■●●■ ●●■■●■●●■●●●■●●■■●■■●■■●■■● b=辛 SDRAM 存储模块 EB工 Nor FIash 《 :> b—冷 F1ash .Nand M C《 工 SD Card :) 图2.1系统整体结构框图 Fig.2.1 The overall diagram of system 2.2系统硬件设计方案 2.2.1 ARM处理器介绍 本系统采用的MCU是Atmel公司推出I拘1 6/32位RISC芯片AT9 1 RM9200[61。 AT91RM9200是完全围绕ARM920T ARM Thumb处理器构建的系统。它有丰富的系 统与应用外设及标准的接口,从而为低功耗、低成本、高性能的计算机应用提供了 一个单片解决方案。 AT91RM9200包括一个高速片上SRAM工作区及一个低等待时间的外部总线接 口(EBI),以完成应用所要求的片外存储器和内部存储器映射外设配置的无缝连接。 EBI有同步DRAM(SDRAM)、 Burst Flash及静态存储器的控制器,并设计了专用 7 基-j-_ARM的嵌入式数据存储系统研究 电路以方便与SmartMedia、CompactFlash及NAND Flash连接。 高级中断控制器(AIC)通过多向量,中断源优先级划分及缩短中断处理传输时 间来提高删920T处理器的中断处理性能。 外设数据控制器(PDC)向所有的串行外设提供DMA通道,使其与片内或片外 存储器传输数据时不用经过处理器。这就减少了传输连续数据流时处理器的开销。 包含双指针的PDC控制器极大的简化了AT91RM9200的缓冲器链接。 并行I/O(PIO)控制器与作为通用数据的I/O复用外设输入/输出口线,以最大 程度上适应器件的配置。每条口线上包含有一个输入变化中断、开漏能力及可编程 上拉电阻。 电源管理控制器(PMC)通过软件控制有选择的使‘lj‘‘v,/禁用处理器及各种外设 来使系统的功耗保持最低。它用一个增强的时钟产生器来提供包括慢时钟(32 KHz) 在内的选定时钟信号,以随时优化功耗与性能。 此外,它还提供一系列符合工业标准的外设,可在音频、电信、Flash卡红外 线及智能卡中使用。 为完善性能,AT91RM9200集成了包括JTAG.ICE、专f-j UART调试通道 (DBGU)及嵌入式的实时追踪的一系列的调试功能。这些功能使得开发、调试所有的 应用特别是受实时性限制的应用成为可能。 AT91RM9200的主要特性如下吐 1、工作于180MHz时性能高达200MIPS,存储单元管理;16.K字节的数据缓存, 16.K字节的指令缓存,写缓冲器。 2、低功耗,VDDCODE电流为30.4mA,待机模式电流为3.1mA。 3、附加的嵌入式存储器:SRAM为16K,ROM为128K。 4、外部总线接El(EBI):支持SDRAM,Static Memory,NAND Flash,Burst Flash。 5、提高性能而使用的系统外设:增强的时钟发生器与电源管理控制器;调试 单元、两线UART并支持调试信道;两个有双PLL的片上振荡器。 6、10/100Base.T型以太网卡接口:独立的媒体接口(MII)和简化的独立媒体接 m(RMII);对于接受与发送有集成的28字节FIFO及专用的DMA通道。 7、4个通用同步/异步接收/发送器(USART)。 8、主栅从机串行外设接13(SPI):8~16位可编程数据长度,可连接4个外设。 9、两线接口(TWI):主机模式支持,所以两线Atmel EEPROM支持。 10、电源供应:VDDCODE,VDDOSC及VDDPLL电压为1.65V~1.95V; R 第二童系统整体介绍 VDDIOP(Pb设I/O)及VDDIOM(存储器I/O)电压为1.65V---3.6V。 11、提供了208引脚PQFP及256球状BGA两种封装。 2.2.2系统存储模块设计 由于现场环境的影响,要求嵌入式系统的存储介质断电数据不丢失,体积小, 可靠性高,存取速度快,通用性好。目前常见的大容量存储介质有EEPROM[81,大容 量Flash芯片、存储卡、硬盘等。EEPROM能按位写入和删除,不过由于是按位操作, 因此写入慢、耗电量高,而闪存(Flash Memory)擦除以块为单位,编程以页为单位, 写入速度快、耗电量低,而且,闪存的存储密度要比EEPROM高,其容量可达4Gb。 目前市场上的绝大多数存储卡都是以Flash[9】为存储模块的,其中SD卡(Secure Digital Card)是一种基于闪存(Flash Memory)的存储卡,由于它具有安全性高,容量大,性能 佳,环境适应性好等优点,目前已有越来越多的消费类数码产品采用SD卡作为存储 介质,如数码相机、MP3播放器、掌上电脑等等。相比之下,Flash芯片和存储卡能 更好地满足嵌入式系统对存储介质的要求。本系统中,内部采用Flash芯片用来存储 Bootloader、操作系统、文件系统、应用程序及采集回的数据等;用SDRAM来暂存 操作系统和应用软件运行时的数据;系统外部采用SD卡扩展存储空间,作为移动存 储设备,完成与PC机的数据交换。 本系统中采用了两种最常见类型的Flash:Nor Flash、Nand Flash。这主要是因为 两种芯片的不同特性。NOR型与NAND型闪存的区别很大,打个比方说,NOR型闪 存更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而NAND型 更像硬盘,地址线和数据线是共用的I/O线,类似硬盘的所有信息都通过一条硬盘线 传送,而且NAND型与NOR型闪存相比,成本要低一些,而容量大得多。因此,NOR 型闪存比较适合频繁随机读写的场合,通常用于存储程序代码并直接在闪存内运行, 因此我们在本系统设计时就采用Nor Flash来存储系统程序;NAND型闪存主要用来存 储资料数据,在本系统中,我们采用Nand Flash来存储系统数据。这样,我们就充分 的利用了两种Flash存储设备的特点,使系统性价比更高。 2.3系统软件设计方案 2.3.1软件开发平台搭建 大多数嵌入式软件开发采用交叉编译环境【10】,即开发平台使用通用计算机或服 务器,而实际运行环境是具体的嵌入式硬件系统。所谓交叉编译,就是在一个平台 上生成另一个平台上的可执行程序。交叉编译是嵌入式开发过程中的一项重要技术, 9 基丁二ARM的嵌入式数据存储系统研究 它的主要特征是某机器中执行的程序代码不是由本机编译生成,而是由另一台机器 编译生成的。一般把前者称为目标机,后者称为宿主机(主机)。如图2.2。采用交 叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用, 因而只好将编译工程转移到高性能的主机中进行。因此需要在宿主机上建立合适目 标机的交叉编译环境。程序在宿主机上编译、链接,生成可执行文件,通过一定的 方法烧写到目标机上,然后在目标机上运行。 i苗聋擎。 臼玩学L E饥emet 图2.2嵌入式趸叉开发环境 Fig.2.2 The embedded cross—development environment 建立交叉开发环境首先应该在宿主机上安装Linux操作系统。考虑到两种操作系 统来回切换造成的不便,故采用虚拟机的形式在Windows XP下安装虚拟机软件,再 在虚拟机上安装Linux操作系统,而且,安装完VMware Tools之后可以方便的进行两 个系统之间的数据同享,并且完全不影响Linux操作系统的性能,为系统开发节省了 大量的时间,我们采用的Linux版本是RedHat9。 安装完操作系统之后就是在Linux上建立交叉编译器了,由于本系统Linuxl为核为 2.6版本的内核,故系统采用的交叉编译器是cross.3.3.4。将cross.3.3.4.tar.bz2安装到 /usr/local/目录下: ¥cd/usr/local ¥makedir alTll ¥cd arm Star jxvf cross·3.3.4.tar.bz2 配置系统环境变量: ¥export PATH=/usr/local/arm/3.3.4/bin:¥PATH 这样,我们就把交叉编译器安装到-了/usr/local/arm/3.3.4/bin目录下。 Bootloader是系统启动时-4,段引导代码,主要用来初始化硬件设备、建立内存 空间映射,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内 核准备好正确的环境。Bootloader流程不管什么样的硬件环境基本都差不多,一般都 lO 第一二章系统警体介绍 是先关闭中断,设置CPU速度和时钟频率,初始化RAM,将代码从FLASH中拷贝到 RAM空间,设置堆栈,这样就搭建一个C运行环境,之后,就跳转到C入口点,之后 就是初始化设备驱动、设置Linux!内核参数、启动Linux。BootLoader除了作为一个 BootLoaderP[-,还是一个烧写器。在BootLoader下,可以通过串口、网口下载Linux 内核或者应用程序到RAM或Flash中。本系统采用fl勺Bootloader是U.Boot。 仔细阅读U.Bootl拘readme、Makefile矛[1源代码之后,在Linux环境下使用以下方 法编译: 在Linux系统下,使用下面的命令编译, ¥cd∞.BOOT目录) //进入目录 ¥make mrproper //初次编译是需要 ¥make at9 1 rm9200dk corufig ¥make all //编译 ¥gzip_c u—boot.bin>u—boot.gz//压缩为gz文件 编译boot.bin: ¥cd(AT9 1砌Ⅵ9200一Boot目录) ¥make 编译loader.bin: ¥cd(AT9 1砌Ⅵ9200—Loader目录) ¥make 编译好之后,将U.BOOT烧写至lJFlash中便可运行。接下来就是Linux内核的配置 和编译了。在这之前,我们需要先对内核源码的Makefile文件做下修改,主要是制定 处理器的类型和交叉编译环境的路径,用vi编辑器打开内核源代码项层的Makefile文 件,修改下面两行代码: ARCH:=ai'in ;配置目标板为arm CROSS COMPILE:=/usr/local/arm/3.3.4/bin/arm.1inux;指定交叉编译器的路径 接下来就是进行内核的裁剪和配置了。Linux内核有上千个配置选项,配置复杂, Linux采用配置系统来简化配置,配置系统包括Makefile、Kconfig、配置工具。Makefile 文件规定内核的编译规则,顶层Makefile管理整个Linux的内核配置编译;不同的内 核配置方式提供了不同的配置工具,script目录下提供了这些配置工具,我们经常使 用ff习memuconfig目标使用mconf。2.6版本之前的配置文件一般口qconfig.in,2.6版本时 引A.TKconfigPE置文件,是内核配置选项的源文件,这些Kconfig文件形成树状菜单。 11 基于ARM的嵌入式数据存储系统研究 这里,我们使用memuconfig来配置和裁剪内核。 首先将源码拷贝到文件系统/usr/src/目录,然后解内核压源码包,然后进入Linux 源码目录,进行内核裁剪配置,输入如下命令: ¥make memuconfig 这时,我们可以看到内核的配置菜单,内核配置菜单中一般有三种选项: Y.一将该功能编译进内核 N.一不将该功能编译进内核 M——将该功能编译成模块,可以在需要时动态插入到内核中 我们根据自己的需要配置自己合适的内核,在这里,我们主要选择模块化支持、 相关的硬件支持、驱动支持、文件系统支持及网络的支持等。其他的不一一介绍。 配置完成之后退出,编译,然后生成需要的内核映像。可以通过串口或网线等 下载到flash芯片启动。 2.3.2 Linux操作系统介绍 不可否认,Linux是最受欢迎的自由电脑操作系统内核。它是一个用C语言写成, 使用POSIX标准的符合GNU通用公共版权协议(简称GPL)的、完全公开源代码的类 Unix操作系统。Linux最早是由芬兰大学生Linus Torvalds为尝试在Imel386芯片系统上 提供自由免费的类Unix操作系统而开发的。早期有一些Minix黑客提供了协助,而今 天全球无数程序员正在为该计划提供无偿帮助。由于Linux采用“开放开发模式” (OpenDevelopmem Model),摒弃了传统商业开发模式的种种弊端,因此,从一开始 Linux就受到世界各地编程专家的广泛关注,他们不仅为Linux编写了大量的驱动程序 和应用软件,还不断发现和修正Bug,使其在短短几年时间内就发展成一个相当完善 的操作系统。尽管Linus Torvalds的初衷并不是使Linux成为一个可移植的操作系统, 而今天,Linux却是全球移植最广泛的操作系统内核,从小型的掌上电脑到IBM的巨 型电脑都可以看到Li肌x内核的踪迹。 Linuxl为核是一个提供硬件抽象层、磁盘及文件系统控制、多任务调度等多种功 能的系统软件。需要说明的是,一个内核并不是一套完整的操作系统,一套基于Linux 内核的完整操作系统叫作Linux操作系统,或是GBU/Linux。Linux操作系统软件包不 仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软 件、以及带有多个窗口管理器的X.Windows图形用户界面,允许我们使用窗口、图 标和菜单对系统进行操作。Linux是一个基于POSIX和UNIX的多用户、多任务、支持 多线程和多CPU的操作系统。它能运行主要的UNIXI具软件、应用程序和网络协议, 12 第-二章系统整体开绍 它支持32位矛1164位硬件。Linux继承了UNIX以网络为核心的设计思想,是一个性能 稳定的多用户网络操作系统。它主要用于基于Intelx86系列CPU的计算机上。 Linux以它的高效性和灵活性著称。为避免内核过于臃肿,Linux采用模块化的设 计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部 的Unix特性,具有多任务、多用户的能力。 目前在嵌入式系统里基于删微核的嵌入式处理器己经成为市场主流,而且随 着ARM技术的不断推广,建立面向ARM构架的嵌入式操作系统也成为当前研究的热 点问题。目前已经涌现出了许多的嵌入式操作系统,例如TorZnadolj,'3Vxwork、微软 的Windows CE等等。在众多的嵌入式操作系统里,很多开发人员选择的却都是Linux, 这主要是因为它公开源代码,可以让任何人将其修改移植到自己的目标平台使用。 列的删处理器。 ARM Linux支持包括ARM610、ARM710、ARM720T、ARM920T、StrongARM等系 嵌入式Linux(Embedded Linux)是指对Linux经过特定的配置和裁减后,能够固化 在容量只有几兆字节或几十兆字节大小的存储器芯片中,应用于特定场合的Linux操 作系统。嵌入式操作系统是嵌入式系统软硬件资源的控制中心,它以尽量合理有效 的方法组织多个用户共享嵌入式系统的各种资源。其中的用户就是运行在系统程序 之上的所有应用软件。所谓合理有效的方法,就是指操作系统如何充分利用硬件资 源来实现多任务处理。复杂的操作系统都支持文件系统,这主要是为了方便组织文 件并对其规范化操作。 与其他嵌入式操作系统相比,嵌入式Linux具有众多的优点【n】。 (1)源代码开放性 Linux自它诞生之日起就成为自由软件的一员。任何人,只要遵守自由软件基金 会发布的通用公共许可证(GPL)条款,就可以免费自由使用Linux源代码。而大多数 的商业操作系统,例!tNVxworks、Windows CE会对每套操作系统收取一定的许可证 费用。Linux提供了一整套开发工具,其中绝大部分都来自GNU的研究项目,还有相 当数量的程序可用于服务器、网络和专门的功能如统计和科学计算等工具。Linux是 可以定制的,其系统内核最小只有约134kB,在内核代码完全开放的前提下,不同领 域和不同层次的用户可以根据自己的应用需要很容易的对内核进行改造,在低成本 的前提下,设计和开发出真正满足自己需要的嵌入式系统。 (2)高度稳定性 相比现在流行的一些操作系统,Linux在PC硬件上的运行是非常可靠和稳定的, 13 基于ARM的嵌入式数据存储系统研究 嵌入式Linux对大多数微处理器来说也非常好。Linux源代码的注释清晰,相关文档也 非常齐全。这样可以控制和处理移植所出现的任何问题。许多不同处理器的指令代 码是相通的,所以移植集中在差异上,其中大多数是在内存管理和中断控制领域。 所以,一旦移植成功它们就非常稳定。 (3)强大的网络支持功能 Linux诞生于英特网并具有UNIX的特性,这就保证了它支持所有标准的因特网 协议,并且可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。 (4)丰富的开发工具 Linux具备一整套开发工具链,很容易自行建立嵌入式系统的开发环境和交叉运 行环境,并且可以跨越嵌入式系统开发中仿真工具的障碍。一般开发嵌入式系统的 程序调试和跟踪都是使用仿真器来实现的,并且这些开发工具设计时已经考虑到支 持各种不同的微处理器结构和调试环境。Linux基于GNU的工具包提供了完整与无缝 交叉平台开发工具,从编译器到底层调试。 (5)广泛的硬件支持 无论是RISC还是CISC,32位还是64位等各种处理器,Linux都能在上面运行。 Linux的众多优点使它支持几乎所有处理器并在嵌入式领域获得了广泛的应用,并出 现了数量可观的嵌入式Linux系统。 2.3.3设备驱动程序设计 在嵌入式系统开发过程中,驱动程序开发是非常重要也是必不可少的一部分, 这主要是因为嵌入式产品的硬件特性千差万别,因此要找到一个通用的驱动模板很 难,这就需要我们设计开发适合自己硬件电路的驱动程序。 在本系统中,驱动程序是基于Linux操作系统环境下工作的。Linux操作系统的设 计遵循了U11ix操作系统对设备操作的思想,就是将所有的设备看成文件,也就是说, 把设备纳入文件系统的范畴来管理。这样一来,对文件操作的系统调用大都适用于 设备文件。因此,对于一个具体的设备而言,文件操作和设备驱动是同一个事物的 不同层次。对于一个系统,我们可以把它划分为应用、文件系统和设备驱动三个层 次。应用程序通过层层系统调用完成对底层硬件的访问而并不是直接对硬件进行操 作。当用户进程发出处理请求时,系统把该处理请求任务交给文件系统,文件系统 通过驱动程序提供的接口将任务下放到设备驱动程序,驱动程序则根据需要对设备 控制器进行操作,设备控制器再去控制设备本身【12】,如图2.3所示。 14 第_二章系统繁体介绍 用户进程 上 文件系统 ’ 设备驱动程序 上 设备控制嚣 上 设备本身 图2.3用尸进程请求设备服务流程 Fig.2.3 The flow of user processes requesting equipment service 这样通过层层隔离,对用户进程基本屏蔽了设备的各种特性,这样做的一个主 要的好处是使我们对设备的操作更为方便、有效、更有组织,而且更接近人的思维 方式。 如果从另一个角度来看驱动程序,那么它可以看作应用和实际设备之间的一个 软件层。这种定位使驱动程序编写者可以选择如何展现设备驱动特性:即使对于相 同的设备,不同的驱动程序也可以提供不同的功能。实际的驱动程序设计应该综合 考虑三方面的因素:提供给用户尽量多的选项、编写驱动程序占用较少的时间以及 尽量保持简单而不至于错误丛生。所以说,驱动程序是实现的一种“机制”——提 供什么功能,而不是一种“策略"——如何使用这些功能。驱动程序应提供给上层 软件更多的选项和功能,使上层应用能方便、高速地访问底层硬件。这才是驱动程 序体现的价值所在。 Linux系统的设备分为字符设备(char device),块设备(block device)和网络设备 (network device)三种。字符设备是指存取时没有缓存的设备。块设备的读写都有缓存 来支持,并且块设备必须支持随机存取(random access),字符设备则没有这个要求。 典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘、软盘设备等。 本系统存储模块的主要存储介质:Flash、SD卡都是属于块设备。 块设备驱动程序提供了面向块的设备的访问,这种设备以随机访问的方式传输 数据,并且数据总是大小固定的块,512/1024字节。块设备和字符设备有很大的区别, 比如块设备上可以mount文件系统,而字符设备则不可以。显然,这是随机访问带来 的优势。另外,数据经过块设备时的操作相比字符设备需要多经过一个数据缓冲层 基丁ARM的{l}:入式数据存储系统研究 (buffer cache mechanism),这主要是针对随机访问为了提高系统整体吞吐量而设计 的。缓冲层的主要作用一是作为数据缓冲区,存储己取得的数据,以便加快访问速 度——如果需要从块设备读取的数据已经存在于缓冲区,则使用缓冲区的数据,避 免了耗时的设备操作和/dO操作;二是对块设备的/dO访问扇区的位置进行优化排序, 尽量保证访问时磁头沿直线移动,这在系统中被称为电梯调度算法。 前面提到设备驱动程序设计的“原则”问题,即“机制"的实现,也就是提供 底层的操作和接口。所以作为底层的设备驱动程序完成以下的功能: (1)对设备初始化和释放。 (2)把数据从内核传送到硬件和从硬件读取数据。 (3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据。 (4)检测和处理设备出现的错误。 从程序结构角度而言,驱动程序是子程序和数据的集合,是输入输出设备的软 件接口,它的任务就是向系统提供接口函数,所以简单地说编写驱动程序就是实现 这种接口函数。Linux设备驱动程序与外界的接口可分为三部分: 驱动程序与内核的接口,这是通过数据结构file_operations来完成的。 驱动程序与系统引导的接口,这部分利用驱动程序对设备进行初始化。 驱动程序与设备的接口,这部分描述了驱动程序如何与设备进行交互,这与具 体的设备密切相关。 根据功能,驱动程序代码可以分为如下几部分: 驱动程序的注册和注销 设备的打开与释放 设备的读写操作 设备的控制操作 设备的中断和查询处理 与其功能相对应,Linux的设备驱动程序由下面几部分组成【13】: 1.初始化函数 在系统初始化时,系统轮流调用各个设备驱动程序的初始化函数。初始化函数 向系统注册自身,这里的注册包括:注册自己对接口函数集的实现,申请irq号,注册 中断处理程序,申请并注册/dO地址范围等。在初始化时还要完成对设备硬件的检测、 初始化等工作。有的驱动程序把资源申请推:ig_到opendP完成。 2.对驱动程序接1:3函数的实现【14】 16 第二章系统警体介绍 这部分又称为驱动程宁的上半部分,调用这部分是系统调用的结果。系统认为 这部分程序在执行时和进行调用的进程属于同一进程,只是由用户态转换成了内核 态,且具有进行此系统调用的用户程宁的运行环境,因此可以在其中调用与进程运 行环境有关的函数。对于字符和块设备,要实现的接口函数定义在file operations中; 对于网络设备,要实现的接口函数定义在结构device中。 3.中断处理程序 这部分又称为驱动程序的下半部分,Linux系统并不是直接从中断向量表中调用 设备驱动程序的中断服务子程序,而是PhLinux系统接收硬件中断,再由系统调用中 断服务子程序。因为中断可以产生于任何一个进程运行时,因此中断服务子程序被 调用时不能依赖于任何进程的状态,因而也就不能调用任何与进程运行环境有关的 函数。所有这些中断都要在设备驱动程序中处理。 4.设备专有部分 设备种类五花八门,其控制方式也各不相同,所以为了实现接口函数和对设备 进行合理的管理,设备驱动程序还定义了一些自己的数据结构和管理函数。 根据Linux程序设计思想,本系统中设备驱动程序的设计采用分层设计的思想: 下层实现设备的基本操作:读/写、命令设置等,上层提供API接口供文件系统调用。 这样做使系统结构更加清晰而且也方便以后的软件维护和移植。 2.3.4文件系统设计方案 文件系统设计是本文设计的重点之一。为了有效的管理存储介质上的数据,同 时为了方便与PC进行数据交换,必须来用一种标准的格式组织数据,这就需要用文 件系统把数据以文件的形式存起来。Linux的开发性使它能够支持多种文件系统,如 Ext2、JFFS2、YAFFS、Cramfs、FAT等。各种文件系统的特性又千差万别,所以, 对文件系统的选择也是提高系统性能的一个很重要元素。由于本系统采用Flash存储 器以及SD卡作为主要的存储设备,也就是说要在这几个存储介质上面建立起相对合 适的文件系统来管理上面的数据。目前对Flash支持较好的主要是JFFS2和YAFFS文件 系统115J。 针对Flash存储器的特性以及系统性能的要求,我们在设计文件系统时需要考虑 到如下几个方面: (1)崩溃恢复:嵌入式系统的运行环境一般比较恶劣,但同时又要求较高的可靠 性,这就对Flash文件系统提出了较高的要求:无论系统掉电或程序崩溃,都不能影响 文件系统的~致性和完整性。 17 基于ARM的嵌入式数据存储系统研究 (2)资源限制:嵌入式系统资源非常有限,文件系统本身的大小以及速度特性方 面要求很高。所以在考虑文件系统设计时,这方面的设计一定要考虑到。 (3)耗损平衡:Flash擦除块擦除次数有限,文件系统对Flash的使用必须充分考虑 该特性,最好能均匀使用Flash的每个块,以延长Flash的使用寿命【l引。 (4)垃圾回收:任何存储器在分配使用过一段时间后,都会出现空闲区和文件碎 片,可能导致系统空间不够用,这就需要进行垃圾回收操作,以保证存储空间的高 效使用。通常Flash擦除操作是以块为单位的,垃圾回收也应以块为单位,回收时先 重写块上的全部数据,然后再擦除整个块【1酬。 (5)空间管理机制:为了保证垃圾回收操作的顺利进行,必须保留一部分空闲数 据块,用于存储擦除块上的有效数据。但是如何确定当前垃圾回收操作究竟需要多 少空间呢?通常人们采用的一种算法是:在对用户空间执行写操作之前,对于每一个 Flash分区都保留若干个空闲块。但是分区的大小直接影响系统开销,如何解决这一 问题,也是我们需要考虑的一个重点。 (6)坏块管理:Nor Flash中通常附带了一些块,在产生坏块后用来替代坏块。而 Nand Flash中没有多余的块来替代,而且Nand Flash在出厂时就存在坏块。所以对于 Nand Flash,坏块就要由文件系统来进行维护。 考虑到与Windows操作系统的数据共享与兼容性等问题【l丌,在SD卡上采用 FATl6文件系统。 第三量硬侣设计 第三章硬件设计 本章主要介绍系统整体的硬件部分设计。如第二章所介绍,本系统的硬件存储 设备主要包括Flash memory以及SD Card。所以系统主要的硬件设计将围绕这两个 存储模块与9200微处理器之间的接口连接。 AT91RM9200的外部总线接D(EBI External Bus Interface)设计用以确保多个外设 和基于ARM器件的内置控制存储器间的正确数据传输。静态存储器、SDRAM及 Burst Flash控制器均可作为EBI上的外部存储控制器。这些外部存储控制器可以处理 多种类型的外部存储器以及外部设备,女NSRAM、PROM、EPROM、EEPROM、Flash、 SDRAM及Burst Flash。EBI通过集成电路支持CompactFlash与SmartMedia协议从而 极大的降低了对外部组件的需求。此外,EBI可处理多达8个外设的数据传输,每个 外设分配8个在内置存储控制器中定义的地址空间。数据通过16位或32位数据总线进 行传输,地址总线高达26位,8个芯片选择121(NCS[7:0])和在不同外部存储控制器间 复用的多个控制引脚进行。 3.1 Nor Flash的硬件连接 Nor Flash的地址和数据线直接挂在系统的总线上,nBYTE有效表示以16位方式 访问,如图3.1。 ●揪 图3.1 Nor Fla sh硬件连接电路图 Fig.3.1 Nor flash hardwal℃connection circuit diagram 19 基于ARM的嵌入式数据存储系统研究 3.2 Nand Flash的硬件连接 相对Nor Flash而言,Nand Flash的连线相对比较简单,85-I/O线连接数据总线, 其余的直接连接系统的EBI相关引脚即可,如图3.2所示。 3.3V r匹 K PCI4 j—1 釜~ 一聊一鹏眦m一观一陋琵一旺粥瑚 U O7 06 05 O4 03 O2 脚胁胁b O㈣胁衄㈣0l姗 ~一一一一一一一一 挖一卯 眦眦X ℃℃X D[15 3.3V 6P∞ 图3.2 Nand F1ash硬件连接电路图 Fig.3.2 Nand Flash hardware connection circuit diagram 3.3 SD卡硬件连接 SD卡采用卡座与9200相连,本系统中,SD卡采用SD模式与主机通信,其9个引 脚分别是:4条数据线、3条电源线、命令及时钟线。9200的多媒体接口(MCI)接口的 设计大大简化了SD卡与9200的硬件连接,其中各个引脚分别与9200的MCI对应的引 脚相连即可,并分别对数据线增力H10K的上拉电阻与0.1ⅣF的滤波电容。SD卡座的检 测引脚接至U9200的外部中断引脚,用来检查卡的插拔状态,并产生中断。接口原理 如图3.3所示。 3 3V 图3.3 sD卡硬件连接电路图 Fig.3.3 SD card hardware connection circuit diagram 20 第四章存储模块设计 第四章存储模块设计 4.1 MTD存储技术 Linux中对Flash设备提供了很好的支持,那就是MTD子系统。MTD(Memory Technology Device存储技术设备)是用于访问存储设备,女NROM、Flash等的Linux子 系统【18】。MTDIj,*J主要目的是为了使新的memory设备的驱动的开发更加简单,主要是 Flash设备,CFI卡和DiskOnChip等存储设备。这类设备有着共同的属性和操作方式, 我们把它们统称为MTD设备。本系统将基于MTD系统实现Flashfl勺设备驱动。 存储技术设备MTD是一种特殊的存储设备,它为设备提供了一个抽象的接口层。 具体的设备通过标准接口函数向MTD抽象接口层注册这个设备,那么上层应用,如 一种具体的文件系统,就可以直接访问MTD的驱动接口来完成具体的设备操作,而 不需要直接调用设备本身的驱动程序。通过这个中间层接口来访问存储设备的一个 好处是,硬件驱动不必关心上层使用的存储格式,如YAFFS,JFFS等,仅仅需要提供 一些简单的处理函数如read,write和erase等。这样就可以将硬件驱动程序设计与系统 程序设计分开,驱动开发者无需知道快存储设备的组织方法,只需提供标准的接口 函数就可以了,从而减轻了驱动人员的负担。 MTD驱动程序的接口可以分为两种模块,分别是用户模块和硬件模块。其中用 户模块提供用户空间可以直接使用的接口,硬件模块用来初始化硬件,并对这些设 备通过用户模块进行物理访问,在Flash存储设备上进行随机的读取、擦除和写入等 操作。如图4.1所示。 内核虚拟文件系统 U 用户模块 J-FFS2 ll YAFFS lI耵L fl胩TL I… 8 IITD硬件模块 l DOC I|jEDoc lI CFI Il j}cFI l… U 『 硬件层j 图4.1 MTD子系统结构 Fig.4.1 MTD subsystem structure 2l 基于ARM的嵌入式数据存储系统研究 4.2 Nor Flash驱动模块设计 Nor Flash驱动程序设计主要包括芯片参数的获得以及操作函数集的实现。芯片 参数的获得主要通过初始化时的探测函数来完成;本系统采用的NorFlash是CFI接口 的Flash,故在驱动初始化时调用CFI接口的探测函数,通过探测函数判断芯片的CFI 命令集类型,从而获得操作函数集,并将其添加到该芯片对应的mtd info的实例中。 从功能上来讲,我们把Nor Flash驱动程序分为芯片驱动和芯片配置两个部分。 4.2.1芯片驱动 这个部分的主要任务是提供芯片探测函数,确定操作函数集,以及注册芯片驱 动,这部分主要涉及的文件在drivers/mtd/chips目录。对于本系统所采用的芯片主要 是以下几个文件,如表4.1。 表4.1 Nor Flash驱动文件信息 玑山le4.1 Nor Flash driver file informmion 文件 内容 cfi__probe.C gen_probe.C chipreg.c cfi cmdset XX.X.C 主要的驱动文件,注册芯片驱动,定义探测函数接口 提供芯片探测所需的函数 提供芯片驱动注册所需的函数 与cfl命令集相关的的函数集 芯片驱动的探测和初始化流程如图4.2所示。首先完成“QRY”标志的判断和查 询结构体(内容保存在cIl—ident[19】结构体中)的获得,然后判断并获得相关的命令集, 再返回mtd info结构体。 图4.2芯片探测初始化流程图 Fig.4.2 The flow chart of initializing chip detection 22 第哩章存储模块设计 所以,整个芯片驱动模块的探测过程主要是完成了两个部分的工作: 1、Query(查询结构体,)数据的判断和获得,初始化芯片数据。 2、CFI命令集的判断和获得120】,返回mtd info结构体。 4.2.2芯片配置 这部分模块主要实现芯片配置,分区信息,探测函数调用,注册mtd info等内容。 这部分功能是在drivers/mtd/map/intel—flash.c中实现的。前面的芯片驱动部分实际只是 提供了芯片探测函数的接口。这个探测函数的执行则必须在相关的配置信息完成以 后,所以整个探测过程其实是在这个模块中完成的。 芯片的配置信息主要包括名称、大小、总线宽度以及一些基本的读写操作函数 接口,这部分内容保存在intel_flash_map结构体中。其次是芯片分区的配置,根据前 面的描述,Nor Flash芯片分成三个分区,指定三个分区的名称、大小和偏移地址。 这部分内容保存在intel flash partition结构体数组中。模块的初始化流程如图4.3: 虚拟地址映射 上 提供RAP信息, 调用芯片探测函数 图4.3芯片配置模块初始化流程图 Fig.4.3 The flow chart of initializing chip configuration 由于芯片MMU功能模块使能以后系统以虚拟地址方式访问,所以首先进行虚拟 地址的映射,得到芯片的片选信号CSA起始物理地址的虚拟地址,范围为芯片容量 大小。根据这个起始虚拟地址实现映射后的结构体intel flash map中的读写操作,将 基于ARM的嵌入式数据存储系统研究 这个结构体作为参数调用前面芯片驱动中定义的芯片探测函数,实现芯片的探测和 初始化,返回芯片操作的mid info结构体。接下来就是分区相关的操作,根据 intel_flash_partitions结构体数组的定义系统中有三个分区,对于存储设备的分区, MTD系统把每个分区都看作是一个独立的MTD设备。如果是单个分区,就可以直接 使用add mtd 了add mtd 备列表中。 函数将设备的 mid info 注册到系统。对于多个分区, MTD 数可以把 mtd info 按照分区信息分成几个 mtd info 控制器底层控制的一些基本.chip chip中包含.chip 添加到设_partition()i函 提供.device() 4.3 Nand Flash驱动模块设计 Nand Flash的驱动架构与NorFlash类似,但是由于硬件电路的区别,所以在底层 的控制方面区别较大。而且不同的系统中对Nand Flash的使用也可能有区别,所以相 关的驱动必须根据本系统的硬件电路作移植或修改。.. 在MTD系统上实现Nand Flash的驱动同其他MTD设备的驱动一样,Nand Flash的 驱动也是实现自己的操作函数来填充设备对应的mtd info实例,并把mtd info实例添 加到设备列表中。 驱动中采用struct nand 来描述Nand Flash设备的控制信息, hand 了要实现Nand Flash读写操作所需的各种数据和函数。通过该结构实现具体的读写/ 擦除操作等函数赋给mtd info实例。在mtd info中有一个无符号类型指针指向 nand 数据结构体,在 nand.chip中 实现 了'Nand Flash 数据和函数,通过这些函数实现对控制器的操作,从而实现对Nand Flash的访问。 Nand Flash驱动程序从结构上主要分为两部分:一部分是芯片的初始化,包括 nand ChiP与mtd info实例的初始化以及分区配置等。另一部分是Nand Flash芯片扫描 和具体读/写/擦除以及底层控制函数等操作函数的实现。硬件相关的初始化部分和底 层控制函数实现部分主要在文件at91 nand.C中完成,具体的读/写擦除函数主要在文 件nand.c中完成。 Nand chip作为中间层结构需要包含实现Nand Flash读写操作所需的各种数据和 基本操作子函数结构的具体内容如下: struct nand_chip{ 产Nand Flash的I/O口在系统地址空间中的读写+/ void—iomem }IO_ADDR_R; void iomem 木IO_ADDR_W; 第四章存储模块殴计 /牛Nand FlaSh的孚节读写函数术/ u—char(术read byte)(struct mtd_info木mtd); void rwrite byte)(struct mtd—info木mtd,u_char byte); /车Nand Flash读写操作的中间操作函数唪/ u1 6 (术read word)(struct mtd—info半mtd); void rwrite_word)(struct mtd—info木mtd,ul 6 word); void void (术write buf)(struct mtd—info唪mtd,const u—char木bur,血len); (木read_buf)(struct mtd__info木mtd,u—char宰bur,int len); /幸Nand Flash在系统中的地址,通常为所在分区的首地址木/ int (奉verify_buf)(struct mtd—info木mtd,const u—char木but',im len); void (卡select chip)(struct mtd info木mtd,int chip);//芯片使能操作函数 int (术block_bad)(struct mtd_info木mtd,loff_t ofs,int getchip); //坏块判断函数 int (丰block_markbad)(struct mtd—info木mtd,10ff_t ors);//坏块标记函数 void (术hwcontr01)(struct mtd—info木mtd,int cmd);//控制信号操作函数 int (木devready)(struct mtd_info宰mtd);//设备准备函数 void (卡cmdfunc)(struct mtd—info木mtd,unsigned command,int column, int page_addr); //命令控制函数 int (水waitfunc)(struct mtd—info木mtd,struct nand—chip幸this,int state); //延迟等待函数 ) 4.3.1芯片初始化与配置 这部分主要包括:驱动模块的初始化及配置,主要包括:芯片初始化、芯片探测、 分区配置及注册。 初始化【21】的过程主要包括相关的DMA和中断以及两个核心数据结构体mtd info 和nand—chipN容的初始化。DMA的初始化主要是分配DMA缓存空间,申请DMA通 道,指定中断处理函数,初始化读/写描述符,如图4.4。读/写描述符内容主要是根据 DMA控制器在进行传输时需要配置的寄存器来决定的,在本系统中的DMA控制器进 行传输需要配置四个寄存器的内容:源地址、目的地址、控制、配黄寄存器,具体 的数据结构为: 2气 基于ARM的嵌入式数据存储系统研究 严Descriptor st九lcture for 9200’S DMA engine木/ typedef struct{ volatile u32 dsadr; /事DSADR value for the current transfer卡/ volatile u32 dtadr;|鼻DTADR value foI the current transfet卑| volatile u32 dctrl: 产DCTItL value for the current transfer木/ volatile u32 dconf;|卑DCONF value fot the current transfer卑| }at9 1.—dmadesc; 读操作描述符可以配置为:(写描述符类似设置) dsadr=nand data;/宰Nand数据寄存器地址·/ dtadr=buf; /母DMA缓存空间地址球/ dctrl=Ox20249b; 严word.word burst--4 size=1 28words木/ 之后就是分配mt啦和nalld_chip空间,设詈_mtd_info.priv指 dconf=0x31c; /宰Nand.>MEM,DMAC控制,屏蔽完成和错误中断牛/ nand_chip实例。 2、芯片探测 图4.4芯片初始化及配置流程图 Fig.4.4 The flow chart of chip initializing and configuing 首先,根据芯片特性设置同具体读写操作相关的nand chip的实例,包括Ecc校验 的类型和~些函数。再通过nand scan()函数初始化其他相关信息,该函数通过读取 芯片的生产厂商ID和设备ID来判断芯片型号。然后根据此型号从事先定义好的列表 中取出相关信息填充至JJmid info实例中,同时将nand chip实例以及读写函数填充到 mtd info实例中。 第四章存储棱块设计 3、分区配置及注册 同Nor Flash~样,Nand Flash也需要在驱动中定义好存储设备的分区情况。本 系统将Nand Flash芯片作为根目录文件系统所在的块设备。所以,j哿Nand Flash的 16MB存储空间全部划为一个分区,分区信息如下: static struct mtd__partition partition_info[]={ { .rlalTle=“Nand flash partition’’: .offset=O: .size=16幸1024幸1024; } ) 4.3.2操作函数的实现 操作函数主要分为两部分:hand cKp中的底层Nand控制器操作函数和mtd info 中的读/写/擦除操作基本操作函数,基本操作函数是基于底层操作函数实现的。其中 主要是底层操作,这里首先先对底层操作进行实现,在这个基础上介绍基本读/写/ 擦除等操作函数。 1、底层操作函数的实现 根据nand.chip的定义,需要实现的操作函数主要是以下几个【22】,重点是cmd.如nc() 函数的实现【23】。 1,hwcontrolO,selectchip0 这两个函数主要实现对引脚的控制。 2,dev_ready() 函数的功能主要是判断芯片I怕引脚状态。 3,read byteO,write_byte() 这两个函数主要实现字节读写,在后续的芯片基本操作函数中使用较少,主要 用在读取芯片状态字中。 4,read buf(),write buff) 这两个函数本来实现的是从数据口读/写连续的数据,但由于本系统采用了DMA 方式,故将这两个操作改为对DMA缓存的操作。这样write bu蜾作则必须在发送写 命令之前进行,这需要对后续的基本操作函数作修改。另外一点就是长度由可变的 改成一页固定长度的读写,因为后续基本操作函数的读写操作也必须基于整页操作。 27 基于ARM的嵌入式数据存储系统研宽 5,cmd_ftmc(1 这个函数的功能是向Nand芯片发出控制命令。通过这个函数分别控制各个引脚 信号,然后通过数据口发出命令和地址以及读取状态信息。 2、基本操作函数的实现 基本操作函数主要是用于填充结构体mtd info,向上层文件系统提供接口。这些 函数都是基于前面介绍的底层操作函数实现的,主要包括读/写/擦除等操作。具体的 实现如下: 读函数 Nand Flash的读函数就是nand read0,该函数在初始化时赋给mtd info中的read 函数。Nand read()实际上只是nand read nand read ecc()qb实现。而hand read oob0是专门读取OOB数据区的函数。 nand read ecc0先调用底层的cmdfunc()i函数中的读取操作,配置DMA控制器, 然后等待DMA操作把数据读入缓存区,通过dev ready()笋0断R/B状态线恢复到高位 时,再调用read bufO把数据读出。这里的操作都是以页为单位的,其中包括OOB区 的内容。将读出的内容进行Ecc计算,得到校验码,同OOB区中的校验码进行比较。 如果不同,则表明Nand Flash中的数据发生了位翻转错误,则通过这两个校验码算出 出错位,进行修复。如果无法修复,则返回读操作失败,如图4.5(左)。 写函数 同nandread()--样,nand_wdte()f包是nand_write_eccO的--层封装。如图4.5(4) 所示,Nand Flash的写操作流程同读操作稍有不同,需要要先对数据进行Ecc校验, 获得数N的Ecc校验码[24】然后再把数据和校验码通过调mwrite_buf()--起写入DMA 缓存,然后调用cmd func0操作DMA控制器和EBI控制器执行写入操作。之后,Nand Flash开始进行写入操作。驱动则进行等待,根据芯片手册提供的延时过后通过调用 dev ready()检查状态线RfB。如果R/B为高则表示结束了,则接着进行Nand Flash状 态查询,检查操作是否成功,并返回相应的返回值。 擦除函数 擦除函数nand erase()实现了对Nand Flash的擦除操作,其具体流程同写操作类 似。需要注意的是:擦除操作是以块为单位的,同写操作不同。所以在输入地址时只 要输入两个字节,即块地址。如果当前擦除的块是坏块的话(调用blocl(-bad()来判断), 则擦除操作出错并退出。另一个就是擦除操作延迟的处理。一般的Nand Flash芯片的 擦除操作费时2ms左右,故当驱动向芯片发送了擦除命令字之后,通过系统调度控制 第四章存储模块设计 驱动每隔一段时间监测R,B状态线,直到擦除完成。同写操作相同的是擦除后同样要 查询状态。 【 开始 】 {=£[。 I参数计算l 调用cmdfunc() 发出读命令 乏\寥/岁 王! read..buf 0l Ecc校验及更正 镖 参数计算 0 Ecc校验五更正 0 wrile_buf 0 0 调用cmd:func 0 发出写命令 <≥ N./≮0:Y卜、 图4.5基本读(左)/写(中)/擦除(右)操作流程图 Fig.4.5 The flow chart of operation of reading(1eft)/wrtting(middle)/erasing(right) Linux操作系统是多用户多任务的操作系统,可能同时存在多个任务对Flash进行 读/写/擦除操作的情况,操作系统提供了很多的手段来防止这种情况的发生,我们在 Flash驱动中也考虑了这方面的问题。主要采用的方法是在这些操作之前调用函数 nand get chip()来判断芯片状态并且获取芯片的控制权,如果芯片不可用则在该函数 中将当前任务加入等待队列并且重复判断。 Linux MTD通过Flash驱动对其进行访问,并向MTD核心层提供基本调用函数, MTD层再向上层文件系统提供调用接IZl。后续的章节将介绍文件系统的实现。 4.4 SD卡驱动模块设计 SD卡(Secure Digital Memory Card)是一种基于半导体快闪记忆器的新一代记忆 设备。由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。 SD卡具备串行和随机存取能力。可以通过专用优化速度的串行接口访问,数据 传输可靠。其接口完全符合最新的消费者标准,叫做SD卡系统标准,由sD卡系统规 范定义。SD卡系统是一个新的大容量存储系统,基于半导体技术的变革。它的出现, 提供了一个便宜的、结实的卡片式的存储媒介。 29 基于ARM的嵌入式数据存储系统研究 由于它具有安全性高,容量大,性能佳,环境适应性好等优点。目前,SD存储 卡标准己应用于各种数字产品,如手机、音频播放器、汽车多媒体系统、手持个人 电脑、数码摄像机以及数码相机等。 4.4.1 SD卡的内部结构 SD(Secure Digital)卡是一种基于NAND型Flash Memory的存储卡,它包含两个基 本部分:内部控制器和存储模块,如图4.6。存储模块用来存储数据,SD卡本身内嵌一 个智能控制器用来实现与主机的接口及控制数据在存储模块中的传输,内置智能控 制器的存在大大简化了应用时外围的控制电路的设计。 4.4.2 SD卡的总线模式 图4.6 SD卡内鄙结构图 Fig.4.6 The SD card internal structure 对SD卡进行软硬件设计首先要选择SD卡的总线模式。SD卡有两种总线模式: SD总线模式和SPI总线模式。两种模式下从管脚定义到数据传输协议都是不同的。SD 总线模式的优点是可以采用4条数据线并行传输数据,数据传输速率高;缺点是传输 协议较为复杂。SPI总线模式缺点是只有一条数据传输线,因此数据传输速率较低; 优点是绝大多数中高档单片机都提供SPI总线,即使不提供,也很容易用软件的方法 来模拟SPI总线,而且SD卡的SPI总线模式传输协议简单,易于实现。由于9200提供 SD总线模式接121,大大简化了硬件设计,且考虑到速度的优越性,故在本设计中采 用了SD总线模式。 4.4.3 SD卡驱动程序整体设计 采用分层结构的程序设计思想,将SD卡的驱动程序大体上分为两层。块设备驱 动接口层:提供Linux内核文件系统访问接口,通过块设备驱动层,内核对块设备 进行读写访问;SD卡读写物理层:提供块设备驱动访问SD卡的接口,如:读块、 第四章存储模块设计 读多块、写块、写多块、命令设置等。Linux内核文件系统对块设备的读写操作(包 含对分区表、文件的操作),通过请求函数完成。驱动程序只负责处理由内核文件系 统发出对某个扇区的读写请求,以及返回磁头、扇区等信息。为降低CPU资源的占 用率,驱动程序在初始化SD init()函数中创建一个内核线程来处理请求,而在 SD request()函数中唤醒这个内核线程,以最大程度释放CPU资源。在Linux内核 发出的请求队列中,每个单独的请求都包含具体读写信息(读/写、扇区地址、扇区数、 数据),根据这些信息去调用SD卡读写函数(SDread0,SD_writeO),完成请求操作。 在处理每个单独请求时,分为两步: 1.分析读写请求,并根据扇区地址和扇区数进行合并处理。 2.调用SD卡读写函数,一次性完成读写请求。 实际测试证明:这样可以提高读写速度和稳定性,并降低了CPU资源的占用率。 SD卡读写物理层面向主控器AT91RM9200和SD卡,完成SD卡控制器中相应寄存 器的设置和向SD卡发送命令实现SD卡初始化、读、写等操作,目的是为其上层提供 相应的功能函数,屏蔽底层硬件的操作细节。驱动层主要包括四层:硬件抽象层, 工具函数层,命令接口层以及操作函数层。 硬件抽象层对SD卡控制寄存器的值进行相应设置,抽象对SD卡硬件的操作,实 现SD接口初始化以及字节的收、发等与SD硬件相关的函数。工具函数层主要实现所 有命令/响应和数据的CRC校验,所有的命令/响应(除了R3)使用CRC7校验,生成 多项式为:G(x)--x^7+x^3+1;数据用CRCl6进行校验,生成多项式为:G(x)---x^16+x^12 +x^5+1。命令接口层定义了一系列SD卡操作命令与向SD卡发送命令:SD SendCmd(1 与读取SD卡寄存器信息的函数,完成SD卡与主机之间的数据流控制。操作函数接口 层则实现了卡操作的API函数,供上层应用函数调用。包括卡的初始化函数: SD Initialize():获取卡信息:SD GetCardlnf00:读单个数据块操作:SD 等等。.WriteMultiBlock0 ;.ReadBlock0 读多块操作:SD ReadMultiBlock();写单个数据块:SD WriteBlock0;写多个数据 块:SD ;擦除 SD 卡中的数据块: SD_EraseBlock0 4.4.4 SD卡的检测及上电初始化过程 当SD卡被插到插槽中的时候,会触发插槽的触点开关,使得SD卡的检测引脚CD 的电平信号发生变化,产生硬件中断。系统核心进行中断源判断,返回SD检测中断 的系统中断号,SD卡的中断处理程序进行相应处理,确认SD卡插入以后,电源使能, 设置中断并通知驱动程序有SD卡插入。驱动通过检测卡的类型信息和写保护状态信 息,初始化时钟频率,初始化总线宽度,然后装载并初始化SD卡的驱动程序。系统 3l 基于ARM的协:入式数据存储系统研究 初始化时,CD检测引脚被设置为上升沿和下降沿触发,因此引脚电平发生变化时, 都会有中断产生。当硬件产生中断时,对CD进行检测,返回相应的中断标识码,对 于是SD插入还是拔出,则由驱动程序来处理。如果检测引脚电平为低,当前插槽为 SD卡插入;如果检测引脚电平为高,当前插槽为SD卡拔出。 SD卡从上电到对SD卡进行正确的读写操作需要一个初始化过程,初始化主要完 成SD卡的一些基本设置使SD卡能顺利进入读写状态,如图4.7所示。需要注意的是, 当CD信号线检测到SD卡插入后,主机在发送任何命令前必须首先向SD卡发送74个 时钟周期,以完成SD卡的上电过程。SD卡上电后会自动进入SD总线模式。 【、三塑) 土 硬件初始化,设置 时钟频率为400KHZ 发送CMD0 设置工作电压 发送CMD2获取卡|D号 发送CMD3获取RCA 设置时钟、总线宽度、 数据块长度 结束 图4.7 SD卡彳刀始化流程图 Fig.4.7 The flow chart of SD card initializing 以下是初始化的关键代码: static im SD_init(void) {im幸sd—sizes; mp sd—blk—sizes; hat宰sd—hard—sects; sd_card_go—idle();//重置SD卡 sd_op0;//获取并设置SD卡操作电压信息 sd_card—get_cid0;//获取SD卡的CD sd_card__getrca0;//取得SD卡的RCA寄存器信息 sd_card_get_csd0;//取得SD卡的CSD sd_cara select0;//使卡处于待命状态 major=registerblkdev(0,”sd_disk”,&sd_ops); if(major<0) retum.1: 32 第匹章存储模块设计 //注册块设备驱动程序 blk_init_queue(BLK DEFAULT QUEUE(major).sdrequest); blk—dev[major].requeSt’queue.request—fn 2 sd request; //设置块设备的请求传输函数 ) 4.3.2 SD卡的读写操作 SD总线模式支持读单块(CMDl7)、读多块(CMDl8)、写单块(CMD)、写多块等 操作(CMD)。读数据块的大小定义在CSD寄存器(READ—BL_LEN),多块操作(读/写) 是指从指定位置开始写下去,直到SD卡收到一个停止命令(CMDl2)才停止此次写操 作。SD卡收到一个有效的写命令后,向主机发送回应信号,之后等待来自主机的数 据块。主机发送数据前首先要发送一个起始标志,再发送512字节数据,后跟两个字 节的CRC校验。然后接收SD卡对数据块的响应标志,如果没有错误,贝J]SD卡进入忙 状态(Data0变为低电平),此时可以不断的检测SD卡的状态,直至lJData0为高电平,写 操作结束。 当系统发送读写请求时,首先申请一个中断,该中断用来在SD卡读/写时产生唤醒 睡眠进程(线程),完成一次完整的SD卡读/写操作;blk_init_queue用来把 DEVIC啦QUEST和队列相关联,DEVICE_REQUESTN来处理请求的处理函数,是 个宏定义(#define DEVICE_REQUEST sd_request);do—sd requeSt是队列请求的处理 函数。在sd_request函数中调用sd—rw实现对SD卡的读/写,在sd—rw中调用 sd__transferblk实现读/写一个块(512字节),在sd_transfer_blk@调用函数read_data或 write data函数读/写9200中的数据寄存器,从而把数据读出/写入SD卡。 4.3.3驱动模块加载 完成了SD卡驱动程序的设计后我们还需要把它编译成内核模块的形式动态加载 进内核。把驱动程序源文件放到内核代码的/driver/blocl(/SD目录中,并建_ff_.Kconfig 文件,增加新源代码的编译配置选项。主要代码如下: menu‘‘SD Card support’’ config SD——CARD tristate“SD Card suppog’’ endmenu 然后修改上层的Kcongng文件,完成对该Kconfig文件的调用。最后修改Makefile, 33 基于ARM的嵌入式数据存储系统研究 增加对驱动的编译【25】。主要代码如下: obj-¥(CONFIG—SD—CARD)+=SD—Driver.o。 i 这样我们就可以在内核配置编译时完成对SD卡驱动模块的加载。为了实现SD卡驱动 模块的自动挂载,编写一个守护进程来自动挂载或卸载。主要代码如下: while(1){ read(“/dev/SD_Mount”,buf,sizeof(but)); if((buf&0x01)一0) system(“insmod SD—Driver.ko"); else if((buf&0x01)一1) //加载SD卡驱动模块 system(“rmmod SD—Driver.ko”);//卸载SD卡驱动模块 )… 启动系统后,将SD卡插入系统,驱动程序会自动加载其驱动程序并将它初始化。 4.5 SD卡应用程序设计 为减少对SD卡的写操作次数,在本设计中,并不是采用实时存储的设计方案, 而是采用定时存储的方式:当数据采集回来时,并不立刻写入SD卡,而是先将其存 入内部的数据缓存区中。这样做即可减少对SD卡的频繁操作,延长SD卡的使用寿 命,而且利用日志文件系统的优越性,也可保证掉电数据不丢失。再利用9200片上 RTC实时时钟提供的秒中断,分中断功能实现起重机运行数据的定时采集、存储与 文件的建立,整体软件流程如图4-8所示。 当系统上电工作时,首先调用操作系统的API函数打开一个以当天日期命名 的.txt文件,例如2009年5月30日建立的文件名为20090530.txt,如文件名不存在 则新建文件,并以可读写模式打开,以写入从采集模块采集回的数据。 当秒中断时,9200读取采集模块内的数据,并将其存入ARM的内部RAM中,为 增加数据的可读性,每次存入数据的格式如下: 表4.2数据的存储格式 【内容 I字节 时间 6 空格 1 Table4.2 Data storage format 高度 空格 幅度 空格 8 1 8 l 重量 8 结束符 1 当分中断时,调用SD卡驱动程序里的读写函数将临时存入RAM的数据写入SD卡 中。需要注意的是,写入数据前需要先调用文件系统的INT8U FS—FSeek(FS_FILE· 34 第四章存储模块设计 pfile,SEEK—CUR.O)函数,使指向整个文件流的指针指向上一次数据的末尾,再调 用写函数将数据缓存区的数据写入SD卡。这样才不会使下次写入的数扼将上次写入 的数据覆盖。 匝回圈 图4.8整体软件流程 Fig.4.8 The overall Process of software 这样,每分钟写入SD卡的数据量为34*60=2040字节,因此每天的文件大小约 为2864KB,一张512M的SD卡足够存储半年的采集数据。 基于ARM的嵌入式数据存储系统研究 第五章文件系统设计 文件系统(FS,File System)用来存储和组织存储设备(如硬盘、NAND Flash、SD 卡等)上的文件。文件系统是嵌入式Linux系统不可缺少的部分,它为系统提供所需的 功能和数据的存放组织。文件系统的移植涉及到系统对文件系统的存储设备的支持 与文件系统自身的构建两个方面的内容。 5.1嵌入式文件系统概述 文件是有组织、有次序地存储在某种介质上的一组信息的集合,是用来存储信息 的一种基本结构【261。每个文件都有唯一的一个用于标识的文件名,用户或程序可通 过文件名定位到唯一的文件,可以打开该文件进行编辑,也可以创建和删除文件。 文件的访问和存放通过文件目录来完成。 通常,操作系统通过其文件系统来管理文件,实现对文件的创建、删除、读/写 等操作。文件系统向用户或程序提供了文件操作的统一接口,使得文件的访问和操 作能够在非常简便的基础上进行。 5.1.1嵌入式文件系统的功能和特性 嵌入式文件系统是用来管理嵌入式操作系统中文件输入/输出和操作等的功能模 块,除具有一般文件系统的功能外,还具有以下特性: 1.存储介质的特殊性 嵌入式设备具有体积小、可移动性等特点,因此其存储设备具有一定的特殊性, 如存储容量要适中,抗震,易拆卸等。目前常用的设备,如CF Card、SD Card、Memory stick等,所用的存储介质为Flash。对Flash的存储操作只能整块的写入或擦除,因此 文件系统需要对此做专门的处理。 2.安全可靠 嵌入式系统应用领域通常要求系统具有高可靠性,因此,嵌入式系统除了实现一 般文件系统的安全性、有效性的规范外,还提供了基于该规范的应用程序来确保文 件安全和数据有效。 3.对多任务的支持 嵌入式文件系统利用操作系统提供的信号量机制,允许多个任务同时操作同一个 文件,实现多任务操作。 4.接口的开放性和可移植性 嵌入式应用领域的应用环境多种多样,操作系统和硬件平台都可能有较大差异。 3.; 第五章文化系统设计 因此,文件系统要能够根据不同的应用环境进行比较容易的移植。 5.多种文件系统支持 为适应嵌入式应用环境的多样性,嵌入式文件系统应该提供广泛的文件系统支 持,包括常规文件、设备文件、目录、符号链接及网络文件系统等。 5.1.2虚拟文件系统 Linux操作系统一个重要的特性就是开放性,这对Linux的开发人员提出了一个问 题就是:如何让操作系统支持除标准EXT2文件系统外的其他不同的文件系统,例如: JFFS、FAT等。为此,就必须将各种不同的文件系统的操作和管理纳入到一个统一 的框架中,使得用户程序可以通过同一个文件系统界面,也就是同一组系统调用, 对各种不同的文件系统及文件进行操作。这样,用户程序就可以不关心不同的文件 系统的实现细节,而使用系统提供的统一、抽象、虚拟的文件系统界面。这种统一 的框架就是虚拟文件系统转换(Virtual Filesystem Swich),简称虚拟文件系统(VFS)。 虚拟文件系统所提供的抽象界面主要由一组标准的、抽象的操作构成,例如 read()、write()、lseekO等,这些函数以系统调用的形式供用户程序调用。这样,用户 程序调用这些系统调用时无需关心所操作的文件属于哪个文件系统,这个文件系统 是怎样设计和实现的。 Linux内核中,VFS与具体文件系统直接的关系如图5.1所示。 统 图5.1 VFS与具体文件系统之间的关系 Fig.5.1 The relationship between VFS and specific file system 文件在内核中是由一个如下形式的file数据结构来表示的: street file{ struct file_operation半f op; ); 37 基于ARM l,匀IIi入式数据存储系统研究 该数据结构中包含一个名为f-op的域,该域的类型为file—operation结构。该结构 包含各种函数的指针,如下所示: struct file_operation{ ssize—t(掌read)(); ssize_t(水write)(); int(木open)(); int(幸close)(); ); 每种文件系统都有自己的file opermion结构,结构中的域几乎全是函数指针。例 如:当应用程序调用read()系统调用时,就会陷入内核而调用sys_read0,而sys_read() 就会通过file结构中的指针f_op调用其他文件系统t拘read0,即: file->f_op·>read(…); 由此可以看出,如果把Linux[勾核比作PC机的“母版”,把VFS比作“母版’’上 的一个“插槽”,那么,每一个具体的文件系统就像一块块“接口卡”。不同的接 口卡上有不同的电子线路,但是,它们与插槽的连接有几条线,每条线做什么有明 确的定义。统一,不同的文件系统通过不同的程序来实现各种功能,但是,与VFS 之间的界面则是有明确的定义的,这个界面就是file 5.2 Linux操作系统支持的常见文件系统 支持多种文件系统是Linux操作系统的重要特点。Linux支持的文件系统如下: 1.EXT2/EXT3 EXT2文件系统是Linux的标准文件系统,具有存取性能好、设计功能强大、兼 容性好等特点。EXT3文件系统在EXT2文件系统的格式上增加了日志功能,是EXT2 文件系统的改进版本。 2.MINⅨ MINⅨ是Linux最早的文件系统,也是最可靠的,但其文件系统最大只能达64MB。 3.FAT FAT文件系统是MSDOS和Windows使用的文件系统,可以分为FATl6和FAT32 两种,FAT32比FATl 6性能更强,并且支持长文件名。 38 第五量文俘系统设计 4.JF’F‘S/JFFS2 JFFS文件系统针对Flash设备的特性而设计的文件系统,可以直接读/写Flash设 备。JFFS2文件系统是JFFS文件系统的下一代版本。 5.YAFFS YAFFS文件系统也是专门针对Flash设计的文件系统,类似于JFFS文件系统,但 是去除了一些功能带来了更快的速度和更少的内存占用。 6.CRAMFS CRAMFS文件系统它能同样是针对Flash设计的。该文件系统的特点是在存取文 件时采用了压缩的方法,是一种压缩的文件系统,同时,该文件系统还是一种只读 文件系统。 7.NFS NFS文件系统是基于网络的文件系统,他提供了网络上多台计算机之间的文件系 统共享,使这些计算机可以相互存取文件。 8.ROⅣ【FS ROMFS文件系统也是一种只读文件系统,具有节省资源和空间的特点。 5.3 Nor Flash上盯FS2文件系统的实现 Nor Flash上常用的文件系统是CraIIlfs和JFFS,Cramfs是一个只读的文件系统, 所以就不存在上述的损耗平衡和垃圾回收的问题,但是这也限制了它的使用。JFFS 是一个日志式文件系统【27】。日志式文件系统的基本设计思想是跟踪文件系统的变化。 这样,如果崩溃发生在日志内容被写入之前,那么原始数据仍然在存储介质上,丢 失的仅仅是最新的更新内容。如果崩溃发生在真正的写操作时(也就是日志内容更新 以后),日志文件系统的日志内容则会显示进行哪些操作,因此系统重启时,它能根 据日志内容快速恢复被破坏的更新。常见的Linux环境下的日志式闪存文件系统主要 有JFFS矛IJFFS2,后者对前者进行了功能扩充,在本系统中,我们采用JFFS2文件系 统来管理Nor Flash[2s】。 JFFS最初是由瑞典的Axis Communications AB公司开发的,使用在他们的嵌入式 设备中,并且在1999年末基于GNU GPL发布出来。最初的发布版本基于Linux内核 2.0,后来RedHat将它移植到Linux内核2.2,做了大量的测试¥-tlbug fix的工作使它稳定 下来,并且对签约客户提供商业支持。但是在使用的过程中,JFFS设计中的局限被 不断的暴露出来。2001年3月17日,Red Hat公司发布了JFFS2文件系统,它是专门面 39 基于ARM的嵌入式数据存储系统研究 向Flash设备的日志式文件系统。这个系统建立在JFFS的设计基础上,扩充了数据压 缩、垃圾回收、自适应耗损平衡等功能。JFFS2的主要特点【29】如下: 1.JFFS2是压缩的文件系统,可以存储比存储器容量更多的数据。 2.JFFS2提供了良好的掉电/崩溃安全保护。 3.JFFS2是专门为像Flash芯片那样的嵌入式设备创建的,对Flash芯片的读写和擦除 操作进行了优化。 4.它对于Flash的各个扇区提供了损耗级别的策略。 5.使用了基于hash表的日志节点结构,加快的对节点的操作速度。 5.3.1 JFFS2的数据存储结构 JFFS2将文件系统的数据以节点的形式存储在闪存上,节点头部的定义如下【30】: MSB LSB 幻数屏蔽位 节点类型 节点总长度 节点头部CRC校验码 1、幻数屏蔽位:0x1985用来标识JFFS2文件系统 2、节点类型:JFFS2定义了三种节点类型,但是考虑到文件系统可扩展性和兼容性, JFFS2借鉴了EXT2的经验,节点类型的最高两位被用来定义节点的兼容属性 3、节点总长度:包括节点头和数据的长度 4、节点头部CRC校验:包含节点头部的校验码,为文件系统的可靠性提供了支持 对于写操作,JFFS2定义了三种具体的结点类型: 1.JFFS2 NODE TⅥ)E INODE:INODE节点包含了i节点的原数据(i节点号, 文件的组ID,属主id’访问时间,偏移,长度等),文件数据被附在INODE节点之后。 除此之外,每个INODE节点还有一个版本号,它被用来维护属于一个i节点的所有 INODE节点的全序关系。当文件系统从闪存上读取相关节点信息后,会根据相关的 映射信息生成映射信息表,文件系统可以到相应的INODE节点去读取相应的文件内 容。 2.JFFS2 NODETYPE DIRENT:该结点用于存储目录文件或是i节点链接符。 删除文件链接的操作是通过写入一个新的同名目录结点到存储介质上,并置i节点号 为0实现的。而改名操作则分为两步实现:第一步是用新名字和旧i结点号生成一个新 的目录结点,产生一个新的链接;第二步用旧名字生成一个i节点号为0的目录结点来 断开原来的链接。这样在改名过程中系统可以通过新旧两个链接名来访问目标结点。 上;当一个写块擦完毕,并被写入_list 第五章文僻系统设计 3.JFFS2一NODET、1PE—CLEANMARKER当一个擦写块被擦写完毕后, CLEANMARKER节点会被写在Nor flashfl勺开头来表明这是一个干净,可写的擦写块。 在JFFS中,如果扫描开头的1K都是0xFF就认为这个擦写块是干净的,但是在实际的 测试中发现,如果在擦写的过程中突然掉电,擦写块上也可能会有大块连续的0xFF, 但这并不能表明这个擦写块就是干净的。于是我们需要CLEANMARKER节点来确切 的标识一个干净的擦写块。 5.3.2 JFFS2的数据操作 JFFS2上维护了几个链表来管理擦写块,一个擦写块可能会在不同的链表上。当 一个擦写块上都是合法的节点时,它会在clean list上;当一个擦写块包含至少一个过 时的节点时,它会在dirty CLEANMARKER节点后,它会在free list上。 通常情况下,JFFS21J颐序地在擦写块上写入不同的节点,直到一个擦写块被写满。 此时JFFS2从free list上取下一个擦写块,继续从擦写块的开头开始写入节点。当 free list上擦写块的数量逐渐减少到一个预先设定的阀值的时候,垃圾回收就被触发 了,为文件系统清理出更多的可用擦写块。为了减少对内存的占用,JFFS2并没有把 i节点所有的信息都保留在内存中,而只是把那些在请求到来时不能很快获得的信息 保留在内存中。具体来说,对于在闪存上的每个i节点,在内存里都有一个struct jffs2 inode cache与之对应,这个结构里保存了i节点号,指向i节点的连接数,以及 一个指向属于这个i节点的物理节点链表的指针。所有的struct iffs2 inode cache存储 在一个哈希表中。闪存上的每个节点在内存中由一个struct{ffs2 raw node ref-表示, 这个结构里保存了此节点的物理偏移,总长度,以及两个指向struct iffs2 raw node ref 的指针。一个指针指向此节点在物理擦写块上的下一个节点,另一个指针指向属于 同一个i节点的物理节点链表的下一个节点【3l】。 闪存上的节点的起始偏移都是4字节对齐的,所以struct jffs2 inode cache中 flash offset的最低两位没有被用到,JFFS2就利用这两位来标记此节点是否过时。 下面举一例来说明JFFS2是如何使用这些数据结构的。VFS调用iget0来得到一个 i节点的信息,当这个i节点不在缓存中的时候,VFS就会调用JFFS2的read inode0来 得到i节点信息。传给read inode0的参数是i节点号,JFFS2用这个i节点号从哈希表中 查找相应的struct jffs2 inode cache,然后利用属于这个i节点的节点链表从闪存上读入 节点信息,建立类似于图5.2的映射信息。 41 基丁二ARM的嵌入式数据存储系统研究 用户操作 从偏移0开始写 200个字节‘A’ 闲存信,息 肜本号:1 偏移:0 长度:200 姜受据:直直自.A鱼… [固 文件映射信息 从偏移200开始写 200个字节‘B’ 版本号:2 偏移:200 长度:200 数据:BBBBB… 从偏移1 50开始写 i00个字节‘C’ 版本号:3 偏移:150 长度:100 数据:CCCCC… 图5.2节点功能 . Fig.5.2 The node function 5.3.3 JFFS2的断电保护技术 JFFS2是一个稳定性高、一致性强的文件系统,不论以何种方式在何时中断电源, JFFS2都能保证文件系统的数据完整性和一致性,不需要为JFFS2配备像EXT2文件系 统用到的那些文件系统扫描工具。断电保护技术的实现依赖于JFFS2的日志存储结 构。当修改的对象是指定的文件内容时,对原有的数据并不是采取直接覆盖的处理 方式,而是在物理介质上增加新的数据结点,并用version属性值来区分新旧结点数 据。因为保留了旧数据,所以如果发生系统故障,可重放日志使文件系统恢复一致。 5.3.4 JFFS2的垃圾回收机制 当flee list上的擦写块数太少时,垃圾回收就会被触发。垃圾回收的主要任务就 是回收那些过时的节点。但是,除此之外它还要考虑磨损平衡的问题。因为如果一 味的从dirty-list上选取擦写块进行垃圾回收,那么diIrtyjist上的擦写块将先于 ,1%的.1i clean list上的擦写块被磨损坏。JFFS2的处理方式是以99%的概率从dirty st 概率从clean list上取一个擦写块下来。由此可以看出JFFS2的设计思想是偏向于性 能,同时兼顾磨损平衡。对这个块上每一个没有过时的节点执行相同的操作: 1.找出这个节点所属的i节点号。 2.调用igetO,建立这个i节点的文件映射表。 3.找出这个节点上没有过时的数据内容,并且如果合法的数据太少,JFFS2还 会合并相邻的节点。 4.将数据读入到缓存中,然后将它拷贝到新的擦写块上。 5.将回收的节点置为过时。 当擦写块上所有的节点都被置为过时,就可以擦写这个擦写块,回收使用它。 42 第五辈文件系统i殳计 5.^.5 JFFS2的损耗平衡机制 在上述的垃圾回收技术中兼顾了损耗平衡,但是这种方式是用概率的方法来解 决的,这很难保证磨损平衡的确定性。在某些情况下,可能造成对擦写块不必要的 擦写操作;在某些情况下,又会引起对磨损平衡调整的不及时。在后续补丁中,记 录每个擦写块的擦写次数,当闪存上各个擦写块的擦写次数的差距超过某个预定的 阀值,开始进行磨损平衡的调整。调整的策略是,在垃圾回收时将擦写次数小的擦 写块上的数据迁移到擦写次数人的擦写块上。这样一来我们提高了磨损平衡的确定 性,我们可以知道什么时候开始磨损平衡的调整,也可以知道选取哪些擦写块进行 磨损平衡的调整。 综上所述,JFFS2文件系统有着断电保护、垃圾回收和损耗平衡等特点,而且它 是开源免费的,使得它在目前的Nor Flash上应用广泛【32J。 5.4 Nand Flash上YAFFS文件系统的实现 目前,JFFS2和YAFFS都是可以用于Nand Flash上的文件系统,JFFS2一开始是针 对Nor Flash开发的一种文件系统,其中对于Nand Flash的支持是后来才加进来的,所 以JFFS2在Nand Flash的支持上还有一定的欠缺[461 JFFS2为每个日志节点在内存中构造iffs2 raw node re璐构。该结构大小为16K。 JFFS2中对于每512字节的空间都要构造这样一个日志节点。那么对于一个128M的 Nand Flash就需要4M的内存空间。Nor Flash通常都很小,占用的内存还不明显。但 是对于大容量的Nand Flash,这是一个无法忽视的问题1331。JFFS2在加载的时候需要 扫描整个Nand Flash芯片查找日志文件节点,同时进行文件列表的构建。由于Nand Flash容量大,读取速度要egNor Flash慢,而且还要进行Ecc校验,所以扫描时间较长。 这样使得系统启动时间过长。 相对于JFFS2的这些问题,YAFFS在Nand Flash上的应用更为优秀。对于上面 JFFS2遇到的问题,YAFFS都很好的解决了。下面将基于YAFFS来实现对Nand Flash 的管理。 5.4.1 YAFFS的特点 YAFFS(Yet Another Flash File System)是第一个专门为Nand Flash存储器设计的 嵌入式文件系统,它是一种日志结构的文件系统,适用于大容量的Nand Flash芯片, 是在Nand Flash上构建文件系统的最佳选择。它的主要特点【34】是: 43 基于ARM的嵌入式数据存储系统研究 1、速度快。比其他用于Nand Flash上的文件系统的速度要快得多。 2、移植简单。目前已经成功移植至iJLinux,WinCE,eCOS,pSOS。 3、日志结构。支持断电保护和损耗平衡。 4、适用于5 1 2Bytes¥112K_Bytes页的Nand Flash。 5、文件系统挂载速度较快。 6、内存资源消耗较小。 5.4.2 YAFFS的数据存储结构 YAFFS在Nand Flash上存储的数据是以块(chunk)为单位,块的大小与Nand Flash 的页(page)大小相同,目前有512Bytes和2KBytes,在我们的系统中采用了前者。块有 两种:文件头块和和数据块(由于大小相同,为避免与Nand Flash的擦除块混淆,我 们后面就用“页’’来代替“块”o YAFFS对文件系统上的所有内容(比如正常文件, 目录,链接,设备文件等等)都统一当作文件来处理,每个文件都有一个页面专门存 放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名等信息。因为 需要在一页内放下这些内容,所以对文件名的长度,符号链接对象的路径名等长度 都有限制。对于Nand Flash上的每一页数据,都有额外的空间用来存储附加信息 (OOB),通常Nand Flash驱动只使用了这些空间的一部分,YAFFS文件系统正是利用 了这部分空间中剩余的部分来存储文件系统相关的内容【351。 5.4.3 YAFFS在内存中的组织方式 l超级块 操作文件系统的第一步是取得SuperBlock,YAFFS文件系统本身在Nand Flash上 并不存在所谓的SuperBIock块,完全是在文件系统mount的过程中由read super函数填 充的。不过,由于物理上没有存储SuperBlock块,所以Nand Flash上的YAFFS文件系 统本身没有存储filesysteml拘魔数(MagicNum),在内存qbSuperBlock里的s_magic参数 也是直接赋值的,所以存储在Nand Flash上的任何文件系统都能被当作YAFFS文件系 统mount上来。 通常一个具体的文件系统在VFS的SuperBlock结构中除了通用的数据外,还有自 己专用的数据,YAFFS文件系统的专用数据是一个yaffs DeviceStruct结构,主要用来 存储一些相关软硬件配置信息,相关函数指针和统计信息等。 2文件在内存中的组织 在mount过程执行read 的过程中, YAFFS 文件系统还需要将文件系统的目.super 录结构在内存中建立起来。由于没有SuperBlock,所以需要扫描YAFFS分区,根据从 44 第五章文仲系统设计 OOB中读取出的yaffSjags信息判断出是文件头page还是数据page。再根据文件头 page中的内容以及数据page中的ObjectID/ChunkID/seriaI Number等信息在内存中为 每个文件(Object)建立一个对应的yaffs_object对象。 除了对应于存储在Naiad Flash上的object]而建立起来tj勺yaffs_objeet以夕b,在 read—super执行过程中还会建立一些虚拟对象flake Object),这些Fake Object在Nand Flash上没有对应的物理实体,比如在建立文件目录结构的最初,YAFFS文件系统会 建立四个虚拟目录(Fake Directory):rootDir,unlinkedDir,deleteDir, lostNfoundDir分别用作根目录,unlinked对象挂接的目录,delete对象挂接的目录,无 效或零时数据块挂接的目录。 通过创建这些yaffs_object,YAFFS文件系统就能够将存储在:Nand Flash上数据系 统的组织起来,在内存中维护一个完整的文件系统结构【36】。 5.4.4坏块管理 在坏块管理方面,建了一个所有块信息列表,就是yaffs DeviceStruct中的 yaffs.一Blocklnfo木blockInfo参数。yaffs_Blocklnfo结构中记录了块的各种信息,包括: 1.软擦除的页数 2.已使用的页数 3.块状态 4.块失效参数 表5.1 YAFFS块状态 Table.5.1 YFFS block state State Macro Definition YAFFS BLCK STATE UNKNOWN YAFFS BLCK STATE SCANNⅢG Deseription 未知状态 正在扫描,此时不能擦除 YAFFS BLCK STATE EMPTY 空的块 YAfFS BLCK STATE ALLOCATrNG 该块正在被当作当前页的分配 YAFFS BLCK STATE FULL 该块中的页都已经被分配了 YAFFS BLCK STATE DIRTY 所有的页都是无效页 YAFFS BLCK STATE DEAD 该块已经无效了,即Bad Block 其中块的状态如表5.1所示【37】。 通过这些状态可以知道块的状态。坏块也可以很方便的查出。这里没有采用单 独的坏块表,但是在YAFFS中块的分配是顺序的,只需要顺序的查询下一个块的状 态,好的就直接使用,坏的就跳过,继续下一个。 45 基于ARM的嵌入式数据存储系统研究 5.4.5损耗级别机制 在以页为基础的损耗级别的机制中,当更新文件时,通常是先复制数据到新的 页中,再标记原来的页为无效页。由于擦除只能以块为单位,所以这里只将标记页 为无效,同时将原来页中的页ID号和文件ID号设为0,但是在便携式设各中,经常会出 现掉电的情况。这时如果刚复制完新的页,还没有标记原来的页为无效页。就会出 现有两个有着相同页ID和文件ID的页。所以这里采用前面讲到的标签结构中的序列 号(serialNumber)位。当文件被改写时,序列号就加1。对于上面的情况,当新页被写 入时,其序列号位就是原来页中的序列号加1。这样,即使出现断电,也可以根据序 列号找到新的页。该序列号的策略为YAFFS的调电保护提供了保障。由于序列号的 差别只有1,所以这里只需要两位,就足够进行新旧的判断了,最优化的使用了OOB 区域。由于页的更新也是在不断的写入新的页,而页的分配都是顺序进行的。对于 块来说,新块也是顺序的分配下去,旧块就由垃圾收集机制来回收,所以基本上块 的使用还是比较平均的。 5.4.6垃圾回收机制 YAFFS文件系统的垃圾收集机制中,当一个块中的所有数据页变成无效时,就 被标记为脏块(Dirty Block)。但是并不立刻擦除。而是添加到垃圾收集列表中,然后 交给Linux系统调度,选择当前没有其他应用时,再执行擦除,这样很好的提高了系 统的效率。 在垃圾收集的机制中,还提供了块整理的方式。在文件系统运行过程中,块整 理会把一些含有无效页较多的块中的有效页移到一个干净的块中,使得含有无效页 的块变成一个完全的脏块。这样提高了块的使用效率。该机制的运行需要至少有2.3 个干净的块用来做块整理,提高块的使用率。前面的nReservedBlocks参数就是描述 保留块个数的参数。而且垃圾机制通常都选在CPU空闲时运行,所以并不影响正常 的使用。 5.4.7资源利用 YAFFS文件系统将文件目录结点的相关信息都放在了Nand Flash的OOB区中,很 好的利用了Nand Flash的特点。YAFFS文件系统在RAM中只对Nand Flash的页建了一 个地址列表。该列表由两个字节组成,16bit,足够寻址64K个页面。即使Nand Flash 超过了这个页,也可以定位到几个页的范围内,再在其中查找需要的页。这样大大 节省了RAM的空间。 YAFFS文件系统结构非常简单,非常适合Nand Flash的应用,占用资源少,启动 46 第五章文化系统设计 速度快,有足够的掉电保护措施。在系统中,采用YAFFS文件系统并基于其优化各 种数据管理策略的实现获得了很不错的效果。 5.5 SD卡上FATl 6文件系统的实现 FATl6;K件系统的主要特点是采用16位的FAT表来记录文件存储信息,存储器上 存储的文件占用空间情况在FAT表中采用链表的形式记录,FAT表同时还记录着存储 器的使用情况,即被分配的空间和未被分配的空间。 整个文件系统包含五个部分,主引导扇区(MBR),引导扇区(DBR),文件分配表 (FAT),文件目录表(FDT),数据区【381,表5.2描述了本系统的SD卡文件系统结构。 表5.2 5121d SD卡文件系统结构 文件系统结构 Table.5.2 File system structure of 5 1 2M SD Card 说明 扇区起始号 占用扇区数 Partion Boot Sectors 分区记录扇区 O 1 Reserved sectors 保留扇区 0 4 FATl 文件分配表1 4 242 FAT2 文件分配表2 246 242 DIR 文件根目录区 488 32 Uset Data 数据区 520 990,456 5.5.1 FATl6文件系统原理 1.主引导扇区 主引导扇区,即主引导记录(MBR,Master Boot Record)位于磁盘的第一个物理扇 区,共512字节,包括主引导程序代码、分区表和主引导扇区结束标志三部分内容。 主引导程序代码占446字节,主要作用是检查分区表是否正确,找出系统的活动 分区,并把该活动分区的引导记录加载到内存,然后主引导纪录把控制权交给该分 区引导纪录。嵌入式系统若无需引导,则把主引导程序代码的446字节全部置0即可。 由于我们不需要从SD卡上引导操作系统,因此,可以将这部分代码全部置O。 2.分区引导扇区 保留区的第一个扇区(分区的第一个扇区)nq做分区引导扇区,占512字节。引导 扇区包括跳转指令、厂商标识和版本号、BPB(BIOS Parameter Block)、扩展BPB 47 基于ARM的嵌入式数据存储系统研究 和系统引导程序。下面以FATl6为例说明引导扇区各部分的含义。 主引导记录MBR把控制权交给分区引导纪录,故分区引导扇区的前三个字节应 该是可执行指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行 的字节(BPBSD扩展BPB),跳到操作系统引导代码部分。 BPB字段记录着本分区的起始扇区、结束扇区、文件存储格式重要信息。对于 本系统的SD卡,BPB的内容如表5.3所示。 表5.3 SD卡内的BPB字段 Table.5.3 BPB field of SD Card 长度 内容 名称 说明 (字节) 2 0x0200 每扇区字节数 512字节 1 0x10 每簇扇区数 2 0x0004 保留扇区数 每个簇含16个扇区 保留扇区个数为4 1 0x02 FAT表个数 2个FAT表 2 0x0200 根目录数 根目录下可有512个登记项 2 OxOOOO 分区所占扇区数 (TotSecl 6) 1 OxF8 介质类型 分区容量小于32MB时用TotSecl6,同时TocSec32置0, 该项为0说明扇区总数大于65536 对固定介质取0XF8 2 0x00F2 一个FAT表所占扇区数 每个FAT表占242个扇区 2 0x3F 每磁道扇区数 2 0x】、F 磁头数 4 0x00000000 分区起始扇区号 每个磁道含63个扇区 磁头数为255个 该分区的引导扇区前的扇区数 4 0x000F1F00 分区所占扇区数 (TotSec32) 分区容量大于32MB时用TocSec32,同时TocSecl6置0, 总共含990.976个扇区 3.FAT区 文件分配表(以下简称FAT表)是FAT文件系统用来纪录磁盘数据区簇链结构的。 下面首先介绍簇的概念。将数据区按一定的数目的扇区为单位进行划分,这样的单 位称为簇。分区中只有数据区才划分簇,其它区是以扇区为基本单位的。每簇的扇 区数与分区的格式(FATl2kFATl6\FAT32)和总容量大小有关,可以是1,2,4,8,16,32, 64,或128,在本系统中,设置SD卡每簇为32个扇区。对于小文件,可能放不满一簇, 此时,该簇既是起始簇也是结束簇。而大文件可能占用上成百上千簇,这些簇在数 据区不一定是连续的一片区域,往往分为若干段,像链子一样存放,这种存储方式 称为链式存储。由于FAT对于文件管理的重要性,所以为了安全起见,FAT有一个备 份,即在原FAT的后面再建一个同样的FAT。如果有一个损坏,可用另一个。表5.4 为FATl6中表项的取值含义。 第五章文化系统设计 表5.4 FATl6表项取值含义 FAT值 Table.5.4 The meaning of values of FATl 6 对应簇的含义 0000H 未用 0001H 保留 0002H.FFEFH 已占用,指向下一簇 FFFOH.FFF6H 保留 FFF7H 坏簇 FFF8H.FFFFH 已占用,且是文件的最后一簇 4.根目录区 对于FATl 6(ff区,根目录区1虫512个目录项组成,每个目录项占32字节。每扇区512 字节,故每扇区有512/32字节=16个目录项,512个目录项共占用512/16=32个扇区。目 录项的数据结构如下表所示。 表5.5 FAT文件系统目录项结构 Table.5.5 The structure of FAT file system directory entry 偏移 长度 名称 字节 (字节) O 8 文件名 8 3 扩展名 11 1 属性 12 1 保留 13 1 创建时间10毫秒位 14 2 创建时间 16 2 创建日期 18 2 最后访问日期 20 2 文件起始簇号的高16位 22 2 最后修改时间 24 2 最后修改日期 26 2 文件起始簇的低16位 28 4 文件长度(字节数) 文件名的第~个字节是如下值时有特殊含义: 0x00:此目录项为未占用,并且其后的所有目录项均未被占用; 0xE5:此目录项已被删除,未占用; 0x05:第~个实际字符为0xE5; 49 基于ARM的嵌入式数据存储系统研究 5.FATl6存储原理 本节以具体实例来说明文件是如何在FATl6分区上存储的。如图5.3所示: 目录区 图5.3 FATl6文件存储原理 Fig.5.3 FiDe storage principle ofFATl6 假设FATl6分区中有一文件“FILE”,下面说明文件系统读取文件“FILE”的 具体步骤: 1。首先在目录区查找文件名为“FILE”的目录项,从目录项中可以得到该文件的 起始簇号0003; 2.根据起始簇号0003查找FAT表,因为FATl6的每个FAT表项为16位,占两个 字节,因此起始簇号0003对应的FAT表项的偏移地址为2*3=6。读出起始簇号对应的 FAT表项内容为0004,即该文件的第二簇为0004,在查FAT表得到其对应的FAT表项 内容为0006,即第三簇为0006…。依次查下去,直到簇号为0009,其FAT表项的内容 为FFFF,表示这是文件的最后一簇。 3.由第2步可知,文件“FILE”共占用了5簇,这5个簇号形成一个簇链 0003.0004.0006.0008.0009。簇链中的每一个簇号在数据区对应一簇(若干扇区)。簇 号Cluster在数据区对应起始扇区号为: FirstSecofCluster=(Cluster一2)奉FS BPB SecPerClus+FS FirstDataSector; 这样,根据簇链中的4个簇号就可以在数据区找到对应的簇,文件“FILE”就分 别放在了这5个簇里。 50 第五章文件系统设计 5.5.2系统格式化 磁盘使用之前,要对磁盘按照FATl6分区格式进行格式化。格式化的主要工作 是初始化主引导扇区(MBR)、分区引导扇区(BPB){EIFAT区。磁盘格式化由函数 FS—Format()实现,其函数原型为:INT8U FS Format(INT8U Dex,ice)。输入参数为要 格式化的设各编号,输入不同的编号格式化不同的存储设备;返回值为0表示格式化 成功,非0表示格式化失败。由下面以格式化SD卡(设备编号为2)为例讲解FATl6文件 系统格式化过程。图5.4为FATl6文件系统格式化流程,其中省略了判断设备编号、 出错直接返回等细节。 图5.4格式化流程图 Fig.5.4 The flow chart of formatting 首先要申请一个扇区大小(512字节)的缓冲区,后面在写扇区时要用到。 格式化参数的初始化是整个格式化过程中最为重要的环节。格式化参数就是前 面所介绍的MBR和BPB中的参数,如分区总扇区数、每扇区字节数、每簇扇区数等 等,格式化参数也是该磁盘文件系统的参数,在以后每次启动文件系统时都会读入 内存中。本环节将确定MBR和BPB中用到的所有参数。 由于SD卡的嵌入式存储介质存储容量相对硬盘来说还8I曼d,,故只需划分一个分 区(在分区表的第一分区项),磁盘的第一个扇区为MBR,但分区的起始位置一般不 会是磁盘的第二个扇区,中间会有若干个未用扇区,可以先预设分区起始位置为第 32扇区(即中间存在31个未用扇区),根据SD卡的总扇区数即可得出分区总扇区数。 每扇区字节数对SD卡都是512字节。微软的操作系统(Windows2000、WindowsXP等) 是按照簇的多少来区别不同的FAT类型(FATl2,FATl6,FAT32)的,本文件系统只支 S1 文件系统的初始化流程如图.5所示。_Int(void) 基于ARM的嵌入式数据存储系统研究 持FATl6,故簇的个数应该在4085到65525之间,再由分区总扇区数即可估算出每簇 扇区数。在实际操作中,我们把分区总扇区数与每簇扇区数的对应关系提前算好, 做成表格,用时可根据分区总扇区数来查找对应的每簇扇区数。 格式化参数确定后就可计算出分区起始扇区、FATl区、FAT2区、根目录区及数 据区的位置。接下来就是把MBR和分区中数据区之前的所有扇区清零。然后把格式 化参数分别填入MBR,BPB缓冲区中对应位置,再写入SD卡。如前面所述,本文件 系统不需要作系统引导,故MBR和分区引导扇区中的“引导程序代码”部分置零即 可。 文件分配表FAT也要初始化。FAT区的第O簇和第1簇要分别初始化为OxfffB和 Ox脚,表示已被占用,其余簇全部初始化为O,表示未使用。最后释放512字节的缓 冲区,初始化完毕。 5.5.3文件系统初始化 文件系统的初始化,包括读取SD卡的文件系统基本信息、为文件系统分配内存 等,由函数FS InitO实现,在使用文件系统的任何其他函数前,必须调用此函数,函 数原型如下:void FS 图5.5文件系统格式化流程图 Fig.5.5 The flow chart of formatting file system 操作系统参数初始化主要完成文件系统中与操作系统相关资源的初始化。 全局变量初始化包括FAT控制块、DIR控制块文件链表及缓冲区等文件系统资源 的初始化。 调用SD卡的检测函数SD CardDetec0可判断SD卡是否存在,如果存在可调用函 数SD CardlnitO来初始化SD卡,然后读取SD卡的MBR矛tlBPB获得文件系统参数。 52 第五章文僻系统设计 5.5.4文件打开的实现 1.函数原型 在对文件进行任何操作(读、写等)之前,都应首先打开文件。打开文件的函数原 型如下。该函数可以打开~个己存在的文件或创建一个新文件,取决于输入参数。 FS—FILE’。‘FS—OpenFile(char木filename.INT8U openmode); 输入参数filename为“全文件名”,即包括盘符、路径和文件名例如: “SD:\data\1001.txt” //SD卡data目录下的“1001.txt”文件 其中盘符只能为“FLASH”或“SD”,不区分大小写,当然以后可以扩展其它 存储设备,盘符后要紧跟冒号和斜杠。路径之间及路经与文件名之间也要用斜杠分 离,输入参数openmode为文件打开模式。 2.实现过程 文件打开的实现过程见图5.6,首先要锁定文件系统,防止同时有其他进程访问 文件系统,这样可以实现多任务的互斥操作。 文件名合法性检查主要包括以下内容:有正确的盘符,整个全文件名总长度不超 过200字节,单级目录名或文件名长度不超过50字节。打开模式合法性检查用来查看 输入参数是否为本文件系统所支持的六种文件打开模式之一。 文件存在性检查其实就是文件查找的过程。首先打开所在设备的根目录,查找 第一级目录是否存在,存在则代开第一级目录,再此目录下查找第二级目录,以此 类推,直到打开文件所在的目录,再查找文件是否存在。只要有一级目录不存在, 则立即返回文件未找到信息。 若文件存在,则读出文件的目录项,为该文件分配系统资源,如文件指针,文 件缓冲区等等。注意,每一个已打开的文件都必须有一个文件指针和一个文件缓冲 区,有了文件指针才能对文件进行读、写等各种操作;文件缓冲区是文件系统内部 为每个文件分配的一簇大小的缓冲区,对应用程序而言,该缓冲区是不可见的。 然后按打开模式的不同进行不同的操作。例如,若打开模式为“read”,则把文 件的第一簇读到文件缓冲区中。文件位置指针是一个面向整个文件流(以字节为单位) 的指针,始终指向下一个要读/写的位置。打开模式为“read”时文节为单位)的指针, 始终指向下一个要读/写的位置。打开模式为“read”时文件位置指针会指向文件的 起始位置。 若文件不存在,要根据打开模式来判断是否允许创建一个新文件。 最后要为文件系统解除锁定,以允许其他进程访问文件系统。 S3 基于ARM的嵌入式数据存储系统研究 困 . 5.5.5文件读写函数实现 1.函数原型 图5.6文件打开流程图 Fig.5.6 The flow chart of opening file 文件的读、写函数原型如下: INT32U FS—ReadFile(void木Buffer,INT32U StructureSize,INT32U Number,FS—FILE} pfile); INT32U FS_WriteFile(void木Buffer,INT32US tructureSize,INT32U Number,FS—FILE牛 pfile): 其中,Buffer为指向缓冲区的指针,对读文件来说是读入数据的存放地址,对写 文件来说是输出数据的地址。StructureSize是文件读写单元的大小,以字节为基本单 位。Number为要读写的单元个数。pfile为指向要读写文件的文件指针。FS_ReadFile0 返回实际读出的单元个数,FS—WriteFile0返回实际写入的单元个数。 第五章文件系统设计 2.实现过程 下面以读文件为例说明读写文件的详细过程,如图5.7所示: 图5.7读父件流程图 Fig.5.7 The flow chart of reading file 先计算要读取的字节数:ReadBytes=Number宰StructureSize;即要读取的字节 数等于要读写的单元个数与文件读写单元的大小之积。要读取的字节数加上文件位 置指针如果大于文件的大小,则说明要读取的字节数大于文件流剩余字节数,此时 应调整读取的字节数为文件流剩余字节数。然后进入读循环,首先判断当前文件流 位置是否到了簇边界,是则读取下一簇到文件缓冲区,然后把一字节数据从文件缓 冲区拷贝到读缓冲区。注意:文件缓冲区和读缓冲区是两个不同的概念,文件缓冲 区是文件系统内部的一簇大小的缓冲区,读缓冲区是应用程序分配的缓冲区,其大 小应大于要读取的字节数。每读取一字节计数器都会加一,最后通过比较要读取的 字节数与计数器的值来决定是否继续读下一字节。读取完毕后应把文件位置指针调 整原文件位置指针加上读取的字节数。最后解除文件系统锁定,读文件结束。 5.5.6目录的实现 对于FATl6分区,根目录区通常有512目录项,即根目录下最多可有512个文件/ 目录。根目录区有确定的位置(紧跟FAT区之后)和确定的大dx(512字节)。根目录区的 第一个扇区为: 基丁:ARM的嵌入式数据存储系统研究 FS—RootDirStartSec2FS—MBR—PartStartSec+FS—BPB_RsvdSecCnt+2术FS_BPB_Fatl6; 其实目录也是一个“文件”,它在上一级目录中占有一个32字节的目录项,但 也有其特殊的地方。首先目录的文件属性为“目录”,文件长度字段不用,永远置O。 为该目录分配一簇的空间,把簇号写入文件起始簇号的低16位和高16位字段中,在 FAT区中把该簇置为Ox蹶示该簇己用并且是最后一簇。接下来要把该簇在数据区 的扇区全部清零。如果该目录在根目录下,目录创建已经完成,否则需要在新建目 录中进一步创建两个特殊目录项:点目录项和点点目录项(dot and dotdot entries)。 新建目录的第一个目录项文件名字段写入“.”,称之为点目录项;第二个目录 项文件名字段写入“..”,称之为点点目录项。两个目录项的文件长度字段都置为0, 所有的日期时间字段都与新建目录的相应字段相同。点目录项的文件起始簇号的低 16位和高16位字段为新建目录的对应字段。点点目录项的文件起始簇号的低6位和高 16位字段是新创建目录所在的父目录的簇号(如果父目录为根目录则置O)。总之,点 目录项指向本级目录,点点目录项指向上一级目录。 多任务互斥操作 文件系统在设计上充分考虑了多任务同时调用文件系统API函数的情况,为避免 多任务同时访问存储介质,引入了信号量机制,保证了系统的稳定工作。在FS—X.c 文件中定义了文件系统锁定函数FS—Lock()矛D解锁函数FS_Unlock0。函数原型如下: void FS_Lock(void); void FS_Unlock(void); 在文件系统API函数的开头,调用FS Lock()可以获得文件系统资源的使用权, 如果此时有其他任务正在访问文件系统,则调用本API函数的任务进入挂起状态,等 待其他任务释放文件系统资源;如果没有其他任务访问文件系统,则本任务直接占 用文件系统,此时文件系统会拒绝其他任务的访问,一直到API函数调用FS_Unlock() 来释放文件系统。 5.5.7文件的随机读写 文件位置指针是一个面向整个文件流(以字节为单位)的指针,始终指向下一个要 读/写的位置。我们可以使用该指针指向下一个数据要写入的文件位置,即把该指针 指向当前文件的的文件末尾,这样就可以使后面写入的数据不至于把前面的数据覆 盖掉。文件流定位函数FS 把文件流定位于某一特定位置,其函数原型如下: INT8U FS_FSeek(FS_FILE木pfile,INT32S offset,INT8U whence); 56 第王章文竹系统设计 其qUpfile是指向结构体FS FILEIj勺指针。whence有三个值: SEEK SET从文件开头offset位移量为新的读写位置; SEEK CUR以当前的读写位置往后增jJl]offset个位移量; SEEK END将读写位置指向文件尾后再增jJnoffset个位移量; offset为偏移量(以字节为单位), 可以为正也可以为负值。 比如:FS—FSeek(pfile.SEEK_CUR,10)表示把文件位置指针从当前位置向后移 动10个字节。 基于ARM的嵌入式数据存储系统研究 第六章总结与展望 6.1总结 本课题基于使用AT91RM9200处理器的起重机数据采集系统中数据存储模块的 设计,在详细研究Flash以及SD Card相关理论的基础上,依据平台架构和系统特征, 提出了一套在该系统中的数据存储方案。在整个项目期间,我的主要工作如下: 采用Nor Flash幂I]Nand Flash以及SD卡搭配来构成存储系统。采用Nor Flash存放 Bootloader、Linux Kernel和根文件系统,Nand flash以及SD卡存放数据。Flash的控制 通过ARM芯片内部集成的EBI控制器结合内部DMA和中断控制器实现。SD卡通过SD 总线模式实现与9200的数据传输,达到了比较理想的传输速度。 在驱动程序方面,基于MTD系统完成了CFI接口的Nor Flash配置和相关CFI命令 集的获取和实现,从而实现了Nor Flash的驱动;另外实现了通过AT91RM9200的外部 总线接[]DMA和中断控制器控制的Nand Flash的基本操作和数据传输控制,在这个 基础上实现基于MTD系统的Nand Flash读写等操作从而完成了Nand Flash的驱动。SD 卡的驱动采用模块化加载方式,实现了SD卡插拔的自动检测以及驱动模块自动加载。 在文件系统方面,分析了Flash的特点,针对Flash这种存储介质提出了在Flash上 实现数据管理的问题和要求。然后分别针对Nor Flash和Nand Flash提出了在上面实现 JFFS2和YAFFS的数据管理策略,分析和实现了相关的断电保护,损耗平衡,垃圾回 收,以及坏块管理,数据压缩,资源利用等策略。考虑到与Windows操作系统的兼容 性,方便日后数据的处理与共享,在SD卡上建立FATl6文件系统。针对系统的平台 和架构对Linux源代码的修改和配置以及编译,在硬件平台上对整个软硬件方案进行 了功能验证。 6.2今后工作的建议 课题中采用的AT91RM9200集成了Nand Flash控制逻辑,虽然可以完成基本的一 些Nand控制,但是并没有支持所有的Nand命令,后续在软件上可以考虑改进。 本系统采用的Nand Flash的页大小是512字节的,而现在市场上的2K字节页的 Nand Flash已经相当普遍,硬件方案可以在后续版本中考虑升级Nand芯片。另外Ya凰 文件系统主要是针对页大小为512字节的Nand Flash,如果采用2K页大小的Nand Flash,可以考虑采用升级的Y瓶2文件系统。 系统中采用的NorFlash是CFI接口的,驱动中对这个类型的NorFlash进行了支 持。目前还有JEDEC接口的Nor Flash,驱动中暂时还没有考虑到兼容,后续工作中可 以考虑这个问题。 参考支献 参考文献 [1].许海热等编著.嵌入式系统技术与应用:Mj.机械工业出版社,2002:2"---100 [2]. 王田苗编著.嵌入式系统设计与实例开发:M:.清华大学出版社,2002:4~26 [3]. 魏忠等编著.嵌入式开发详解[M].电子工业出版社,2003:3~146 [4]. [5]. [6]. [7]. [8]. [9]. 杜春雷编著.ARM体系结构与编程[M].清华大学出版社,2003:1~21 皱思轶编著.嵌入式Linux设计与应用[M].清华大学出版社,2002:241"~281 Atmel Corporation.ARM920T—based Microcontroller AT91RM9200[S].2005. 马忠梅,徐英慧,叶勇建等.AT91系列ARM核微控制器结构与开发[M].北京航 空航天大学出版社,2003. Michael C.Smayl ing,Sebastiano D’Arrigo.EEPROM memory cell and driving circuitry[P].United States Patent.4939558.1990.3 Borwn W D,Brewer J E.Nonvolatile Semiconductor Memory Technology[M].IEEE Press,1997. [10].陈文智等编著.嵌入式系统开发原理与实践[M].清华大学出版社,2005.8:8~ 175 [儿].王卫国.嵌入式Linux在高速数据采集系统中的应用研究[D](硕士学位论文). 西安:西北工业大学,2004. [12].陈莉君,康华编著.Linux操作系统原理与应用[M].清华大学出版社, 2006.1:197~203 [13].杨显强,田远福.嵌入式系统中LCD驱动的实现原理[J].今日电子, 2005.8:66~68. [14].肖杰,李仁发,徐成.基于嵌入式Linux设备驱动程序的开发[J].科学技术与 工程,2006.3:3 23-326 [15].王集森,刘吴,胡晨.嵌入式Linux中多文件系统的构建[J].单片机与嵌入式 系统应用.2003,12:12~15 [16].Karl M.J.Lofgren,et a1.Wear leveling techniques for flash EEPROM system[P].United States Patent.6230233.2001—5—8 [17].Li—Pin Chang.Tei-Wei Kuo。Shi—Wu Lo.Real—time garbage collection for flash—memory storage systems of real—time embedded system[J].ACM Transactions on Embedded Computing Systems(TECS).2004.3(4) 59 基于ARM的嵌入式数据存储系统研究 [18].David woodhouse.Memory Technology Device(MTD)Sub system for Linux[EB/OL] [19].Linux.Kernel sources for 1inux-2.6.8[EB/OL].http://WWw.kemel.org /2001 [20].Intel Corporation.Common Flash Interface(C FI) Sets[S].2000 and Command [21].SAMSUNG Electronics Corporation.K29K2808UOA Product Manual[Z].20 03 [22].Toshiba Corporation.TH 58512FT Product Manual[Z].2000 [23].Jonathan Corbet,Alessandro Ruini&Greg Kroab—Hartman.Linux Device Drivers,Third Edition[M].OReilly,2005 [24].SAMSUNG Electronics Corporation.NAND Flash ECC Algorithm[Z].2004 [25].李玉波,朱自强,郭军.Linux C编程[M].清华大学出版社2005. [26].吴娴.嵌入式Linux文件系统设计和实现[J].计算机工程与应用.2005,41(9) [27].郑良辰,孙玉芳.日志文件系统在嵌入式存储设备上的实现[J].计算机科学, 2002,29(1) [28].Mendel Rosenblum,John K Ousterhout.The Design and Implementation of a Log—Structured Fi leSystem[J].ACMTranson Computer Systems,1992.i0 [29].李桂良,刘发贵.JFFS2文件系统的关键技术及其在嵌入式系统的应用[J].计 算机应用.2003.23(7) [30].David woodhouse.JFFS:The Joumal l ing Flash Fi le System[EB/OL]. [31].刘庆华.JFFS2文件系统实现机制研究[J].计算机工程与科学.2005.27(7) [32].胡展峰.JFFS2文件系统在uCLinux中的应用[J].电子产品世界.2003.7 [33].胡勇其,侯紫峰.嵌入式Linux下NAND存储系统的设计与实现[J].计算机工 程.2006.32(4) [34].罗赞赛,李项军,赵锡漆,夏靖波.NAND闪存在嵌入式Linux信息代理中的实 现[J].仪器仪表用户.2005.12(5) [35].Chen Tianzhou,Hu Wei,Wang Xiangsheng,Smart File System:Embedded File System Base on NAND Flash[J].International Workshop on Networking. Archi ecture,and Storages.2006 [36].Linux Device.Introducing YAFFS,the first NAND—specific flash file system[EB/OL], 参考文献 :一、!x“_、!(_j蔓.i:。Jni i._:!c:es。A?96氏:j2—0i.2_.F:m:.二j:}7j二 [37].Charles Manning(and lⅣookey),YAFFS(yet an other Flash Fi leSystem):EB/OL], [38].http://www.alephl.CO.uk/taxonomy/temi/31/index.html,2001 [39].邓剑,杨晓非,廖俊卿.FAT文件系统原理及实现[J].计算机与数字工程.2005 年第9期 攻读学位期间发表的学术论文目录 攻读学位期间发表的学术论文目录 [1].王拾亦,闰学文.基于ARM与SD卡的嵌入式存储系统研究与设计[J].信息化 研究.2009.4 62 致谢 致谢 在论文完成之际,谨向所有关心和支持我的人们致以最诚挚的谢意! 首先,我要感谢导师闰学文教授三年来的悉心指导和亲切关怀。闫老师严谨治 学的作风、渊博的知识、丰富的实践经验、崇高的敬业精神和无私的奉献精神、对 待工作一丝不苟的态度以及平易近人、朴素无华的生活作风,深深地影响了我,并 将成为我终身享用的财富。 感谢实验室全体师兄弟和师妹们的支持和帮助,同时感谢所有同窗好友在生活 和学习上给予的关心和帮助。 深深感谢我的家人!他们一直以来默默无私的奉献、无微不至的关怀和全心全 意的支持,才使我能够顺利完成学业。 基于ARM的嵌入式数据存储系统研究 作者: 学位授予单位: 王拾亦 太原科技大学 相似文献(10条) 1.学位论文 丛泉滋 基于嵌入式系统的纸浆打浆度的计算机控制系统研究 2004 打浆过程是制浆造纸生产过程中极为重要的一个环节。打浆过程控制的最终目的在于控制成浆质量并使之符合生产要求。打浆过程是一个存在大量 不确定因素的快速动态过程,对其实施控制能够提高成纸的质量和生产率。国外这方面的技术已日趋成熟,而我国起步较晚,与国外先进的打浆控制水 平差距较大。 实际生产中一般以打浆度和湿重来综合表征成浆质量,因此要实现较为全面的成浆质量控制成为打浆过程控制的关键。对打浆的机理进行研究,根 据实际生产数据,从机理分析的角度建立打浆动态模型并对打浆过程进行控制是十分必要的。 基于以上分析的原因,本文做了如下工作:1、对打浆过程机理、打浆过程控制的研究现状和趋势及当今的打浆控制算法进行了综述。 2、以国内常用的φ450双盘磨低浓打浆为例,根据比边缘、比负荷理论,建立打浆过程的动态数学模型。 3、讨论了保代价控制;设计保代价控制器,对打浆过程进行控制。 4、用软测量模型估计打浆度、湿重的变化,建立质量预报需要的软测量模型,对其进行预测推断控制。 5、对嵌入式系统进行了综述;基于嵌入式系统,搭建了成浆质量计算机控制系统,并进行了仿真。 2.学位论文 吴平平 基于ARM的下运带式输送机液压制动系统的计算机控制研究 2007 本文对基于ARM的下运带式输送机液压制动系统的计算机控制进行了研究。文章在分析了下运带式输送机制动系统的现状,针对在工程中制动系统不 能实现真正意义上的软制动的不足后,提出了嵌入式计算机控制的液压调速制动系统方案,并重点对该系统中的计算机控制系统进行了研究和开发。采 用ARM7核的S3C44BOX微处理器的硬件平台,实时操作系统μC/OS-Ⅱ的软件平台开发的计算机系统对带式运输机进行稳定性强、可靠性高的软制动操作 ;本系统利用S3C44BOX自带的10位ADC对流量,油温,三处油压,按定时中断请求的方式进行数据采集,同时采用多任务机制,让分析处理数据任务和液 压系统操作控制任务并行运行,使系统变得更加稳定、可靠;系统采用BOOT引导方式,让所有的代码都在RAM中运行,让系统速度更加快速;另外本系统 还具有可拓展性强,可移植性强,控制算法容易实现多样性且开发简单,维护方便等优点。 3.会议论文 张治辉.芦江丽 使用现场总线的嵌入式蓄电池直流配电屏微机监控系统 2001 本文介绍了一种使用控制器局域网CAN(Controller Arear Network)的嵌入式蓄电池直流配电屏微机监控系统.它把嵌入式智能传感器直接安装在监 测对象内部,通过现场总线CAN与主监控进行数字通信,组成整个直流屏微机监控系统.对直流屏的交流部分、直流部分、对地绝缘、蓄电池安时容量等进 行实时监测.与传统的蓄电池直流配电屏微机监控系统比较,本系统具有高可靠性、体积小、重量轻、成本低、操作简便等特点.本文还提出了一种评估完 成同一任务的不同嵌入式系统设计方案的方法,以期望能够最优化嵌入式系统的设计方案. 4.期刊论文 刘如九.刘玉琳 麻醉靶控输注工作站系统的研制 -北京交通大学学报2010,34(1) 为弥补现有的独立输液泵式TCI系统在输注功能与监控方面的不足,设计开发了新型靶控输注工作站系统,它由上层的工作站与下层的多个输液泵构成 .工作站采用嵌入式系统,硬件配高性能CPU与大尺寸的触摸液晶屏.依靠工作站端软件,系统支持十余种药物的基于药代动力学模型的靶控输注、带有输注 曲线画面的实时监控、预测监控、病例查询及丰富的人工操作等功能.软件采用先开发后移植的开发过程,以面向对象的分析设计方法,采用多线程程序设 计,提高了系统运行的效率和可靠性. 5.期刊论文 徐和飞.蒋存波.XU Hefei.JIANG Cunbo 一种基于现场总线的计算机分级控制系统 -制造技术与机床 2009(11) 介绍一种PC和模块化嵌入式控制器构成的分级电火花加工用计算机控制系统.用PC实现图形化人机交互,并按规则进行决策产生控制指令.嵌入式主控 制器接收并解释PC的指令,协调各嵌入式功能单元完成控制操作,通过RS232接口与PC进行连接,通过RS485总线与其它功能单元构成主从式控制网络,使用 MODBUS协议传送信息.并使用脉冲持续时间内平均电压检测法进行间隙状态检测,避免了脉冲参数变化对间隙检测的影响,提高了间隙控制的稳定性.经测 试,控制系统可满足电火花加工的要求. 6.会议论文 张文军 基于多处理器遥测遥控GPS导航摄影潜艇研制 2006 利用嵌入式多处理器并行处理、计算机控制、无线数字通信、视频图像采集无线传送等技术,研制了一台"无线遥测遥控GPS自动导航摄影潜艇".该潜 艇能够实时摄取水下影像、检测传感器以及嵌入潜艇上的GPS数据,并将其打包无线上传至岸上计算机实时显示存储;岸上计算机根据上传的GPS数据和开 发的GPS自动导航PID控制软件计算出需要调整控制的航行参数,并无线发送至潜艇上嵌入式控制系统,进而控制相应的螺旋桨电机转速转向,实现远程遥控 潜艇自动驾驶,使潜艇沿最佳路径和特定的水深自动航行至设定的经纬度目的地. 7.学位论文 王吓弟 平台式惯导系统的软件设计 2002 研制小型化、价格适宜、中高精度的船用惯导系统对我国的海军建设具有十分重要的意义。本文以实际工程为背景,完成了平台式惯性导航系统的 软件设计与实现。本文首先简要地分析了惯导系统的基本工作原理,给出了惯导系统的机械编排,介绍了基于PC/104总线技术的嵌入式导航计算机控制 系统的硬件组成、结构和功能。本文重点完成基于DOS操作系统的嵌入式导航计算机系统软件设计和实现。为了解决单任务的DOS操作系统上完成对多任 务的实时处理,本文引入事件驱动机制,提出了计算机实时控制系统事件驱动程序设计的基本模型,并将此模型应用于导航系统的软件设计,实现了导 航系统事件驱动管理多任务的机制,很好地满足了惯导系统实时性和多任务性的要求。同时,考虑到DOS图形环境下,人机交互图形界面的开发工作繁重 且多数重复,本文充分借鉴Windows、XWindow先进的图形编程思想,采用面向对象的程序设计方法,开发了支持中文显示的窗口系统软件,并利用窗口 系统成功地开发出简洁、实用、可靠的惯导系统图形界面。 8.学位论文 谭延亮 油泵质量跟踪管理系统 2004 本文利用计算机网络技术对油泵的生产、测试、入库、出厂进行全过程跟踪;利用计算机控制技术对亚新科南岳(衡阳)有限公司原有的德国Bosch公 司半自动油泵测试台进行数字化技改。 利用OPC(OLE for Process Control)服务器技术对亚新科南岳(衡阳)有限公司现有的来自不同国家的自动化数字油泵测试台进行网络化整合:防止 了国外公司在其自动化测试台的软件修改过程中窃取该厂各种类型油泵的标准测试值,保守了亚新科南岳(衡阳)有限公司多年积累的技术秘诀。 油泵质量跟踪管理系统是对所有油泵进行全程管理,防止了人为误差,保证油泵出厂的100%合格的同时,进一步提高产品质量的一致性。首先油泵 组装完成后都被激光蚀刻上唯一的条码序列号进入测试环节,油泵自动化测试台根据标准的测试工艺过程,自动将被测油泵的所有测试数据与来自主服 务器的该类型油泵的标准测试值进行比较、判定,测试合格的油泵序列号自动存贮进入主服务器数据库,允许进入入库流程,否则退回组装车间;油泵 在入库时,入库管理员扫描油泵上的条码读出其序列号,若主服务器上有该油泵序列号,则允许入库,否则不允许入库;油泵在出厂时,出库管理员扫 描油泵上的条码读出其序列号,若主服务器上有该油泵序列号,则允许出厂,否则不允许出厂。 油泵在测试合格后,测试人员的工号也同时进入了主服务器数据库,实现了即时统计每日油泵的测试进度,实时查询每个操作员任意时间段所完成 的测试定额,实现了对测试人员进行定额管理。 利用计算机网络技术实现了油泵质量跟踪管理系统与企业网的互联互通,实现了数据共享,方便了数据统计、查询和分析,提高了现代化管理及质 量控制水平,通过售后服务所反馈的产品故障模式,对照公司内相应产品测试数据的分析,得出更加精确的测试标准,使产品的出产厂技术参数更加适 合客户的要求,大大提高客户满意度。 9.期刊论文 徐和飞.牛秦洲.蒋存波 基于MODBUS协议的开关量控制模块设计 -自动化与仪表2009,24(10) 介绍一种现场总线式分级分组控制系统结构以及RS485接口和MODEBUS协议在现场总线控制模块中的应用方法,给出16路开关量I/O模块设计的具体实 例.通过MODBUS协议自定义报文功能定义了系统配置、特殊功能报文格式,利用软件实现了该协议.经测试,用该方法设计的过程控制模块在 MODBUS+PROFIBUS两级网络控制系统中,在强干扰环境下能够实时可靠地实现信息的传送,较好地满足了工业过程控制在功能、可靠性、灵活性等方面的要 求. 10.会议论文 刘礼.张子明.施远征.纪萌.王红.郭建新 基于S3C2410处理器的拳击健身娱乐系统的设计 2007 这是一个计算机控制的并能够进行调整的拳击运动员人形靶,为广大群众的健身娱乐设计,该系统可以测量使用者的出拳速度以及出拳力量,并通过语 音播报增加人机互动性,让使用者在轻松愉快的环境下锻炼身体,从而达到健身娱乐的目的。系统核心部分采用三星公司生产的ARM9内核处理器S3C2410采 集、分析数据。整个系统由内核稳定、移植性好的Linux操作系统管理各项任务。 本文链接:http://d.g.wanfangdata.com.cn/Thesis_Y1578849.aspx 下载时间:2010年5月25日
更多简介内容

评论

下载专区


TI最新应用解决方案

工业电子 汽车电子 个人电子
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })