嵌入式Linux的分析及其在LED异步卡中的应用

更新时间:2024-04-30 08:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

东南大学

硕士学位论文 嵌入式Linux的分析及其在LED异步卡中的应用 姓名:胡方强

申请学位级别:硕士 专业:电路与系统 指导教师:史小军

20040330

摘要

摘要

嵌入式技术在所谓后Pc时代中得到了越来越广泛的应用。嵌入式系统在硬件上主要以单片机

(Mc【『),微处理器(肿u)和DsP为基础。单片机技术日趋完善且应用广泛,DsP专用于数据处理 方面的应用,且逐步走向与控制相结合的道路。微处理随着通信、信息家电的发展逐渐兴起,目前 是一些高端应用的首选,也是嵌入式技术的发展方向。在软件上,随着应用复杂程度的增加,嵌入 式操作系统逐步代替超级循环的软件模式,成为新的发展方向,当然这需要高性能的硬件作支持。

本文中嵌入式系统是三星的A础芯片44Box加上嵌入式操作系统ucLimⅨ的组合。三星的A删 芯片4480x一款通用微处理器,集成了丰富的外围功能。嵌入式操作系统uCLinux是专门为无内存

管理单元(删)的处理器设计的,在许多A跚和coldfire内核的32位芯片上应用广泛。

uCLiⅫx操作系统在实际项目中应用的开发过程中,会涉及到以下几个方面的问题。开发环境 的建立是首要问题,如果有条件可以购买市场上其他公司的提供开发套件,当然也可以利用网络资 源自己组建,文中提供了组建的具体步骤;其次,针对不同的应用芯片,可能需要对内核作移植, 移植时尽量先找已经移植到与目标芯片接近的芯片上的内核,文中提供ucLinux在4480x上的移植 参考。再者,在做稍微复杂的应用时,必然会涉及到驱动程序和文件系统问题,添加驱动程序要注 意与其他设备是否冲突,例如在设备号,或者中断资源上,文中叙述了模块化应用程序及添加驱动 程序的详细步骤。最后,如果涉及到数据的处理,则需要应用文件系统。文件系统的选择必须针对 实际应用的条件和要求,如果数据需要掉电保护,则必须选择flash,电子盘等,如果采用flash, JFFS2文件系统是个不错的选择。 在本课题的应用项目中.利用ucLinux基本实现了L功异步卡中

的功能。在现有的L即异步卡

的硬件(主要是A删芯片4480x加cPLD)基础上,提供了软件实现的方案,其中涉及到了通讯(串 口和网络),及进程通讯等多个方面,给出了各个进程的流程及部分源码。最后对方案进行了总结, 并提出了改进意见。

关键词: 嵌入式ucLinux JFFS2异步卡

塑!曼坠里

ABSTRACT

h蚰撕am,陇岫蚰edsystembbased蚰MCU,咖UandDsP.The咖Io留ofMCUispe妇t

de咒lopmeⅡththis n mr锄dmmf yea巧,哪bedded懈:hnoIo留jsa即Ⅱed i泔eopmjects.At血e snaw锄d曲ar嚣血emain pⅡ∞ⅡtmI ofdab.W砌hmIa∞iⅡmarl【et.DSP缸a坤Ii∞bkie up.

NowEMPU缸丘rst cheside hoi∞jⅡ山e∞mpl既叩叫ia柑on.Att

of∞舢u面盟6仰st∞hⅡolo日a叫infol唧鲥蚰equ呻t,EMPUis印咖gingⅢbe棚ed of∞f柳a弛舳ee

Opemn蚰sys岫mtake theph钟Oftradjt.on柚舯nmDdeandbe∞methet瑚d0fd胛e10pment甜f吐um

The

em嘲d酣昭stem 如∞mpE鼬d wimthe chip of岛。哪Oxand the embedded oS。

uCUn呱?咖echipof鼢c椰叹,whichisal‘i】帕ofcur弛nt蛐PU,岫魄聃temuchperipheryfunnion?UCL蛔Ⅱisdesi驴edforthe辩cMp

wjmm姗蚰d缸on蜘appIied妯也eMPUbased蚰a哪∞no旷∞kⅡir℃oD他

When曲ee删edos,uCL蛔呱,isappuediⅡ恤epmject,th帆wmbealotofq峭蜘岫

mustbefaced.The嫩吼叩幅Ⅱ蚴b也e蚰vimnI耻nt

buytheprodudd哪l叩edby∞me伽pa町if也e睫缸哪dofd哪l甜w叩mi也蜘∞gemforu

CLin呱.one曲oi∞虹toh删删6明s!皿eo廿时

choi∞isto fo岫d恤e蛐v缸脚mnt0fdwekpm蛐tbas硼on恤esollr∞d嗍lOaded劬mnetwo一【.

Th嚣e呻p盯pr州柚e恤e丘odo辨咖pf打也ispm啷s.Thes啪ndqu蜉Ⅱ佃缸thenp0缅gbe蛆u船缅enis nO ucLin啦basedons3C枷0X妯network.Thepap盯aI舯depjctate也epm此蹯forrepating?髓e伽m,wheny帅印8longw油a∞mpl虹a即肺c棚帆,y仰mightbeh∞dw妯埘v盯 卸d同e昭st咖foruCL妯暇.Whenadding山edrvi盯inuCLin暇,了ou眦lsta阳柚恤e咖mctw? oth凹e删pme毗仰the舯u∞ofjⅡ岫唧t

or

om盯∞u∞.Thechoi∞of盈es ystem

mustbea咖rdi呜wi也requi】mmentand∞nd谢佃ofappn偿tion.L王哦,i九hepmjedneedto鼢他恤edah henpower虹shutdown,fl嬲h出p盯mmdiskmIlstbeadopted.Wh衄n嬲hchip缸clI㈣d, 卫抛WiⅡbe柚appropri啦胁¥g?

h thispa畔r,tIIeuCLin呱isappli棚ina町mchmnism∞rdfoI‘Um曲pIay.At恤eba辨of鼯is咖ghardwan’which缸c仙1posed喇ths3C44BOX粕dCPLD,thepap盯即idetlIe

schemof鲫ftwam柚d鲫me∞uKe伽de.The他wmd蛆1witll曲epmbl锄of

mtw们k唧munica廿明锄d

DC.

Keywords:embedded uC王血慨J们瞎2 as”chr岫ism吼rd

东南大学学位论文独创性声明

本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成 果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表 或撰写过的研究成果,也不包含为获得东南大学或其它教育机构的学位或证书而使用过 的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并 表示了谢意。

研究生签名:必主些

日期:盘垫.t5一

东南大学学位论文使用授权声明

东南大学、中国科学技术信息研究所、国家图书馆有权保留本人所送交学位论文的 复印件和电子文档,可以采用影印、缩印或其他复制手段保存论文。本人电子文档的内 容和纸质论文的内容相一致。除在保密期内的保密论文外,允许论文被查阅和借阅,可 以公布(包括刊登)论文的全部或部分内容。论文的公布(包括刊登)授权东南大学研 究生院办理。

研究生签名:部刍峪导师签名:

日u 舀

青 随着计算机技术的飞速发展和互连网技术

的广泛应用。从Pc时代过渡到了以个人数字处理

(PDA),手持个人电脑和信息家电为代表的3C(计算机,通信,消费电子)一体的后PC时代。而 在这个领域中,嵌入式技术扮演了越来越重要的角色,被广泛应用于信息电器,移动计算机设备, 网络设备和工控仿真等领域。嵌入式系统的开发也成为近年来IT行业的技术热点。有两个例子经常 被引用来说明嵌入式技术的应用规模和发展前景:一是美国的汽车大王福特公司的高级经理宣称, “福特出售的‘计算能力’已经超过I删”:二是美国著名未来学家尼葛洛庞帝99年1月访华时预 言。f5年嵌入式智能(电脑)工具将是Pc和因特网之后最伟大的发明。

从硬件上来说,嵌入式计算机在应用数量上远远超过了各种通用计算机,一台通用计算机的外 部设备中就包含了5一lO个嵌入式微处理器,键盘、鼠标、软驱、硬盘、显示卡、显示器、Modem、 网卡、声卡、打印机、扫描仪、数字相机、USB集线器等均是由嵌入式处理器控制的。从软件上说, 嵌入式操作系统必然是大势所趋。以我们以往的经验,经常是三五个人的小组开发几乎不可重用的 软件,这种方式根本无法面对嵌入式系统工业化潮流的冲击,即无法达到短时间内装配集成“数百 人年”嵌入式产品软件库固化于芯片之中的目的。

与通用计算机的开发要求相比,嵌入式系统对开发人员也提出了新的要求,前者一般是计算机 科学或计算机工程方面的专业人士,而嵌入式系统则是以应用开发为主,要和各个不同行业的应用 相结合,这样就要求开发人员具有更多的计算机以外的专业知识。

目前,国内各高校也陆续开设嵌入式技术方面的课程,以适应形势发展的需要。而嵌入式技术 是个很大的范畴,具体地讲,嵌入式操作系统品种繁多,嵌入式芯片更是数以千计,如何更好地入 门和掌握嵌入式技术也是值得研究的问题。

本文中由面到点,先从嵌入式技术本身出发.然后详细介绍了∽linx操作系统,并给出了嵌入 式系统在U;D异步卡上的应用案例。

东南大学硕士学位论文

i nux 第一章嵌入式技术及嵌入式L

1.1嵌入式技术的概念及组成

嵌入式系统,一般指非Pc系统,通用的描述为:以应用为中心,软硬件可裁减,适应应用系统 对功能,可靠性,成本。体积,功耗等综合性严格要求的专用计算机系统:这种定义也影响了计算 机工业的分类。以往我们都是按照计算机的体系结构,规模等将其分为大,中,小,微型等四类, 但是在80年代开始个人计算PC的迅速发展.到目前己占据了整个计算机工业90%的市场。这种变 化使得以应用为中心的分类方更符合实际,也就是按照计算机的嵌入式应用与非嵌入式应用分为嵌 入式计算机和通用计算机:

既然是计算机系统.必然有广义的计算机基本组成,即包括硬件和软件。硬件上包括处理器/ 微处理器,存储器及外设器件和I/o端口,图形控制器等。软件上一般包括操作系统软件和应用程

序。

1.2嵌入式处理器/微控制器

硬件组成中的嵌入式处理器/微控制器是整个嵌入式系统的核心和基石,决定了系统所能实现的 功能和大致的应用方向。不完全统计,目前世界上的嵌入式处理器/微控制器品种总量已经超过1000 多种,流行的体系结构有30几个系列,其中以8051体系结构占去多半,特别是在国内,更是占有 绝对份额。而生产8051单片机的厂家有20多个,超过350多种衍生产品,仅Philips就有近100 多种!以目前的格局,我们可以把嵌入式计算机分为以下三类:

一、嵌入式处理器(EmbeddedMicr叩rocessorUnit,脚PU):这是引入嵌入式操作系统后讨论

和应用最多的一类,这也是嵌入式技术在硬件基础上的发展趋势。这一类处理器全部是RISc 指令集的处理器,按照体系结构分类,即不涉及具体的处理器芯片而从内核角度看有以下 几种:MIPS,美国公司设计的内核;A脚,英国A蹦公司设计的内核;PawrPc,为I删和Motor01a 公司所共有的内核:68K/c0LDFIRE:M0torola公司独有的内核。MIPS内核的特点是高速。 多内核的集成,可以讲是跨入了64位时代,它的最重要的芯片厂商是PMc和I册,前者做高 端,其芯片被CIsco公司大量用在路由器上。后者做低端,芯片用于低端通讯产品上。A跚 内核的特点是低功耗,目前常用的有A跚7,A肌9,A跚10及StrongA跚四个版本,其设计技 术被授权给数百家的半导体厂商,制造出了种类繁多的芯片,在当今最活跃的无线局域网,

3G,手机终端,手持设备中被广泛应用。韩国三星公司在其面向手持设备和网络设备的处 理器上都全面采用A脚内核,甚至Motor01a公司在其手持设备处理器方面也从其独有的68K 内核改成了A脚内核,所以在手持设备领域已经成了A脚内核的天下。国内目前也有6家单位 购买了A脚内核技术授权(其中包括东南大学)。P0werPC内核在高速和低功耗之间作了妥协,

并集成极度丰富的外围电路接口.由M0torol确4造的该内核芯片已形成了一个巨大的嵌入

式处理器家族,在通信领域应用得最为广泛,国内的中兴通信,华为科技等在其通信产品 中都大量采用该家族的处理器,其中MPc860和肝c8260是最为经典的两款。68I【/COLDFIRE

是在业界中最早也是目前最被广泛应用的内核,且在不停更新换代和发展。其中最为著名 的代表芯片是68360。COLDFIRE继承了68K的特点并继续兼容。

二、嵌入式微控制器(Microcontrollerunit,Mcu):就是我们通常所说的单片机,即芯片内部

除了微处理内核外,还集成了RoM,R埘,总线,总线逻辑及许多必要的功能和外设。为了 适应不同的应用需求,一般一个系列的单片机具有多种衍生产品,即内核处理器是一样,

第一章嵌入式技术及嵌入式工jm 不同的是存储器和外设的配置及

封装,这样可以是芯片最大限度地和需求相匹配,从而减 少功耗和成本。嵌入式控制器目

前的品种和数量最多,比较通用的系列包括8051,P51)(A, Mcs一251,Mcs一96/196/296,眦68Hc05/11/12/16,最新出来的AvR和PIc系列由其本身的特 点在8位单片机中赢得了众多用户的青睐。目前,由于8051系列在业界占据了长期的主导地 位,使得嵌入式控制器在嵌入式系统约70%的市场份额。特别值得注意的是近年来A仰公司

将AMl86CC/cH/cU等嵌入式处理器称为Microcontr011er,㈣OLA公司把以PO瓶R推广。

Pc为基

础的PPPC505和PPc555也列入单片机行列。TI公司亦将其1粥320c2x)(】【系列DSP做为McU进行 三、嵌入式DsP处理器(EmbeddedDignal Pigital Srocessor,EDSP):DSP处理器对系统结构和指 令进行了特殊设计,使其适合于执行DsP算法,编译效率较高,指令执行速度也较高。在数

字滤波,FFT,谱分析等方面DsP算法正大量进入嵌入式领域,Ds啦用正从在通用单片机中

以普通指令实现DsP功能,过度到采用嵌入式DSP处理器。嵌入式DSP处理器有两个发展来源. 一是DSP处理器经过单片化,翻C改造,增加片上外设成为嵌入式DsP处理器,TI的 TMs320c2000/c5000等属于此范畴:二是在通用单片机或soc中增加DSP协处理器。例如Intel 的McS一296和Siemens的Tricore。推动嵌入式DsP处理器发展的另一个因素是嵌入式系统的 智能化,例如各种带有智能逻辑的消费类产品,生物信息识别终端,ADsL接入,实时语音 压解系统等,这类智能化算法一般运算量大,特别是向量运算,指针线形寻址等较多,而 这正是DsP处理器的长处所在。嵌入式DSP处理器比较有代表性的产品是TexasInstrⅧents

的1粥320系列和Motor01a的DsP56000系列。1弼320系列处理器包括用于控制的∞000系列,

移动通信的c5000系列,以及性能更高的c6000和c8000系列。DsP56000目前已经发展成为 DsP56000,DsP56100,DsP56200和DSP56300等几个不同系列的处理器。

L3嵌入式操作系统

完成简单功能的嵌入式系统一般不需要操作系统,如51系列的单片机系统,我们开发应用程序

的传统模式就是,一个大的循环(While(1))加上中断控制。但是随着所谓后Pc时代的来l临,应 用环境在功能和性能上的要求不断地提高,这种传统的模式越来越显得力不从心。这时,嵌入式操 作系统就有了其应用平台。

从严格意义上讲,我们可以把嵌入式操作系统分为以下两类:一类是面向控制、通信等领域的 实时操作系统,如耳indRiver公司的vx№rks、IsI的ps0S、QNx系统软件公司的QⅫ、ATI的№cleus 等。另一类是面向消费电子产品的非实时操作系统,这类产品包括个人数字助理(PDA)、移动电话、 机顶盒、电子书、WebPhone等。而所谓“实时”,是要求能够在“规定的时间”内响应随机发生的 事件并进行处理。这里强调的是“在规定时间内”而非快速,这样就使得系统具有可预测性。但只 有在对实时过程控制或实时信息处理能力有严格要求的系统中。才会强调这样的“实时”性,而在 我们通常的应用中,或则说是对实时要求不高的情况下,也就不会深究系统的是否实时了!

事实上,嵌入式操作系统并不是一个新生的事物,从八十年代起,国际上就有一些IT组织、公 司,开始进行商用嵌入式操作系统和专用操作系统的研发。这其中涌现了一些著名的嵌入式操作系

统:

(1)wind∞s CE:大名鼎鼎的Ⅵicrosoft的产品。Wind0WsCE是从整体上为有限资源的平台

设计的多线程、完整优先权、多任务的操作系统。它的模块化设计允许它对于从掌上电脑到专用的 工业控制器的用户电子设备进行定制。操作系统的基本内核需要至少200K的ROM。展近,Microsoft 宣布准备公开windwscE的源码,这对走“大公司路线”的用户来说又是个好消息。

(2)Vx%rks:windRiver公司开发的,是目前嵌入式系统领域中使用最广泛、市场占有率最

Mc68xxx、MIPsl{)(000、POW职 高的系统。它支持多种处理器,如x86、i960、sunsparc、Motor01aPc等等。大多数的vxworksAPI是专有的。采用GNU的编译和调试器。

东南大学硕士学位论文

(3)Ds0S:ISI公司已经被winRiver公司兼并,现在pSOS属于windRiver公司的产品。这个 系统是一个模块化、高性能的实时操作系统,专为嵌入式微处理器设计,提供一个完全多任务环境, 在定制的或是商业化的硬件上提供高性能和高可靠性。可以让开发者根据操作系统的功能和内存需 求定制成每一个应用所需的系统。开发者可以利用它来实现从简单的单个独立设各到复杂的、网络

化的多处理器系统。

(4)QN)【:QN)(是一个实时的、可扩充的操作系统,它部分遵循P0sIX相关标准,如:POSIx.1b 实时扩展。它提供了一个很小的微内核以及一些可选的配合进程。其内核仅提供4种服务:进程调 度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它oS服务,都 实现为协作的用户进程,因此QN)【内核非常小巧(QN)(4.x大约为12l(b)而且运行速度极快。这个灵活 的结构可以使用户根据实际的需求,将系统配置成微小的嵌入式操作系统或是包括几百个处理器的 超级虚拟机操作系统。

(5)Palm0S:3C∞公司的PalⅢ0S在PDA市场上占有很大的市场份额,它有开放的操作系统 应用程序接口(API),开发商可以根据需要自行开发所需要的应用程序。

(6)HOPEN:这是国内比较成熟的嵌入式操作系统。由凯思公司开发。H0班N随着女娲计划 的推出而引起人们的注意,最近联想集团推出了采用HOPEN操作系统的PDA,使这一操作系统开始 走向市场。

(7)Uc/0s:美国人Je∞Labrosse在1992年完成,适合小型控制系统,具有执行效率高, 占用空间小,实时性能优良和可扩展性(可裁剪)等特点,最小内核可编译至2K.因为是开放源码 且对学校是免费的,所以在网上讨论的很多;

(8)嵌入式Linux:继承了IINlIX的优良特性(稳定性,强大的阿络和出色的文件系统), 具有内嵌网络协议,支持多种文件系统,其编译后目标文件可控制在几百K量级!关于嵌入式Linux 将在下节着重讨论。

1.4嵌入式Linu】【

在介绍嵌入式Linux之前,先提一下Linux操作系统。Linux是在90年代初出现,近几年渐受 欢迎的操作系统,其最大特点是开放源代码。它原本被设计为桌面系统,但现在广泛应用于服务器 领域。而随着嵌入式技术在信息产业中不断增长的应用,1inux以其独特的魅力迅速成为这一领域 的新热点,所谓嵌入式Linux也就应运而生。虽然嵌入式Linux的实用化开发是近来才出现的,而到 目前为止,尚未出现完全成熟的嵌入式Linux操作系统,但毋庸置疑,这一领域开发的热潮已经到来, 市场上已经出现多个嵌入式Linux操作系统的版本及成功应用了嵌入式Linux操作系统的产品1

1.4.1嵌入式Linux的分类

inux ⅢbeddedLinuxS按照《BuildingEystems》一书的作者KarimYagIlmour的观点,勘beded1可以有以下几种分类:第一种是按大小来分,可分为小中大三类,小型类适用于低档CPU加上不超

inux不仅仅只能在32位CPU上运行,还可 过2船的R伽和4船的RAM的系统,事实上EmbeddedL

以在低级的McU(16位)上运行,只是随着技术的发展这种做法不被推荐:中型类适用于中档CU P

加上不超过32船的RoM和64鼢的R删的系统,许多消费类的电子产品都可以归属于这类,常见的 有PDA,MP3的播放器等;大型类适用于功能强大的CPu加上大容量的R叫和RAM的系统!第二种是 按实时性来分,即可分为实时和非实时两类,关于实时性的概念前面有论述!第三种是按照是否具

备网络功能来分!

以上几种是比较正统,很书面的分类方法。既然市场有了嵌入式Linux操作系统,我们不妨直 接从市场角度来讨论!嵌入式Linux系统的巨大市场已经吸引了一批新型的公司参加这方面的竞争, 他们利用自己掌握的用Linux达到嵌入式的方法,吸引投资,开发出成型的产品,如Lineo、TimeSys、

第一章嵌入式技术及嵌入式IjMx FsmLabs等:也有一些传统的Linux公司开辟了这方面的研究.如Re

inux等;更值得重 视的是,一些传统的大公司如IdIIat、VAL删、SGI、M0tor01a、Intel等也进

彳亍了Linux的嵌入式方面的研究 yIlx公司从专有操作系统方向转型到 和开发: 另外还有一些开发专有嵌入式操作系统的公司,如L

嵌入式Linux系统,并且更名为LynuxWorks。国内的中科红旗软件技术有限公司开发的红旗嵌入式

Linux正在成为许多嵌入式设各厂商的首选。红旗公司先后推出了PD“机顶盒、瘦客户机、交换机 用的嵌入式Linux系统,并且投入了实际应用。 这些公司的产品主要分为三类。第一类是专门为Linux的嵌入式方向而做的,如何让Linux更

小、更容易嵌入到体积要求和功能、性能要求更高的硬件中去是他们的产品开发方向,如Mont“ista 的Ha州HatLinux等;第二类是专门为Linux的实时特性设计的产品,将Linux开发成实时系统尤 其是硬实时系统,应用于一些关键的控制场合(不仅仅是信息电器),如FsⅢ1abs公司,开发出来的 RT—Linux产品已经用在工业控制的很多方面,如葡萄牙的coiⅢbra大学已经利用RT—Linux实现了 化工生产控制厂里用来控制反应和程序控制的系统:第三类的产品就是将实时性和嵌入式方案结合起来的方案,很多公司都这么做,并且提供集成化的开发方案,如Lineo、TimeSys等等。

下面简单介绍几个嵌入式Linux操作系统: (1) RT—Linux:由F§lIllabs公司开发的,其最新版本是3.obe诅版(针对Ljnux-2.4.O-p∞版本 内核)。础■Ljn“是利用IjIIux进行实时系统开发比较早的尝试,其原理是将【jnⅡ的 内核代码做一些修改,将Unll】【本身的任务以及I血u内核本身作为一个优先级最低的 任务,而实时任务作为优先级最高的任务,即在实时任务存在的情况下运行实时任务, 否则才运行ⅡnⅡ本身的任务。

(2)h曲ediI:Efnbcdi】【和基于EIⅡbedix的一整套嵌入式nnllx开发环境是由un∞公司开发的。E卫出。d诜是基于P0werPc和x86平台开发的,它提供了L抽ux的强大功能,还可以对需要功能进行剪裁,对嵌入式设备进行支持。通过使用EI曲edix可以为自己的嵌入式应用创建一个个性化的内核。EInbedix的设计使用了模块化的设计方案,方便剪裁系统,从而可以生成最合适需求的勘曲edix内核,达到体积和功能的最优化。 (3) BluecatLjnⅡ:由【.Ⅷ“wbrl【s公司提供的。BI∞cat是基于开放源码的模式进行开发的。它基于RedHat6.1和Ljm2.2.12-20内核,允许使用运行RedHatLim的交叉平 台机器开发嵌入式应用系统。目前Bl∞c札也支持32位的Powfpc和Penthlm两种微

处理芯片。同时I扣u蚋灿8公司提供了m∞cat开发工具,包括c和c++编译器和针

对目标芯片的汇编器。并且现在的开发工具正在准备做Mi∞son、万目laI s

锄i0上的移植。

(4)

HafdHatIjnH:Mon忸1胁公司的Hard王置atUnllx是专门为将Ij¨x做成嵌入的系统而

推出的。可以根据HardH砒Ijnllx为系统启动和运行环境做出合适于嵌入式硬件系统环

境的配置,以获得最好的性能和最小的体积。

(5)

ucLinux:可以从其官方网站(http://ww.uclinux.org)上免费下载,主要是针对没

有内存管理单元的处理器设计的,将在下面着重讨论。

从上述各类嵌入式Linux的特点看,对嵌入式Li叫x的开发主要集中在两个方向:

1.裁减:嵌入式设备资源有限,对软件的体积有比较苛刻的要求。由于Linu】【是单一模块结构, 体积较大,不适合直接在嵌入式设备中应用。许多厂商致力于开发符合原Linux接口标准的小体积的

Linu x内核。并加强其可裁减性和可配置性。

.实时性:在数据采集、控制、音/视频等设备中,对操作系统的实时性有比较高的要求。Linu并不是一个实时操作系统,因而必须提高其实时性以满足这些设备的要求。

1.4.2嵌入式Li叫x的特点

与其他各类嵌入式操作系统相比,后者大多属于商业化产品,价格昂贵,而且由于它们各自的 源代码不公开。使得每个系统上的应用软件与其它系统都无法兼容。并且,由于这种封闭性还导致

东南大学硕士学位论文

了商业嵌入式系统在对各种设备的支持方面存在很大的问题,使得对它们的软件移植变得很困难。 而嵌入式Linux在以下几个方面体现了其优势和价值,吸引了许多开发商的目光,成为嵌入式操作

系统的新宠:

◆可应用于多种硬件平台。嵌入式Linux已经被移植到多种硬件平台,这对受开销、时间限制 的研究与开发项目是很有吸引力的。原型可以在标准平台上开发然后移植到具体的硬件上,

加快了软件与硬件的开发过程。

◆嵌入式Linux可以随意地配置,不需要任何的许可证或商家的合作关系。

◆它是免费的,源代码可以得到。这是最吸引人的。毫无疑问,这会节省大量的开发费用。

◆它本身内置网络支持。 ◆嵌入式Linux的高度模块化使添加部件非常容易。 在本课题中采用的嵌入式Linux是ucLinux.下章将详细讨论。

第二章uc“∞x及其开发环境的建立

i n第二章uCLux及其开发环境的建立

2.1 uCLinu盖的特点

在ucLinux这个英文单词中u表示Micro,小的意思,C表示control,控制的意思,所以uCLinux 就是Micr0—contro卜Linux,字面上的理解就是’针对微控制领域而设计的Linux系统。。ucLinux脱 胎于标准Linux,它继承了标准Linux的诸多优点,如支持多种文件系统,强大的网络功能等,但 同时为了适应嵌入式应用环境的要求,在很多方面区别于标准Linux。特别是在小型化方面。

2.1.1 uCLinux的小型化 具体的来说,ucLinⅡ是通过以下几种方

法来达到小型化的目的的1

1.

重新编译内核:Linux内核采用模块化的设计,即很多功能块可以独立的加上或卸载,

开发人员在设计内核时把这些内核模块作为可选的选项,可以在编译系统内核时指定。 因此这是一种较通用的做法.即在编译时仔细的选择所需要的功能支持模块,同时删 除不需要的功能。通过对内核的重新配置,可以使系统运行所需要的内核显著减小,

从而缩减资源使用量。

2.

ucLinux的根文件系统采用r∞fs文件系统:这种文件系统相对于标准的Linux采用 的ext2文件系统要求更少的空间。空间的节约来自于两个方面.首先内核支持roⅢfs 文件系统比支持ext2文件系统需要更少的代码,其次romfs文件系统相对简单,在建 立文件系统超级块(superblock)需要更少的存储空间。不足之处在于Romfs文件系 统不支持动态擦写保存,即对于系统需要动态保存数据的要求无法满足,当然这种中 要求可以采取其它办法来解决,例如采用虚拟r∞盘的方法进行处理(r∞盘将采用 ext2文件系统)等。

重写应用程序库:ucLinux小型化的另一个做法是重写了应用程序库,相对于标准

3.

Linux的越来越大且越来越全的glibc库,uclibc对libc做了精简。ucLinux对用户 程序采用静态连接的形式,这种做法会使应用程序变大。但是基于ucLinux内存管理 (下面有讲解)的问题,不得不这样做,同时这种做法也更接近于通常嵌入式系统的 做法。

2.1.2ucLinux在内存管理上的特点

着重需要提到的是,ucLinux与标准Linux最大也是最显著的区别就在于内存管理上,这也是 在uCLinux中能够引发一些标准Linux所不会出现的问题的根本原因!下面具体来讨论两者在内存

管理的问题!

标准的Linux采用的是虚拟存储器技术,虚拟存储器由存储器管理机制及一个大容量的快速硬

盘存储器支持。为了支持虚拟存储管理器的管理,Linux系统采用分页(paging)的方式来载入进 程。分页即是把实际的存储器(硬盘和内存)分割为相同大小的段,例如每个段1024个字节,这样 1024个字节大小的段便称为一个页面(page)。下面是虚拟存储器技术实现的简介:当一个程序在 运行之前,没有必要全部装入内存,而是仅将那些当前要运行的那些部分页面或段装入内存运行 (copy-on—"ite).其余暂时留在硬盘上程序运行时如果它所要访问的页(段)已存在,则程序继 续运行,如果发现不存在的页(段),操作系统将产生一个页错误(page f¨lt),这个错误导致操

东南大学硕士学位论文

作系统把需要运行的部分加载到内存中。必要时操作系统还可以把不需要的内存页(段)交换到磁 盘上。利用这样的方式管理存储器,便可把一个进程所需要用到的存储器以化整为零的方式,视需 求分批载入,而核心程序则凭借属于每个页面的页码来完成寻址各个存储器区段的工作。

这其中有个关键的环节.即内存和硬盘之间的数据传输,这就需要内存管理单元(删)的参与, 删的功能可以简单地说为把虚拟地址映射为物理地址。删一般有一组寄存器来标识当前运行的

进程的转换表。在当前进程将CPu放弃给另一个进程时(一次上下文切换),内核通过指向新进程地

址转换表的指针加载这些寄存器。删寄存器是有特权的,只能在内核态才能访问。这就保证了一

个进程只能访问自己用户空间内的地址。而不会访问和修改其它进程的空间。这样通过赋予每个任 务不同的虚拟一物理地址转换映射,支持不同任务之间的保护。

所以,标准Linux在内存管理上采用的虚拟存储器技术是针对有内存管理单元的处理器.这种 设计的好处也是显而易见的,它至少可以实现以下几个功能:运行比内存还要大的程序,理想情况 下应该可以运行任意大小的程序;可以运行只加载了部分的程序,缩短了程序启动的时问;可以使 多个程序同时驻留在内存中提高cPu的利用率;可以运行重定位程序。即程序可以放于内存中的任 何一处.而且可以在执行过程中移动:写机器无关的代码,程序不必事先约定机器的配置情况;减 轻程序员分配和管理内存资源的负担;可以进行共享一例如,如果两个进程运行同一个程序.它们 应该可以共享程序代码的同一个副本;提供内存保护,进程不能以非授权方式访问或修改页面,内 核保护单个进程的数据和代码以防止其它进程修改它们,否则,用户程序可能会偶然(或恶意)的 破坏内核或其它用户程序。当然,虚存系统并不是没有代价的。内存管理需要地址转换表和其他一 些数据结构,留给程序的内存减少了。地址转换增加了每一条指令的执行时问,而对于有额外内存 操作的指令会更严重。当进程访问不在内存的页面时,系统发生失效。系统处理该失效。并将页面 加载到内存中,这需要极耗时间的磁盘I/0操作。总之内存管理活动占用了相当一部分cpu时间(在 较忙的系统中大约占10%)。

而ucLinux采用的是实存储器管理策略,保留了存储器的分页管理技术,这是针对没有内存管

理单元(删)的设计。这种实存储器管理策略具体体现在下列三个方面:一是ucLinux系统对于内

存的访问是直接的,(它对地址的访问不需要经过舢。而是直接送到地址线上输出)。所有程序中

访问的地址都是实际的物理地址;二是系统对内存空间没有保护(这实际上是很多嵌入式系统的特 点),各个进程实际上共享一个运行空间(没有独立的地址转换表);三是一个进程在执行前,系统 必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。与标准Linux相比较 而言.标准Linux系统在分配内存时没有必要保证实际物理存储空间是连续的,而只要保证虚存地 址空间连续就可以了。而ucLinux系统必须为进程分配足够的连续地址空间,然后全部载入主存储 器的连续空间中;另外一个方面ucLinux的程序加载地址与预期(1d文件中指出的)通常都不相同, 这样relocation过程就是必须的。此外uCLinux的磁盘交换空间也是无法使用的,系统执行时如果 缺少内存将无法通过磁盘交换来得到改善。

ucLinux的这种基于实存储器管理策略带来很多不便,首先从易用性上讲,uCLinux的内存管理 是一种倒退,退回了到了IJNIX早期或是Dos系统时代。开发人员不得不参与系统的内存管理。从编 译内核开始,开发人员必须告诉系统这块开发板到底拥有多少的内存(假如你欺骗了系统,将出现 意想不到的错误),从而系统将在启动的初始化阶段对内存进行分页,并且标记已使用的和未使用的 内存。系统将在运行应用时使用这些分页内存。其次从硬件要求上讲,由于应用程序加载时必须分

配连续的地址空间,而针对不同硬件平台的可一次成块(连续地址)分配内存大小限制是不同(有

的处理器没有这样的限制),所以开发人员在开发应用程序时必须考虑内存的分配情况并关注应用程 序需要运行空间的大小。同时由于用户程序同内核以及其它用户程序在一个地址空间,程序开发时 要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运 行异常。另外从内存访问角度来看,开发人员的权利增大了(开发人员在编程时可以访问任意的地 址空间),但与此同时系统的安全性也大为下降。

从以上几点看出,ucLinux对内存管理的减少也就给开发人员提出了更高的要求。但应该讲这 是嵌入式系统的普遍选择,因为在嵌入式设备中,由于成本等敏感因素的影响,许多场合采用不带

第二章ucIj眦及其开发环境的建立 有MMU的处理器。这决定了系统没有足够的硬件支持实现虚拟存储

管理技术。从嵌入式设备实现的 功能来看,嵌入式设备通常在某一特定的环境下运行,只要实现

特定的功能,其功能相对简单,内

存管理的要求完全可以由开发人员考虑。

2.2 Hit001开发工具

要实现ucLin“在某个系统中的应用,建立一个良好的开发环境是必不可少的!就目前来讲, 获得ucLinux的开发环境不外乎两种情况:一是购买商家发行的套件;二是利用网上资源自己组建。 本课题在这两个方面都有涉及。商家发行的套件是实验室购买的由Mic酏ek公司开发的新一代ARM 方面的开发工具HitoolforARM(Suppoftuclinux):下面对其作一些简介,详细情况请参考相关手册。

2.2.1 Hit001开发工具的特点

HioDolfbrAllM(Supportud.mu)与传统开发方式相比,其优势体现在以下几个方面:一。Hio∞l^M ARM(SupportudinⅡ)的所有开发都可以在windows平台下进行,这是其最突出也是比较吸引用户的 特点。这样就不需要很熟悉Unllx的平台命令及桌面系统的使用(当然完全不学是不可能的.因为 在应用开发过程中会涉及一些常用的命令),对于不熟悉IjnⅡ操作系统使用的开发者来说可以节省 时间和精力。而传统方式一般都是基于unll)【平台的。二,前者集成了完整的内核,编译器,而后 者还需寻找Gcc编译器,并要学习其复杂的设定来配置。三,前者可以直接在windows下进行内核 配置,裁减,编译和调试,而后者要自己配置和裁减ⅡnⅡ内核,寻找GDB或类似的开发工具,学 习其复杂的操作。四,前者提供在线烧入Fl∞h RoM,而后者必须自己编写相应的软件。五,程序

forARM调试方面,这也是开发者很看重的方面。Hi000lsupp嘣u锄n“可调试ucIjnIlx的内核,用

户可以看到uaj¨x的内核并可调试,可以自己裁减或修改内核,所以是内核级调试器;同时也可以 调试用户的自己的任务,可以看到所有的任务的信息,所以也是任务级调试器。这些调试是通过内置 MDB,直接通过网络或串口调试程序。而传统的在Linu平台下的开发方式无法调试ua血H的内 核,而在调试应用程序时通常只能用打印消息的方式,即通过串口输出需要查看的信息。

6皤ARM下面介绍一下Hi☆00llajnIlx调试的具体特点。首先起提供了直观的用户界面, S叩ponlisual swin32多线程应用程序,类似MSvtudio的用户界面,同时内置源程序编辑器(对于不同的 语法显示相应的颜色),可在调试过程中修改源文件,支持多文件查找,编辑程序比较方便。其次, 提供了高级的调试功能。具有项目管理功能,用户可以项目为基础存储调试环境:提供了多种仿真

intoc功能,如Go,FreeRun,Restart,Reset。stepinto,stepover,stepout.stepontinuously, utcontinuouslstep oy,goto cursor,90 to,jIllnp to支持断点记数,条件断点,查看点等;可 以把存储器和寄存器作为变量查看;变量即时显示;支持以s—Record。Binary和Disass∞bly格式 上载或下载至存储器空间支持源程序,反汇编程序和混合窗口显示;如果用户熟悉常用的软件开发

工具如vc等,对IIibool缸ARMsupportuajnux开发环境上手就比较容易。

2.2.2 Hit001开发工具的调试功能介绍

MaIc曲呔公司给碰tD0lRjnllx配套了两种仿真调试功能:即软件仿真和硬件 ”AIu“supportu仿真。软件仿真模拟了目标硬件在您的主机上的实际或理论的操作,这样,您就无需硬件或您的主

机不必与目标硬件连接便可进行调试。而硬件仿真器机是指主机和目标硬件之间连接有仿真器调试 硬件,仿真器控制主机和目标系统的通信,这样调试时您就可以不占用目标系统的资源了。这里 Micetek公司提供的是两种J1AG仿真器,一是并口到J1.AG口的简易仿真器,只能支持ARM7系列

的a,U:二是J删仿真器,可以通过网络或串口的连接,支持ARM7和ARM9系列的CPU,在使

用网络连接时,还提供了高速檫写n“h存储器的功能。

东南大学硕士学位论文

同时在开发套件中,还提供了裁减并测试过的ucLinll】【全部原代码,原代码中包括内核,文件系 统。及针对该公司推出的不同型号的开发板所写的接口驱动程序,如网络,usB和语音等。这些源 码给开发者提供了便利,缩短了产品的开发周期1

2.3本课题中使用的另一开发环境的组建

2.3.1商业开发环境的不便

商业性的开发环境在功能和技术支持上都是比较吸引用户的,但其价格成本也是用户不得不顾

fbrARM虑的!同时商业软件的一些限制使得开发过程中存在不便,以HitoolCnⅡⅡ为例, Supponu首先因为需要加密狗存在,一套软件不能同时多人使用。给实验室里的学习开发带来了不便。其次, 其ucIjnux内核版本不能给用户及时更新,而网上下载的又不能直接使用。所以,在本课题进行中, 参考一些资料。自己动手组建开发环境。

2.3.2自己组建开发环境的具体步骤

具体步骤如下: 第一步:准备主机平台:

即需要linux操作系统,本人在主机上安装了reallat9.0,具体安装过程参见相关资料。 第二步:准备内核原代码和交叉编译工具:

ucLinⅡ的原代码可以到ucLinux的官方网站上(http://ww.ucliMx.org)下载,随 着标准Linu】【内核的升级,该网站也不断推出新版本的ucLinIlx内核版本,同时还有某些硬 件体系的针对型版本。即无需移植!因为没有针对本课题使用的s∞sun944肋x的ucLinux版 本,故选用了相对接近的s∞sun酿510的ucLinux版本,即ucLinux—dist一20030522.tar.gz 压缩包,然后用以下命令解压内核源码包:t”xzfucLinux—S∞sung_20020522.tar.gz, 这样就产生ucLinux-dist子目录,所有的内核源码都在此目录下。 有了内核源代码,还要根据目标平台到上述网站下载交叉编译器。交叉编译器的作用是 实现在主机上编译而在目标平台上运行的代码的生成。在本课题中。下载的交叉编译器是 arm_elf_t00ls一20030314.sh压缩包,该压缩包包含了内核代码和应用程序编译,连接以及 调试用的大部分工具,例如C编译器8m—elf_gcc,连接器arm-elf-1d,目标格式工具geⅡromfs 和elf2flt等。接下来需要安装交叉编译器,即用下列命令:sh arm—elf_t001s一20030314.sh,这样就会自动在/usr/10cal/bin目录下建立整套的A跚的ELF 交叉编译器工具。

第三步:配置和编译内核:

有了源码和交叉编译器就可以开始配置和编译内核了。下在解压源码时生成的 uCLinu】【一dist目录下用命令mkemnuconfig开始配置内核: 首先在弹出的一个对话框中

latform 单击Target PSelection,进入顶级配置界面,具

体如下:

[Target P1atfo瑚Selection]

vendor/product:即厂商/产品,ucLinux支持很多厂商的标准评估板,可以根据自己的 实际情况进行选择,这里暂时选择s栅sun94510;

KenlelVersion:内核版本,有两个版本可以选择,1inux吃.0.x和1inux一2.4.x,这里 选择后者;

Libc Version:库函数的版本,有uclibc和uc一1ibc两种库函数,前者内容更丰富,支

10

第二章ua抽u及其开发环境的建立

持多线程,但选择后者编译生成的内核相对小了很多,这里暂时选择后者。

ll settings:打上Y标识后,表示选择该项,即表示在mke调用 []Default auCLinux—dist/vendors/下相应的微处理器的默认配置文件来设置所有的选项,因为选择该项

后,以前的选择将丢失,故一般打上N表示不选。

[]Customize Kernel settings:自定义内核,一般选择该项。

endor/user S口Cust0Ⅲize Vettings:自定义用户程序和库函数设置。

endor Sefault V[]update Dettings:更新厂家默认设置,一般不选。

nd exit,如果顶级设置中cust∞izeKernel s顶级配置完成后,选择save aetting,则接下来进入KernelconfigIlration,否则跳过该配置.如果对内核配置不熟s 选择了Y

悉, 那省事的办法就是不做改动,选择默认设置。

ndE内核配置完成后选择Saveaxit。如果项级设置中CustomizeVendor/UserSettings 选择了Y,则接下来进入Applicationconfiguration,否则跳过该配置,如果对系统应用配 nd Exit。 置不熟悉,同样省事的办法就是不做改动,选择默认设置。然后选择Savea配置完后,按顺序执行以下命令进行编译:

make dep;

kmake clean: melakib-0nly; me user.-only; ake romfs: make image; make。

在执行mkeiⅢage时会出现错误报告,可忽略继续执行下面的命令。这样当Ⅲake命令 执行完后,在uCLin“一dist/i∞ges目录中生成三个新文件:r∞fs.iⅢg;image.r铀: imge.r∞;r∞fs.iⅢg是文件系统的二进制文件,iaⅢge.r∞文件是未经压缩的ucLinux系 统文件,把它拷贝到内存中就可以直接从入口运行了,而ia唱e.r∞文件是压缩的ucLinux 系统文件.把它烧录在作为启动的flash芯片中,上电后i∞ge.rom就通过内置的引导程序 启动ucLinux,需要注意的是,这里生成的ucLi¨x是s∞sun94510版本的。

2.4 ucLinux的移植

要生成s∞suIl944box版本的ucLinux,在上述组建开发环境的步骤中还需插入一步,即三星4510

的ucLinII)【版本到三星4480X的uCLinux版本的移植1

2.4.1内核移植的必要性 因为ucLinux没有现成的针对4480x的版本,所以ucLiMx在44Box

系统上的开发应用中,都

需要cLinux的移植。按照通常的做法,在移植内核前,一般先进行bootloader的移植,有了 u

bootload打就可以通过串口或网口甚至uSB口把uCLinux内核倒到RAM中直接启动,无须烧写 flash(flash的烧写次数有限,且操作麻烦),这样给应用程序的开发调试带了极大的方便!移植

bootloader同样是先找个接近的版本,目前常见的bootloader有AR鳓、R即B00T、D叫G、BLoB,

其中BLOB因其良好的移植性和强大的功能而在网上被广泛讨论,在网站 http://wwnst8rtlreb.net/tpu/上有文件名为b10b-mba44bO.tgz压缩包,是针对S344B似的开发 板移植的BLoB版本,当然要应用在自己的系统上。还需作些修改!因为本课题中购买的MIcETEK开 发的ucLinux套件中有个现成bootloader0仍L,根据AIiMB00rr修改而成的),故对bootloader的移

东南太学硕士学位论文

植没有深入研讨。 不管有没有进行b00tloader的移植,都可以进行ucLinux的内核的移植。当然如果购买的商业 套件中已经有了移植好的版本,那就可以直接应用。例如.在MIcETEK的ucLinux的套件中t就有 移植好的“B0x版本,但是该版本的内核版本日期是20020625的,经过实际运行测试,发现这个版 本在进程间通信及JFFs2文件系统的支持上存在不足,所以决定在内核新版本上进行自己的移植。

2.4.2本课题中所用内核移植的具体步骤

同样,在进行uCLinux的移植时,尽可能寻找移植过程中需要改动最少的版本,这里选择的 ucLinux—dist-20030522.tar.gz,支持s∞sun94510的版本,另外也参考了从 gz)和httD://wwW.start-Web.net/tpu/下载的ucLinux版本(文件名为ucLinux一2.4.17一ucltt

MICET既移植的版本,具体步骤如下:

第一步:在月jnllx.2.4.x,arch,amnoⅫⅢ,目录下修改mlcc珂e和coII丘gjn,这样在内核配置的增

添“B0x的选项,具体为:

1.在make丘k中添加如下代码:(要添加的新代码的位置可以在源程序中类似代码附近, 下同)

i蛔(¥(col町FIG ARcH_mB0x),y)

.IEXt~DDR

MACH阱E

EⅡdif

口4舭

=Oxoc008000

2.在con丘g血中添加如下代码:

ONFIGA4480X\ 第一处:“BOX CRC}LRcH第二处:if【”¥coNFIG A4480x”=”y“】;山∞

dc丘ne boolcoNFIG NOJ屺T..CAo珥y dc五neboolCoNFIG

oUj2y

de丘nebcdcoNHGna’U—26

de丘n幽ol

CONFIG CPI,.ARM7加yde缸山lde血ebcdCoNFIG C吼,WⅡHC^oⅢy

CON珊GaHrWrrHde石Deb∞lCDNFIG-sERIAI{4480y MCR-.矾S1限I脚NoolCdc丘ne bONFIGI、仃’y de丘北h

强DRAM—BASE舨OC∞0000

de丘ne h盟FLASHS攻置0]由0801)000 de丘ne hcxDRAMde丘IIc._bex丘

MEM—BASE伪【删0 FLASH._S皿0x00200000

第二步:在恤llx-2.4.地rc呐Ⅲ∞mml虾新建mach44b0)【文件夹,同时参照M【a盯EK版本相

应目录下的文件,在该文件夹中分别新建arch.c,ifq.c,血”.c文件;

第三步:在/ljn“.2.4.柏rch栅枷咖删l,boot,mal∞衄e中添加如下代码:

RCH-舭B0均'y) ia田(¥I:CONI礓G A

ZRⅡ.ADD鼠 一0xOoD08000Z11三】cI.ADDR一呶Ⅸ)000000

ZBSSADDR

Endif

一嘛OC4I)0咖

其中丑也u山DR(0xoc008000):决定keⅡerl解压后数据输出地址:

第二章ucu¨x及其开发环境的建立

第四步:在/lin吼一2.4.加fcM咖衄om舢,咖t细岬sed目录下:

1.将MICFrEK相应目录下的head_44b0】【.s文件拷贝到该目录下:

2.在mkc丘le中添加如下代码:

i矗Ⅺ(¥(CoNFIG A

R(Ⅲ44BOx),y) H队D=h∞d44box.o aIdif

第五步:在ua血慨一2.4.x,arch,a衄nom删l/kc蛐el,en时一a咖v.s中添加如下代码:

托Iifde丘ned(coNFIGARCH4480)()

.mcrodisabloq

.endm

.眦mget i

rqnI:and ba∞,irqnr'irqs诅t'b器e,nI单 l出、b∞e,=ruSPR

lt击恤qeqⅢ’呐∞e峨#o】

.endm

.mac∞ilq pri0_上【ble 第六步:在ucUn.lle】【.2ndm

.4.x觚Mlmmom衄蜘e】/h∞d.a珊v_s中添加如下代码:

第一处:

能lifdc岛e脚vd(crOlNF,踟AIG AR叫唧4删“B4OXB)ox

第二处:

撇fde丘n叫∞NFIGAR(H“B0)()

adr 15.U:0

ldmia r5,{r5,r6,r8,r9,sp}

@S咖ps纽ck 严

C0pyda协∞嘶。璐totbeirⅡ胛h咄. 吖

,.aeⅡBSS},

mv^绚

1:

唧r5,r8

s慨r4,陋】斟

h:c lb

产Pl吼曲dweImowwhatourpIoo豁sorcodeis(fhar皿jd)

ldr r2,EV44Bo..PRoCESSoR Tn'E

str

眨哂】r2,撇C

啪v

HTn,E“BOX s订 r2,嘲

mv审,加

b sta^kmd Loo:

.10ng—bss-staIt

.10ng

pIoc酋∞r_id

.10ng—-end

.10ng—蚰c蜘由earc血孵

.Iong

init task_吼i∞+8192

EV“B0PROCESSORrn'E:

蛔g ox34345036 捍∞成f

13

东南大学硕士学位论文

uCUnll】【的内核(解压后)就是从该程序开始执行的。

第七步:在ucIjnII】c一2.4.砒IrcMm∞oⅫⅢ肥mel/岫.c中添加如下代码:

第一处:

髂mlinhgcvoidd0 mQ(.mthqs廿IlctpLregs+regs) I

s劬Jctirqd嚣c+d郫c; 蛐n

lctirqacdon+action; intcpu;

掸i融efCONFIG.ARaLSAMSUNG aEARPI科DD盯(ir吐 托ndif

irq=丘xup-jIq(ifq);

新fdcfcoNFIG ARcH4480X删新增代码

iIq;“B∞(唧r右xq“b);0

(irq);

CU三ARPl玳D自Eendif

第二处:在asm曲kagevoiddo.JRQ(intirq,sⅡuctptIegs+regs)前面添加:

撇lefcomGAR口44BoX

int“BOX-丘x44b0血tx)

int译O:

§Ⅱ(ie

0;i《26;“+)

遗x=a1)

br咄

x=x>>l:

∞nlmt

托ndif

第八步:在,linH一2.4.址∽MImmomⅢ恤n目录下:

1.在proc-Ⅲn6’7.s文件中添加如下代码:

第一处:

cp峭舢m0--衄IL.D龇:

.鹊dz

”44BOX。

cpu—w44b(1ml“圮: .a踮iz ”S3C44BO” 第九步:在恤“-2'4.硝HMlmmⅫm】f协ols,mach-t),p∞中添加 “b0】【

ARC H“BOX “BOX

第十步:在舳IIx_2.4.舳酏h178毗o nfigjn文件中添加如下代码:

if【“¥coNFIG ARcH44BOx”=。y”】;nIen

b00lEV4480serial

p毗suppo州CONFIG SERIAL4480 if【”¥CoNnG sERIAI.4480”a”y”】;then b00l’ Supponfbr∞璐oleonSaⅢs岫gserialpon.CONHG—SERIALSAMSUNG--cONSoLfi

if【”¥CONFlG SEmAL4480”=”y”】;th即

14

第二章ucLj呱及其开发环境的建立

b00l’ Suppon丘

for衄AonmDA AMSU_NGscdalS锄s咖gpon.∞mG-SERIALSfi

第十一步:在舳ux.2.4.mer/ch删blakc丘Ie文件中添加如下代码: S职IALscIia∽b0.o

第十二步:在恤Ilx.2,4.圳ri蚴耐目录下新建seIjaIobj_¥(CoNFIG44BoX)+l44b0.c。

第十三步:uCⅡnIl】【一2.4.】【,i∽lude协m.m∞mⅫ】,下,新建arch.44b咴文件夹,拷贝相应

arch.mi∞tek下的所有文件。

第十四步:在uCIjnⅡ.2.4.妇dude加m_amn∞1m昨roc?mnv,systcnh中添加如下代码:

椭唰ef ARMARCH4

(原码)

制觚∞vec自嗌_b懿e0 ((cr-alignment&CR

#else

V)?眈Ⅲ蝴:0)

衔fdefCONFIG ARcH“BOx(新增代码)

珧e

#defineVec咖sba∞O

似0c000000)

蜘efinevocto巧b鹤e0 (o)

托ndif

艳ndif

这样,修改完内核源码后再按照2.3.2节中第三步开始,从新配置编译,然后生成uCLinux

版本就可以在44Box上正确运行了。

15

东南大学硕士学位论文

i n第三章uCLux源码及程序的开发

3.1 ucLinux源码结构

目前。uCLinux往往基于两个1inux内核版本,2.0.38是一个比较成熟的版本,2.4.x是最新的 版本。一般ucLinux的内核大小在500k左右,如果加上一些基本的应用,也就在900k左右。

3.1.1源码功能模块的介绍

uCLinux架构如图3.1所示:

图3.1

uCLinux架构

下面是一些重要的模块的描述:

elector初 (1)(启动过程)Bootstrap:B00tstrap负责用来起动ucLinIl】【内核,包括chip s始化,系统堆栈的初始化,把压缩的Linux映像从Flash中解压到R删中,并把控制权交给内核的 初始化例程。这部分工作是与你的硬件高度相关的,所以这部分的代码要尽量精简。

(2)内核初始化(Kernel Initialization):内核初始化的入口地址是:start_kernel(在 init/main.c中), 它初始化内核的其它部分,包括异常(trap)、中断(IRQ)、内存页(Page)、 调度(Scheduling)、驱动程序等等。并启动“init”进程进入多任务环境。

一(3)系统调用处理/异常处理:当“init”程序运行后,内核对整个系统的运行不再进行直接 控制,而是通过系统调用给应用程序提供服务和响应外部及内部的异步事件,例如:程序错误,硬

件中断等。用户程序如果想得到系统资源,必须通过系统调用。当用户进程发生中断后.内核获得控

制权,取得系统调用的参数,并调用相应的处理程序,而用户一直被挂起,直到内核完成处理并返 回。在A脚中.系统调用采用趼i指令所产生的软件异常来实现。

(4)驱动程序(Device Driver):驱动程序是整个ucLinux内核的主要组成部分,它们控制着 操作系统和外部设备的交互。例如,串口驱动程序处理由外部uART发生中断。Lin“的驱动程序是 可选的, 但是典型的系统应该包括一个控制台(console),一个通用串口驱动程序.一个块设备驱 动程序(用来存放根文件系统)。当Linux内核起动的时候,需要一个输出调试信息的设备。这个设 备往往通过串口来实现。这个调试终端可以通过Mgister-cons01e这个函数来创建。而所有的调

16

第三章uc“mx源码及程序的开发

试信息都通过Printk例程通过这个调试终端来输出。

(5)文件系统(FilesysteⅢ):支持多种文件系统是Linux一个重要的特性,ucLinux同样把

S.RAMFS.NFs。其中,ROMFs是 这一特性带进了嵌入式系统中.这些文件系统包括RoMFS,Ext2FilesysteⅢ)。根文 晟简单的只读文件系统,所占用的空间最少,默认用它来做根文件系统(r00tf

件系统里存放linux启动时要用到的设各文件,配置文件,和应用程序,例如:/dev/tty0,/etc/rc,

/bin/init。/bin/sh,等等。

(6) 运行时间库(untimeLcRib)及应用程序:运行时间库提供了用户程序和内核程序的接

口。尽管许多人认为他们的系统是ucLinux系统(指运行内核).但大部分系统的性能

不是由内核决定的,而是由C时间库决定的。例如,运行时间库将一条ptrintf语句转

换为一个系统调用(sys且ite),将输出发送到标准输出上。系统调用库也必须根据系

统的要求进行裁减。uclibc就是经过裁减后的适用于嵌入式设备的c一运行时间库。 它由GNU 91ibc库移植而来。除了去掉了大部分不适合嵌入式系统的代码以外,还对

应用程序的入口代码,系统调用的API,输入输出过程(I/oroutines)等进行了修改, 并增加了对平面存储器结构的支持。

3.1.2源码目录的介绍

下面从具体源代码看,ucLinux的源代码组织成以下列结构:根目录是ucLinux—xxx(例

如:ucLinu)【.S∞sung)。其中,内核放在1inux—xxx下,(xxx是版本号,2.0.x或2.4.x)。一些 应用程序放在user目录下,根文件系统放在romfs下, 预编译好的1inux映像放在images下, 包括在RAM和RoM中运行的映像。系统的启动代码放在boot目录下。下面重点描述一下内核的组

织结构:

arch/mnⅧu:与架构和平台相关的代码都放在arch目录下,针对A跚的ucLinux,有一个

子目录和它相对应—amn0衄u。如果你要把ucLinux移植到另外一个A删板子,大部分的工作就是

修改这个目录下的_些文件,例如kernel/head—m_atⅢel-S,kernel/setup.c。

drivers:这个目录下包含了所有的设备驱动程序。驱动程序又被分成’block’。’char’, ‘net’等几种类型。 fs:这里有支持多种文件系统的源代码,几乎一个目录就是一个文件系统,如lIsDOS,VFAT, proc,ext2等。虚拟文件系统(vFS)给所有各式各样的文件系统提供了一个统一的接口。文件系 统是放在块设备上的,这些块设备由块设备驱动程序来提供支持。

include:相关的头文件。他们被分成通用和平台专用两部分。 目录‘a8m一¥(AR叫)’包含了平 台相关的头文件,在它下面迸一步分成‘”ch一¥mAcHINE)’,’arch一¥(PRO吨ss0R)’等子目录。与 板子相关的头文件放在arch~¥(6lAC町NE)’下.与CPU相关的头文件放在’arch一¥(PRocEss0R)’下。

例如,对于A跚7TDMI,‘proc—armv’子目录就会被用到。

init:含一些启动kernel所需做的所有初始化动作,里面有一个minc针对kernel作初始 化动作,设置一些参数等,对外围设备初始化。 ipc:提供近程间通讯机制的源代码,如

信号量,消息队列,管道等。 kernel:包含进程调度算法的源代码,以及与内和相关的处理程序,例如系统调用。

mnomu:在标准linux中有一个m目录,用来存放内存管理的源代码,包括删。而这个目录

net:支持网络相关的协议源代码。 1ib: 包含内核要用到的一些常用函数。例如.字符串操作,格式化输出等。 script:这个目录中包含了在配置和编译内核时要用到的脚本文件。

是来替换m的,仅仅包含简单的内存分页管理的源代码。

17

东南大学硕士学位论文

3.2uCLinux下应用程序的开发

3.2.1应用程序开发的注意点

我们知道,在标准1inux平台上。已经有了非常丰富且源码开放的应用程序,使得开发者很容 易获得参考编写自己的程序。然而,值得注意的是,由于标准linux和ucLinux之间的差异,许多 已经在标准1inu】【环境中运行很好的程序并不能直接在uCLinux环境下工作。这其间的原因可简略 归纳为以下两个方面,一方面。是由于ucLinux所使用的处理器和普通Pc不同,指令集,cPu结构 上的差异导致ucLinux上的运行的程序需要专门为该类型处理器交叉编译产生,就是前面提到的交

叉编译器;另一方面,ucLinux是为了没有内存管理单元(舢)的处理器或控制器设计的,在内存

处理上作了较大的修改和精简,所以在标准Linux上可以使用的一些函数和系统调用在ucLinux上

就有可能行不通了! 当然在uCLinux源码中也有许多开发好的应用例程,具体在/usr/目录下,例如常用的有: boa;适合于嵌入式应用的Webserver.

busybox:适合于嵌入式应用的工具软件集; flashW:F1ash写入程序; g曲server:目标系统端远程调试程序,与主机上运行的G册软件配合完成对目标系统上运行的

程序进行远程调试的功能; jffs—t00ls:jffs文件系统(适合F1ash

存储器的)工具软件: ping:网络测试程序ping. tip:串口连接程序;

/usr/目录下所有例子有的可以直接利用,即在配置内核时把它选上即可使用,如ping:而有 的必须针对具体系统情况进行修改,如flashw。那么在编写自己的应用程序时可以参考这些例程。

3.2.2添加应用程序的具体步骤

在编写完自己的应用程序,下一步该是如何把自己的程序加入到ucLinux中去。因为,即然是 嵌入式的应用,通行的做法就是把操作系统与应用软件捆绑在一起,编译成一个二进制文件,再烧 入到flash中。下面具体讨论加入应用程序,同时可参考内核源码/

Docllmentation/Adding-User_Apps_HOWT0的文件:

第一步:首先在usEⅣ目录下建立自己的文件夹如。foo,然后在新建文件夹(?)下编辑自 己的应用程序,?_c,然后参照USER目录下其他应用程序的makc皿e,编写自己的mkc丘k,然后

在该自己目录下运行make命令生成目标文件(这一步不一定要)!

第二步:在uⅫ皿讧ake母e中加入下行语句: dir

S职FOIo-¥(oDl呵FⅢG UFoO)

最好按照字母的顺序插入原有的语句中;

+t劬 第三步:在c衄蜘娟gurejle岫中添加:

第四步:在con丘g,coⅡfigjn中添加:

Co】娜硼3UF00F00SERThispd∞sto ya璐. roI}阻mfb∞y血ingsourb

bool伽’

第五步:makc丘le例子:

E)(EC=f(m

CONFIG USER Foo.-f'oO

18

第三章ucLjmx源码及程序的开发

OBJS-foo~

all:¥饵)匝C) ¥皿)mC):¥(oBJs)

¥∞o¥(LD凡AGS)_o¥@¥(o町S)¥(LDUBS)

romfs:

¥(I∞MFS矾SD /bin/¥饵Ⅺ狐)

dean:

.ml-f¥(EⅫC)+.clf‘.gdb‘.o

在把应用程序加入到系统后,就涉及到应用程序的启动问题,一般调试时是通过控制台来输入

程序命令的,而在实际应用当中。不一定有交互硬件.如键盘等,很多时候就是上电即启动,这在 ucLinux的中也是容易实现的,只需在ucLiMx—S∞sung\vendors\s∞sung\4510B\rc文件(以 uCLinux_Samsung-20020522为例)添加程序命令即可。

3.3 uCLinux下驱动程序的开发

3.3.1驱动程序的概述

设备驱动程序是内核和机器硬件之间的接口,其设计的好坏直接影响系统运行的稳定性和运行 效率。根据不同的设备,驱动程序可分为两类:字符设备和块设备;前者是直接读取数据,即I/O 接口的请求直接被送到设各上;而后者的数据是通过内核缓冲区进行传输的。linux驱动程序的编 译有两种方式:即静态编译进内核,和编译成模块供动态加载或卸载。由于ucLinllx不支持动态加 载或卸载,故只能采取静态编译的方式。因为涉及到对硬件的操作而容易使系统崩溃,所以编写设 备驱动程序时除了强调高效,同时还要求安全。

一个典型的驱动程序,大体上可以分为以下两个方面: (1) 注册设备:在系统初启时。必须将设备登记到相应的设备数组,例如:对于字符驱动设

备来说,要使用register_cIlrdev()来注册设备的驱动号.然后对这个设备的所有调用 都用这个设备号来实现; (2) 定义功能函数:对于每一个驱动函数来说,都有一些和此设备密切相关的功能函数,

O、ioctr01()这一 就最常用的字符设备来说,都存在着诸如0pen()、read()、1rrite

类的操作。当系统调用这些操作时,将自动的使用f订e-operations结构中对应的函数 来实现具体的操作;

在编写驱动程序前,不得不提file_operations这个结构,每个设备都有自己的 file-0perations结构,它定义了设备的基本入口点,即上面提到的功能函数,具体可参见《UNux

设备驱动程序》一书。

3.3.2添加驱动程序的步骤

驱动程序的使用可以按照两种方式编译,一种是静态编译进内核,另一种是编译成模块以供动

态加载。由于ucLinu】(不支持模块动态加载,而且嵌入式LINU)(不能够象桌面LINUX那样灵活的使

用insmod/mod加载卸载设备驱动程序,因而这里只介绍将设备驱动程序静态编译进ucLinux内核

的方法。 下面以简单的演示例子,介绍在一个以模块方式出现的驱动程序1ed.c基础之上,将其编译进

内核的一系列步骤,设备取名为“1ed”,是MIcET既公司的开发板上的数码管(地址为Ox06000000), 设备号定为254,这个驱动程序的目标是让数码管显示0“9中的数字:

19

东南大学硕士学位论文

第一步:在目录/linux一2.4/drives/char编写源程序led.c; 第二步:添加设备i

(1)修改lux一2.4.x/driver/char/Makefi1e在适当位置添加一行:0bj一¥(c0NFIG-LED)

+=1ed.o

ool (2) linur2.4.x/driver/char/config.in.添加一行: b1ed device’

CONFIG_LED

(3)修改1inux一2.4.x/driver/ch”/mem.c 在适当位置添加:

#ifdef∞NFIG_LED

oid lextern ved-init(void): #endif

同时在chr-deLinit()函数添加:

#ifdef CONFIG_LED

led_init():

#endif

(4)修改vendor/s∞sung/4510b/llakefile,建立设备节点; 在12一一351ed,c,254,O 行间,DEvIcE部分添加如下内容

emevice (5) 腿kenuconfi&在character device选中ledd这样在重新编译的内核中,就包含了名为“test”的设备驱动,当然如果要验证这个设备则需

要编写相应的测试应用程序。

第四章ucLi肌x下的文件系统JFFs2

i nux下的文件系统JFFs2 第四章ucL

虽然在目前很多的嵌入式技术的应用系统中并不采用嵌入文件系统,这些应用系统在保存数据

方面都采用直接读写存储器的方式,即把存储器作为一个伪设备来处理,但是随着系统复杂性的增 加,存储器容量的扩大,嵌入文件系统是一种必然趋势。而使用文件系统的好处也显而易见的,使 用文件系统,可将存储器空间当作直观的名称空间,以代替原始的地址空间,不用每次新的应用开 发都从头使用存储器;可以提供与底层存储器无关、清晰的编程接口API,使上层应用不再关心底 层具体设各,而方便地利用标准接口访问存储器。由于接口的标准化,也保证了程序的层次性,增 加了程序的可移植性。文件系统可以帮助系统管理大量的数据,如程序参数,记录文件等,并能提

供直观接口,方便用户使用;能帮助建立更复杂的应用程序,如数据库等。

在ucLinux中,所支持文件系统也有多种,如ext2。romfs,fat,jffs等,ucLinux默认的根文 件系统为roⅢfs:但是前面也提到romfs存在不能动态檫写保存数据的缺陷,对于需要用到动态擦 写数据的系统,一般可采用两种对策:一是采用虚拟R埘盘,即在内存中开辟一块R.^6I。在其上挂

载既T2文件系统,把它当作一个RAjl盘使用。其晟大的缺点是系统掉电后R删盘的内容全部丢失, 即不能掉电保护数据。二是在flash上挂接JFFS或JFFS2文件系统进行处理.不但能够动态擦写数 据,也支持掉电保护数据。

4.1在flash上实现文件系统

文件系统的实现当然需要存储器的支持,而在嵌入式系统中,可作为数据保存的(即支持掉电 保护)的存储器包括有硬盘,电子盘,flash等。硬盘虽然容量可以很大,但在操作和实现比较困 难,电子盘的价格昂贵,所以,大多数系统使用FLASH存储器来存放代码和数据,而在flash存储 器上建立文件系统具有普遍的意义1

4.1.1 flash的分类和特点

Flash存储器分NOR型和NAND型两种,NOR和NAND是现在市场上两种主要的非易失闪存技

IIIP术。NoR的特点是芯片内执行(】a畔cX。cutelaoc),这样应用程序可以直接在n勰h闪存内运行, 不必再把代码读到系统RAM中。NoR的传输效率很高,在l~4MB的小容量时具有很高的成本效 益,但是很低的写入和擦除速度大大影响了它的性能。NAND结构能提供极高的单元密度,可以达 到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于nash的管理和需要特殊的 系统接口。本课题中讨论的是NOR型n∞h,下面提及的n∞h没有特殊说明都是指NoR型。

Rash存储器不象普通的块设备,即不能对同一地址写入两次,而是必须先进行耗时的擦除操作, 而且一次必须擦除一个扇区。具体地来讲,在扇区擦除后,所有位都变成为“l”,在写入操作时, 可使得必要的位从“l”变为“O”,但是要让位从“0”变为“1”,就需要在进行擦除操作,而擦除 操作比较耗时,且在擦除操作时,不能再进行正常的读取操作。NOR型n∞h每个扇区的擦除次数

都有限制,一般10万。100万次,而写入操作对nash损耗不大,一般没有次数限制。

FLASH存储器接口有两个标准:CFI和JEDBc。aⅡ为公共HASH接口,用于帮助程序从FLAsH

芯片中获取操作方式信息,而不用在程序中硬编码FLAsH的m;皿EC用来帮助程序读取FLAsH

的制造商Ⅲ和设备D,以确定FLASH的大小和算法。 由于上述这些与众不同的特点使得必须要为n∞h存储器开发专用的文件系统,而不能使用已有 的文件系统。

2l

东南大学硕士学位论文

4.1.2在flash上建立文件系统

针对嵌入式系统的应用环境以及FIAsH芯片的特性,对文件系统一般有如下要求:一是掉电安 全(cfash^)0、Ⅳcrdown—safc),嵌入式系统的运行环境一般比较恶劣,但同时又要求有比较高的可靠性, 这就对FLAsH文件系统提出了较高的要求,无论程序崩溃或系统掉电,都不能影响文件系统的一 致性和完整性,文件系统的写入,垃圾回收等操作对系统异常终止都非常敏感,极易造成数据丢失 和数据垃圾。二是平均使用(we廿Icvding),如上所述,FIAsH扇区的擦除次数都有限制,文件系 oll∞don),任何存储器在分配使用一段时间之后,都会 的使用寿命。三是高效垃圾回收(garbagec出现空区和碎片数据,这就需要进行垃圾回收,以保证存储器空间的高效使用。而FL.~sH擦除以扇 区为单位,垃圾的回收也应以扇区为单位,先移动扇区数据。再擦除整个扇区。四是低空间消耗(10w

统对HASH的使用必须充分地考虑该特性,最好能均匀使用FLAsH的每个扇区,以延长卧sH

ov盯11ead)。o耐Iead指文件系统管理结构在FIASH存储器上的空问消耗,这部分空间用于文件系

统建立,而不能用于实际数据的存储,因为,一般嵌入式系统中存储器空间有限,低空间消耗可以

提高有用数据的存储空问。

针对上述对文件系统的要求,如何实现嵌入式flash文件系统呢?这其中有三种常用方式:一 是集中管理式文件系统,现在的台式机器使用的大多属于这种类型,其主要特点是存储器空间的使 用信息集中存放在存储器的某个地方,而这个关键的信息区如果损坏,则文件系统将无法恢复.如 果在FLASH上使用这种文件系统需要大量的R.^M空间作为FLAsH的更新缓存,这类文件系统在掉电 安全上有明显的缺陷:二是线性文件系统,又称连续存放文件系统,每个相关的所有信息都连续存 放在存储器中,与集中管理式文件系统相比较而言,实现更简单,读写更快速,更重要的是将文件 系统的关键信息分布存放,这种文件系统更适合用于FLASH存储器.但对文件的操作效率很低,不

S),这种文件系统顺序 容易实现添加.插入,剪切等操作;三是日志文件系统(Log—StnlcturedF

写入对文件系统的修改.就象做日志记录一样,可加速文件写入和崩溃恢复。本文接下来将重点讨 论这种文件系统。

4.2 JFFS文件系统

4.2.1 JFFS的特点

JFFs是由瑞典的AxIs通信公司开发的文件系统,是专门针对无盘嵌入式系统中FLAsH存储器 而设计,由于其遵循GPL开放源码,所以很容易利用其思路进行移植工作。目前已经有了JFFS的第 2个版本即JFFS2,新版本主要改善了存取策略以提高FLAsH的抗疲劳性及优化了碎片整理性能,

增加了数据压缩功能。

下面来看JFFS是如何来满足前面提到的对基于FLASH存储器的嵌入式文件系统的要求:为了保 证文件系统在任何情况下都是安全,完整和一致的,JFFS使用了日志方式,即LOG结构的文件系统: 为了保证FLASH空间不溢出,JFFS提供了有效的垃圾回收功能,即在FLASH上创建JFFs文件系统 后,经过一些修改和操作,就会出现不在使用的数据区。称为脏区,当脏区超过一定数量后就必须

F进行垃圾回收操作了,顺序是从前到后,即前面的先清除;为了保证存储器的平均使用率。JFS具

有疲劳均匀(war—leveling)的特性,JFFS就像一个循环文件:在末端写入,始端进行擦除或垃 圾收集,而可在任意位置进行读操作,这样对存储器空间的来说也是一种循环使用方式。

4.2.2 JFFs的结构分析

下面简单介绍一下JFFS文件系统的结构设计,以JFFS2的版本为例

22

苎婴童!型竺:!堕奎堡墨竺婴!

在存储格式上,JFFS2是以Log-Stnlctured为基础的日志式的,日志的组成单位是存储节点,

每个存储节点与一个inode相关联,inode是JFFS2文件系统的基本组成构件,每个文件或目录(看 成特殊的文件)都有且只有一个inode描述,因此inode的编号是唯一的。

——一污瓣区毽豳 有敢区[=]空白区

图4.1 JFFs文件系统结构图 如上图所示.各个文件的存储节点按

照建立的时间先后.顺序地存储在F1ash上.并且在可利

用的存储空间里严格地按线性增长。存储空间由若干擦写块组成,各个擦写块之间相互独立,存储节 点不能超越擦写块的边界存放。在JFFSl文件系统中存储节点类型只有一种。JFFS2文件系统支持 的存储节点类型较前者要丰富。JFFs2沿用了ext2文件系统中兼容位码的方法.允许用户为系统定 义新的节点类型。所有类型的节点都有一个通用头部,头部包含了节点的类型、长度、头部CRc校 验位等信息。节点类型字段的最高两位有特殊含义.它的取值代表着当内核不支持当前节点类型时 应该采取的操作,它们是;(1)JFFs2一FE^11艇卜INc0好AT:拒绝安装该文件系统;(2)JFFS2一

FE删RE_R0c0MPAT:以只读方式安装文件系统;(3)JFFS2一FE删RE_Rwcojl2PAT-DELETE:以读写方

式安装文件系统,当回收废弃块时,删除该节点:(4)JFFS2一FE^11瓜E-R删PAT_c0PY:以读写方

式安装文件系统,当回收废弃块时,要将该节点完好无损地复制到新的存储空间中。

在JFFS2文件系统中定义了3种具体的节点类型。 (1)JFFS2_NODETYPE—INODE:这种节点用于存储普通文件的数据,在节点的起始位置存放着所

ffs2一raW-inode结 属文件的系统信息,随后是文件的有效数据。系统信息的存储格式由struct j构给出(定义在jffs2.h文件中,位于标准Linux内核源代码目录中),其主要属性如下。1)ino: 节点所属文件的inode编号;2)version、Ⅲode:存储节点版本号、文件模式;3)uid、gid:文件 属主id、所属组id;4)atime、mtime、ctime:3种时间戳,分别表示最后访问时间、最后更新时 间和创建时间;5)dsize,csize:所含数据压缩前和压缩后的大小;6)data_crc、node_crc:数 据校验位、节点校验位。每个节点都有个版本号(version字段).同一inode的存储节点版本号之 间存在升序的关系。新节点的版本号总是不小于旧节点的版本号。如果旧节点包含的数据被新节点 覆盖,该旧节点将被标为作废节点。作废节点占有的存储空间称为“污染空间”,是可以被回收再次 利用。存储节点的数据可以被压缩存储,为了加快读取整个页面数据的解压缩速度,系统规定每个 节点的数据不能超过所在硬件平台的页面值。

一 rffs2(2)JFFS2-NODErYPE_DIRENT:这种节点用于存储目录文件或inode链接符。stnlctja'

rdirent结构给出了它的定义(在jffs2.h中定义)。具体属性如下。1)pino、ino:父inode号、 所属inode号;2)ver2sion:本节点版本号;3)nsize、n∞e:文件名长度和文件名;4)node—crc、 name—crc:节点校验位、名字校验位。删除文件链接操作是通过写一个新的同名目录节点到存储介 质上,并置ino字段‘O’值实现的:而改名操作JFFS2系统则分为两步实现:第一步是用新的名字 和老inode号生成一个新的目录节点,产生一个新的链接。第二步用老名字生成一个inode号为‘0’ 的目录节点来断开原来的链接。这样在改名过程中系统可以通过新老两个链接名访问目标节点,这

0rtable O种策略符合POSIx(ThePperating Syst∞Interface)规范的要求。

东南大学硕士学位论文

(3)TFFS2一NODETYPE—CLE^瑚^RKER:当成功回收了一个擦除块后,系统将在该擦写块上生成一 个这种节点,用于表明这个擦除块是可以安全使用的。

在理解JFFS2存储格式的基础上。接下来进一步讨论JFFS2文件系统重建操作。和其他的Linux文 件系统一样,JFFS2在系统启动的时候要向VFS注册,并在内存中建立完整的文件系统存储镜像。 但是启动结束后JFFS2文件系统并不是一直把所有的系统信息保存在内存,只局限于那些不易被快 速建立的信息。JFFS2系统的内存镜像主要通过两个数据结构来实现,它们分别是struct ffs2一inode—cache和stnlct jffs2一r卿1lode_ref。

砒r—ct

J他鼍哪n甜e..n订

U嚏tI刚fIag

图4.2 jffs2-rM—-nodeJef

如上图所示,jffs2一inode—cache是inode在内存中用于快速索引的数据结构.其中包含的信

息有:所属inode编号、该inode的物理存储块链表指针、inode的关联数。jffs2一rawllode—ref 是物理存储块在内存中索引结构,主要属性有:(1)next—phys:指向本擦写块下个存储节点的内存 索引块的指针;(2)next—in—ino:指向本inode的下一个存储节点的内存索引块的指针;(3) flashoffset:物理偏移地址。由于存储节点大小是4的倍数,所以该字段的最后两个数据位有特殊 意思,第l位保留待用,第0位用于表示本节点是否被废弃;(4)totlen:节点长度。JFFS2文件系 统的内存镜像建立工作是由函数jffs2一bu订d-filesystem()来完成的,其流程如下:(1)调用 jffs2一scan-mediⅧ(),扫描所有擦写块,将擦写块按类型插入到相应的链表中去.建立inode和 各种存储节点的缓冲链表;(2)扫描整个目录树,计算每个目录节点的关联数。建立每个inode与 其物理存储节点间的关联;(3)扫描所有链接数为0的inode节点并移除它们;(4)重新扫描一遍 文件系统镜像,删除暂时的文件系统镜像数据。

4.3枷m

我们知道,在做JFFS文件系统的具体应用实现时,并不一定需要了解J11毽本身的结构的实现, 只需要知道针对不同厂家,不同的型号的nash的接口,也就是JFFS是如何驱动(或者说是操作) FLAsH的。以JFFS2为例,JFf毽2对FLASH芯片的访问控制,如读写擦除操作等,都是调用MID 驱动来实现的,所以在实现JFFS2文件系统前,必须先了解一下什么是M1D。

MID(n1%lory慨llnologydcvice内存技术设备)是用于访问memory设各(I∞M、nash)的Lj肌x

的子系统。MTD的主要目的是为了使新的存储设备的驱动更加简单,为此,它在硬件和上层之间提

第四章ucLj叭x下的文件系统JFFs2

供了~个抽象的接口。MID的所有源代码在,d心re璐佃td子目录下。 可以将cFI接口的MTD设备分

为四层(从设备节点直到底层硬件驱动),这四层从上到下依次 是:设备节点、MTD设备层、 ̄frD原始设备层和硬件驱动层。

翳艮文件系统一|

陂件系掣和i l宇符设备节点一j

I块设备节点一l

l M

rD字犄设备一 |

MTD块设备p

MrD原始设备p

FLAsH硬件驱动p

图4’3 MTD结构图

l、F1ash硬件驱动层:硬件驱动层负责在i血时驱动Fl∞h硬件,uⅡ“MID设备的NoR Fl∞h 芯片驱动遵循c眄接口标准,其驱动程序位于drjvcn细td,ch袖子目录下。№悄D型F1∞h的驱动程序则位于,d巾reB,m旧『n∞d子目录下。

2、MTD原始设备:原始设备层有两部分组成,一部分是MID原始设备的通用代码,另一部 分是各个特定的只站h的数据,例如分区。用于描述MID原始设备的数据结构是mtd jDfo.这其中 定义了大量的关于MTDr的数据和操作函数。Ⅲ嗵_缸blc(m妯∞∞.c)则是所有MrD原始设备的列表, m

td._part(m嗵_pan.c)是用于表示MID原始设备分区的结构,其中包含了D埘iD如,因为每一个分

区都是被看成一个MTDc原始设备加在Ⅲ坩tr中获得。在driveB,mablted中的,删岫a,Ⅲap“子目录下存放的是特定的nrLmtdinf0中的大部分数据都从该分 区的主分区删山a小>mt髂h的数据,每

一个文件都描述了一块板子上的nash。其中调用addm衄d“iceO、dd mtd出vicco建立/删除mtdinf0结构并将其加~删除mtd诅ble(或者调用addmtdpam皿nO、delmtdparIi曲n0(mtdpaft.c)建立删除In嗵_part结构并将mtdpart如叫info加入删除mmIable中)。

3、MTD设各层:基于MID原始设备,linux系统可以定义出M’ID的块设备(主设备号31)

和字符设备(设备号90)。MTD字符设备的定义在Intdchar.c中实现,通过注册一系列趾opem60n

函数(1seek、叩∞、close、r∞d、wfb)。MTD块设备则是定义了一个描述MrD块设备的结构 mtdblk_dcv,并声明了一个名为Ⅲhlblks的指针数组,这数组中的每一个lmdbll【-dev和Ⅲcd切ble中 的每一个mtd inf0一一对应。

4、设备节点:通过Inknod在,dev子目录下建立MTD字符设备节点(主设备号为90)和MrD 块设备节点(主设备号为31),通过访问此设备节点即可访问hfrD字符设备和块设备。

2作为文件系统,则要将JFFS2的文件系统映像j凰.imc(或

j凰2.i

5、根文件系统:如果要将JFFS gmg)烧到n鹊h的某一个分区中,在觚M日n,Ⅲ∞h-yo删缸h.c文件的your_丘】【叩函数中将该分

区作为根文件系统挂载。

mounl6p、文件系统:内核启动后,通过Ⅻt姐上。

命令可以将Ⅱ∞h中的其余分区作为文件系统挂载到

简单地来讲,Mm可以理解为凡AsH的设备驱动程序,其主要向上提供两个接口,MID字符

设备和M’ID块设备。通过这两个接口,就可以象读写普通文件一样对FLASH设备进行读写操作。

经过简单的配置后,M1D在系统启动以后可以自动识别支持衄或JE珊'c接口的FLAsH芯片,

东南大学硕士学位论文

并自动采用适当的命令参数对FLAsH进行读写或擦除。同样也没有必要去细究M1D的具体实现代

码。

4.4JFFs2的实现

有了JFFS2文件系统及其对FLAsH的驱动耵D,下面就可以讨论JFFS2在UcLINUX系统中的具体实

现。下面是具体的实现步骤,这里用的n∞h是AM29LVl∞:

第一步:由于只0M设备和MTDBlock设备的主设备号(major)都是31,所以如果不想把JFFS2 作为根文件系统的话,必须修改他们之一的major。而修改JFFS2的设备major,在 u

CUnux-disnlinux-2.4.xVncIude、Iinux、m圳、mtd.h中把

#def.ne1 MTD—BLoCK.MAJOR 3改成

#d舒八e0 MTD-BLoCK-MAJOR 3第二步:添加MTD设备。在uCUnux-di龇怕ndo阽、sams帅g、4S10B、MaI(e啊le中添加MTD的

字符设备和块设备。

mtd0,c。∞.0 mtdl,c,∞,2、

mtdbl∞I(0。b。30,0 mldbI∞k1。b,30.1、 添加设备的数目根据你自己的需要酌情确定,另一点要说明的是:mtd字符设备次设备号(mlnor) 偶数是可擦写的,奇数是只读的。

第三步:添加在fl觞h上的map文件。在uCUnux.dis邓inux-2.4.蚋dnve噶\m埘\ma西下添加自 己mcu的map.这里添加的是s3c4510b.c,它是仿照同目录下的m5272c3.c修改的.具体程序见附 录,有几点说明:

(1)是关于FLASH。这里用的fIash是AM约LVl∞。它的容量是2M字节(或者1M字),程

序中的。

削枷neW斟DOWADOR0x0400∞∞

}埘e石neWINDl3^^,SlZEOIc:Ⅱ加∞O

#de啊neBUSWIDTH2 定义它的基地址,容量和宽度,它的基地址和容量可参看 uCUnux卅isn

的声明, BIinux.2.4.州ncIude、asm.anllnommu、arch?sndsloa、hardwa怕.h 中USWIDTH=2表示是16b_t.

删icstructms30451tcLpan街on0bLparti廿ons口巴{

name:”陀9erⅥBdforboaⅡoader(64K)”. size:0x010000。 01fset:0x0.

(2)程序中的

m∞Uags:MTD-WRrrEABLE

l,

name:。user(9∞IQ“。 size:0xF0【)00. o仟se

J;

七0)(10000

这是在月ash设备中分区情况,分了二个区,可以根据需要自己加减,masI(』ags:

MT叫^,R盯EABLE表示此区只读。

第四章uc“眦x下的文件系统J阡s2

(3)mvmtd.>e隔sesize=0)c8000:表示擦除的太小。为了把它集成到uCUn呱配置中,要修改

uCLjnux-dis州inux-2.4.柚d№懵\mtd\maps忉nfig.in中(位置可参考文件中其他模块)

jf【呻CONFIG._S3C4510B订l:the“ I鸽hddepjrIs龇’CFIFevi∞mapped噶\mtd、maps、Mak嘶le中

=s3c4510b.o obj?¥(cONFIG-_MTDi-s3C珥510B) +第四步:添加flash的驱动,在uCUnux-disl\|inux.2.4.x\dn坩懵\mtd\chipS下的是chip的驱动层 程序,由于AM29Lvl60不在支持范围之内,但它和AM29F800BT类似.只不过Manufactu怕懵id 0B onS3C4510目CONF|G—MTD._S3C451Samsung¥CONFlG—MTD—CFI 们 和uCLjnux.disnIinux-2.4j州nve不同和分区大小不同,所以在jedec.盥blen中添加

mfr id:MANUFAC丁URER HYNlX.

dev id:AM29LVl60.

name:。AM29LVl∞1.

DevSize:SIZE 2MiB. NumE曙∞R钓

iO哺:4, regions:lERASEINF0(Dx8000,31)。

ERASElNFO(c|)(04000。1). ERASEINFO“啪1000。2), ERASElNF0“I)c04∞

0,1)

} 第五步:在makemenu∞n69下配置

选项。

在linuxKemeI、,2.4.孙ucoComgu删on下

Memo吖T’∞h∞logyDe、,i∞s(MTD)下

CoNFIGMTD墨y CoNFIGMTDDEBUG嗣Y CoNFIG—M下D.-DEBUG—VERBOSE置3

CoNFIGMTDPARTITlONS皇Y CONFIGMTDCHAR-Y CoNFlGMTDBLOCK州

RAM,RoM,FIashchipdme倦下

CONFlG MTDCFlaY CONFlG

MTD.JEDECPROBE吖

CoNFlG MTDCFIAMDsTD;吖 Mappingdnve侣f;orchipaocess下 CONFIGS3c4510B三Y FiIe

systems下

CONFIGJFFs2Fs=Y

CONFIG—JFFS2一FS—DEBUG=2

在uCUnuxv1.3.4con|igun甜on下 FlashTOOIs下

CoNF旧.USERMTDLrrILs-Y CONFlGUSER MTDUTILSERASE=Y CONFlGUSER MTDUTILSERASEALL置Y

东南大学硕士学位论文 CONFIGLUSER—MTDUTJLS—MKFSJFFS2暑Y

BusyBox下选中删,cp。dd.mount,umount,mkdir工具。

通过以上步骤后,就可以生成一个带有JFFS2文件系统的内核,可以通过以下几个方面来验证

这个结论的正确性:

首先在启动信息中将会看到有关JFFS2和FLASH的相关信息。其次在系统启动后,通过控制 台在,proc目录下输入“cat mtd”命令来查看MTD的分区情况,然后可以通过以下命令在MTD 的一个分区上生成一个JFFS2的映像:

/p,v^m£,m锄’nfoc>cnd矿蛐jp蛳>蛐矗

蠡2

,v^mE,仰pa帅>>cmdlj。d凰2irj

凰加in

/vaE恤p石m2》“丘kl

,va咖砷0侬2’∞t坷e1

COUC∞

,va咖印a舷2>cd..

,v/va札fI,nbn印p>>Ien瞄el出,dj脑2删枷ldj施2-

0j凰2.iIIlg

,v咖m’Dcpj舔2.img^dev,In坩1op∞

mDw矗te

MTDdO∞

现在可以挂载JFFS2分区:

~蛐7衄驴>mount_tjfb2^dcv佃删od【1/mnt

mtd【blocK叩en

ok

~Ⅲ帅>/岫t>bc

d/bnt

biⅡ

同el n)to

/m圳.)cd慨

/p∞柏/∞oroc>c砒mI咖协矗wO

/dev抽ot,mⅢ缸m00

/p嗽/伽DcpT0c刑00

,d田rframl,v扯ex也rw00

,de、r,皿dblockl/mntifb2rw00

第五章uc“姗x在LED异步卡中的应用

第五章ucLinux在LED异步卡中的应用

5.1 LED异步控制卡

5.L l异步卡的介绍

u’D显示屏作为户外信息传播的重要手段,越来越得到人们的认可,特别是作为众多大型基础

工程如机场。高速公路,体育场等的配套设旅,其需求量也日益增长。

从显示效果上看,uD显示屏历经了单色屏,双色屏,到现在的全彩屏的发展过程。而从屏的 控制系统看,um显示屏分为同步屏和异步屏。同步屏即通过同步控制系统.在屏体上实时显示信 号源端的图象或文字信息。而异步屏显示的信息是之前由同异步控制系统下载并保存的。本课题中 的应用设计即是对异步控制系统(通常叫作异步卡)的研制。

传统的异步卡方案基本上采用5l单片机,其特点是价格低廉,且实现简单。但这种异步卡所能 控制的象素点较少,在实现带灰度图象时的缺陷也是明显的。

本课题中将嵌入式系统应用到异步卡中,在硬件上依靠32位的ARM芯片和四LD来达到系统

的高速处理能力。在软件系统上,采用ucLinux操作系统,通过对多任务的高效管理提升整个系统

性能。

5.1.2本异步卡的设计指标

本系统以实现网络远程数据接收,高速、大容量图文数据处理和大容量数据存储空间为主要设 计目标,归纳起来主要有以下几点:

(1)屏体扫描宽度设计为:256线; (2)实现灰度显示.最大灰度等级为256级(8b“/pixel); (3)单色图像显示刷新频率不低于100HZ,灰度图像显示刷新频率为60Hz;

(4)系统最大存储容量(以102秘256为例),单色图象3000幅,256级灰度图象150幅: (5)通讯方式:实现10M/lO叫LAN网络数据通信:

5.2异步卡的硬件方案

5.2.1异步卡系统的硬件框图

本设计的硬件系统设计如下图:

东南大学硕士学位论文

图5.1异步卡的硬件框图 下面简述一下各个模块的具体芯片: 电源部

分:输入为5v,而整个系统工作电压为3.3V,故采用sipex公司的SPxl587可调型电

源芯片,最大输出电流为3A:同时由于ARM芯片内核工作电压为2.5V,这里采用sipex公司的 sPxlll7固定输出型.最大输出电流800mA; 嵌入式微处理器:采用的是三星ARM芯片

ORs3“Box,具体参数可参考芯片资料: Nnash:采用AM29LⅣ16们吧,lM‘16bit; N^NDnash:三星K9F5608.32M+8bit; 网络芯片:LAN9lcll(sm∞),实现MAC层和根据cMsA厄D以太网物理层协议的物理层:

(HD:ALTEIlAMA)(3000A系列的口M3256,158个I/0口,有5,000个基本逻辑门,256个

宏单元;

2M x SDRAM:HY57V28i62佣C,4BⅢ11【s x16bits: SRAM:ISSI公司IS61LV25616,256K整个硬件系统可以分为两部分。嵌入式部分和凹LD上屏部分。图中左边大部分属于嵌入式部

X16bit; 分,主要包括ARM芯片(控制部分),网络芯片,HAsH和sDRAM。而图中右边的cPLD和两片

sRmd属于(MD上屏部分。

5.2.2异步卡系统的工作流程

本系统的工作流程,也即数据传输过程是这样的:先是上位机程序采集图象信息,并按照即定

∞h 格式组织好数据,然后本系统通过网络或串口与之通讯,把接收到的数据写入相应的NANDn中,接着再从相应的NA】如Inasll读出把每帧的图象数据写到SRAM中,这部分工作是由以s3“BOX

为控制核心的嵌入式部分完成,当然在写sRAM的过程中需要和oLD来配合,即电路上把S3“B OX 根地址线A的18DDRrADDRl8,16根数据线DAl[A旷D朋『A15及sRAM的控制信号NWBEl, NwBEO,读写信号NOE,NEw,片选信号NGcS5都连在四u)中,同时sRAM芯片相应的信号

线也接到cPLD上,然后由CPLD控制使这两部分信号对应接通.这时s34480X即可对SRAM操 作了,注意这里只能进行写操作。当数据写入sRAM中后,就由a,【D来完成把SRAM中的数据 送到um屏上,这里分读SRAM数据和上屏两部分。对SRAM的读写操作采用所谓的ping-p∞g 逻辑,即虽然两片sRAM都是连在CPLD上,但是cPLD在读某片sRAM时,需要把另一片的控 制权交个嵌入式部分的ARM芯片来写入数据,当数据写完后在双方交换一下操作对象。在把数据

30

第五章uc【j呲在uD异步卡中的应用 送上屏时,凹LD需要产生上屏所需的控制信号:串行移位时钟、行选通信号、消隐信号等。

5.2.3嵌入式部分和CPLD部分的通信协议

在实现上面提到的ping-pang逻辑时,就涉及到嵌入式部分和口uD上屏部分配合的问题,即握 手协议。这里是通过两个帕口线来实现的,即s344BOX芯片的PG4和PG5,其中对s34480x来

说,P(巧设置为输出口,PG4设置为输入口,而对于CMD来说正好相反。协议具体逻辑为:初始

时两个∞口线都为低电平,嵌入式部分中的ARM芯片和a,LD上屏部分中的CPLD芯片各控制

一块sRAM,即AItM芯片对甲片sRAM写入数据,cPLD芯片读乙片sRAM的数据。从ARM芯 片一端看,在ARM芯片写完数据后,使GP5口线置高电平,向(聃Ⅲ提出切换sRAM的请求信号, 并检测GP4口线电平,如为低则等待直到GP4口线电平变高,GP4口线电平变高说明a,u)完成了 对SRAM控制权的切换,然后AItM芯片使GP5置低,表示一次切换完成,接着再对乙片SRAM写

入数据,再重复上述逻辑;而从四【D一端看,在CPLD芯片扫描完一帧数据后,会检查GP5口线 是否有高电平,无则继续扫描下一帧数据,如有则表示ARM芯片写完了sRAM的数据要求切换,

这时oLD进行SRAM的切换,即把乙片sRAM写数据控制权交给ARM芯片.而口LD芯片读甲

片SRAM,然后使GP4口线置高电平。表示切换完成,接着从甲片SRA】 ̄I读出每帧数据扫描到u∞

屏,在每帧数据的扫描间隙,检查GP5口线电平.如为低,则把原来为高电平的GP4口线置低,如

为高,则表明是新的切换请求信号,则重复上述逻辑。两个∞口线的示意时序如下,上面为GP5

口线,下面为GP4口线:

厂]

厂]. 厂]

厂]

图5.2 ARM与CHD握手时序

具体的硬件方案说明及电路图设计可参看庄伟同志的论文《基于嵌入式linu系统的异步uD 大屏幕显示控制板的硬件平台设计》。

5.3异步卡的软件方案

由上一节可知,整个硬件系统可以分为两部分,嵌入式部分和四LD上屏部分。这里仅涉及嵌

入式部分。 分析前面的工作流程可知,嵌入式部分的任务可分为两部分:一是随时接收远端(上

位机)发

送来的图象信息,并保存在NANDnash。接收信息的通讯方式有两种,网络和串口。网络采用TcP,Ⅲ 面向连接的通讯协议,基于标准socl。et通讯模式,保证数据的可靠传输。在普通串口下,采用通用 的异步串口通讯模式传输数据。二是不断地从NANDn∞h读出数据,按上屏要求写入SRAM。

5.3 .1软件进程的分析

这两个任务可以说是并行工作的,在操作系统中,可以多进程或进程下面的多线程来实现。

ucLinux中的线程是有内核调度程序完成的,与进程相比较,线程消耗的系统资源较少,创建 较快,相互间的通信也比较容易。但是如果一个线程调用了一个阻塞的系统调用,线程所在的进程 可能被阻塞,当然这个进程的其他线程也同时被阻塞了。而且线程的实现需要相应的线程库支持, 而在实际测试过程中,发现现有的ucLinux中线程库并不完备,故程序设计中并没有采用线程,而 是采用了进程。

3l

东南大学硕士学位论文

前面也提到,由于pajnⅡ没有MMu内存管理单元,故在实现多个进程时(fofk调用生成子 进程)需要实现数据保护。由于pc【jnⅡ的多进程管理是通过vfork来实现.因此fork等于vfork。 这意味着pCIjnux系统fork调用完成后,要么子进程代替父进程执行(此时父进程已经sIe印)直到 子进程调用e疵退出:要么调用exec执行一个新的进程,这个时候将产生可执行文件的加载,即使 这个进程只是父进程的拷贝,这个过程也不能避免。当子进程执行e妣或excc后.子进程使用wakel】p 把父进程唤醒,使父进程继续往下执行。这就意味着父进程和子进程或者子进程和子进程不能同时

运行,显然不能符合这里要求。

所以,这里我们设计了两个并行的进程,从系统上来看即是两个程序。分别叫做通讯进程和 sRAM进程。这里就涉及到两个进程之间的通信问题,因为从上面的任务中也可以看出来,两个进 程都涉及到同个nash的操作(可以看成是普通文件流),一个是写,一个是读。我们知道,n勰h或者 普通文件流是不能同时进行读和写的操作,故这里就需要通过进程间通讯来达到两个进程问的同步。

5.3.2软件进程间通信的分析

所谓进程问通讯(Ⅱ,c)就是指多个进程之间相互通信,交换信息的方法。常见的进程间通信的 方法有以下几种:共享内存,信号量。管道,命名管道,消息队列等,这些都只适合于本地进程通 信。还有可用于远程通信的如套接口在网络编程中将涉及。

共享内存是系统中最底层的通信机制。也是最快速的通信机制。顾名思意,共享内存就是通过 两个或多个进程共享同一块内存区域来实现相互问通信,通常是由一个进程创建一块共享内存区域, 然后多个进程可以对其进行访问。虽然这种通信方式是最高效的进程问通信方式,但实际的问题在 于它本身就存在同步的问题,即不同进程同时读写一块共享内存中的数据时会发生混乱。针对这个 问题,一般是通过使用信号量来配合使用来实现进程间的同步。

信号量的实质是整数计数器,记录了可访问的共享资源的单元个数。当然。信号量并不仅仅用 于互斥共享内存的同步操作.它可实现对任意资源的锁定机制,即可以用来同步对任何共享资源的 访问。信号量中常见的形式是双态信号量,用于只有一个可供访问单元的互斥共享资源,保证任一 时刻至多只允许一个进程对资源进行访问。从上面的叙述可以看出j信号量本身只是一种实现进程 同步的机制,而无法进行包含有具体信息的通信,所以光用信号量无法满足本设计的要求。当然, 上面也提到,一般是用共享内存和信号量配合使用来到进程通信及同步的目的,在本课题的进行中, 也进行了相关的实验。虽然在功能上基本能达到要求,但首先同时使用共享内存和信号量,程序显 得烦琐,其次与后面要介绍的管道通信比,在满足本设计的要求方面,不如后者的简单方便。

管道(p虹≈).在Ij¨x中是作为一种特殊文件存在于内存中的,它的一个显著特点就是:当一 个管道建立后,将获得两个文件描述符,分别用于对管道的读取和写入,即通常称为的管道写入端 和读取端,而对一个进程来说,管道的写入与读取操作和对一个普通文件的读写操作相比没有区别, 只是内核中用这种机制来实现进程间的通信而已。和前面介绍的共享内存相比,管道机制通信速度 上要慢一些,但是使用上管道要方便的多。但是管道也存在其固有的局限性,首先管道只能用于两 个进程间的通信,而不能用于多进程间的通信。其次,通信的两个进程要有同源性,同源即他们必 须是由同个进程派生出来的进程,此外,管道是半双工方式的,只允许单方向传输数据。对于最后 一点,我们可以建立两个管道,一收一发,用两个半双工的来实现数据的双向传输。但是对于第二 点,在前面进程的分析中可知,本设计中,两个进程不能是同源的,只能是两个独立的进程,所以. 管道无法满足本设计的要求。

在使用上一样方便,即一旦创建,就可以像普通文件一样进行读写操作,此外,命名管道也只能用 于两个进程的通信,而且也是单向数据传输,所以要用命名管道实现两个进程问数据的相互交换, 需要使用两条命名管道。那么。命名管道与管道相比,其特殊体现在哪儿昵?首先,命名管道可以 用于任何两个进程间的通信,而不限制这两个进程是否同源,所以命名管道的使用要灵活的多,这 也符合本课题中的设计要求。其次,命名管道作为一种特殊的文件存在文件系统中的,而不是像管

32

即jo)是一种特殊的管道,又称为先进先出队列,它与管道 我们看一下命名管道,命名管道(

第五章uc“呲在Ⅱ'D异步卡中的应用 道一样存在内核。当进程对命

名管道的使用结束后,命名管道依然存在与文件系统中,所以在使用 时要注意,当不需要命名管道时,要记得对其进行删除操作.否则该命名管道不会消失。

同时要注意命名管道的阻塞问题,在实际调试过程过也遇到过。阻塞可能发生在两个地方,首 先是在通讯进程在初始化时建立创建了两个命名管道,然后用只读和只写方式分别打开,在用只读 方式先打开l号命名管道后,进程并不立即执行打开2号命名管道的操作,而是阻塞在这里等待 sRAM进程用相反方式(只写)打开1号进程,如果sRAM进程在初始化时先用只读方式打开通讯 进程创建的2号命名管道,那么进程也会阻塞在此等待通讯进程用只写方式打开2号进程,这样两 个进程就形成了死锁.都无法继续执行。当然避免这个死锁的方法也很简单,即sRAM进程先打开

1号进程就行了。也就是说,~个命名管道(普通管道也是一样)只有在写端和读端读打开过后才 算真正建立起来。其次在命名管道的读端读信息时,如果写端并没有写入信息,或则信息已经在读 端已经被读走了。这时读端的进程就会阻塞在次。这也就是说写端写入的信息在读过一次后就消失 了。并不永久保存在管道中,如果管道中没有信息,读端的操作可能会阻塞。这个问题可以从两个

NoNBLOCK标志,这样在管道没有 方面着手解决,一是在用open函数打开只读管道时,设置0L信息时,读操作也不会阻塞,而是立即返回。二是。在写端不要求通讯时,关闭(c10se)该管道, 这时读端也会因为没有信息可读而立即返回.当然读操作(read)返回的读出信息量为0:本设计才 用了后面的解决方法。

5.3.3软件进程间通信的具体协议

两个进程(通讯进程和sRAM进程)间的通信协议具体如下:先说通讯进程,在初始化时,先 建立两个命名管道.然后以只读和只写方式打开,发送并接收完测试信息后,关闭只写管道,这样, 每次sRAM进程端读出。个信息;然后在有网络连接时,通讯进程先打开只写管道并写入sToP信 息,然后等待sRAM进程回应oK信息,接着读网络数据保存。结束后在写管道中写入oK并继续 关闭该管道,这样一次通信完成:而在SRAM进程一端,在初始化时用相反的方式打开两个管道(即 SRAM进程里的只读管道是通讯进程的只写管道.SRAM进程里的只写管道是通讯进程的只读管 道),接着发送并接收完测试信息,然后循环从只读管道中读取数据,如果读出的信息量为O,则从 通讯进程保存的数据文件中读取数据写入sRAM中;如果管道有信息,则先看是否为s1DP,如是 则回应oK,并循环读管道直到读出oK为止,否则继续上述逻辑,这样也就完成了一次通信:

5.3.4软件流程图

综合上述,本设计中将建立两个独立的进程(通讯进程和SRAM进程),来完成接收数据和把 数据写入sRAM的任务,两个进程通过命名管道来是实现两个进程间的通信及同步,整个应用软件 的示意图如下:

通讯进程 1.建立命名管道 2.接收数据 3.保存数据

删进程

1.打开命名管道

.进程间通信7

2.读数据写入sRAM 3.与CPLD通信

图5_3软件示意图

通讯进程框图如下:

东南大学硕士学位论文

建立两个命名管道(只 读,只写)。并用只读和 只写方式分别打开

J』L

发送管道测试信息; 关闭只写管道

U 一初

始化网络。注意这 里设置为服务器端

图5.4通讯进程流程图

写sRAM进程框图如下:

第五章ucLi删x在uD异步卡中的应用

图5.5写SRAM进程流程图

5.4主要功能块的软件实现

5.4

.1进程通信的实现

1.首先看一下通讯进程的建立命名管道和测试信息的接收和发送:

if((mIdifo(册1,FⅡE MODE)《0)&&(efmo!=EE)(IsD) if((eⅡ幽卿2rr

sys(’乜m,FtcⅡEreaMtoeD%sE)《0。,F)&&徊_Ⅲ01); rⅡo!;嘲ST)){

Ⅷ】ink毋Ⅲ01);

err』”(”c锄tcmtc%s”,FⅡ;;02);

l’

35

东南大学硕士学位论文

rweraidtfedf=do=pocpn∞(唧l,O册2J'DOO、张oNI墨0I);//只读方式打开管道f叮LEifol

0);/,只写方式打开管道石f02 砌Lc№nt(0);,,向只写管道中写入信息”OK” waiLcli∞tO;,,等

待从只读管道中读出回应信息 close(writefd)://关闭只写管道 与之对应的sRAM进程对管道的初始化: Writefd=open(FIF0l,o_WRONLY,0)://只写方式打开管道丘fol

readfd=open(FIF02,o_RDONLY'0)://只读方式打开管道fi尬

tell server(0):,,向只写管道中写入信息”OK” Wait server():/,等待从只读管道中读出回应信息

2.两个进程间通信的实现。先看通讯进程一端: Writefd=open(FIF02,0_WRONLY,0)://只写方式打开管道丘fol tell—client

(1)://向只写管道中写入信息”SToP竹

%it_client()://等待从只读管道中读出回应信息

if(strncmp(buff,response[0】,2)!=o)

{ //如果不是正确的回应信息则进行错误处理 }

else//收到正确的回应信息 (

//从网络接收数据并写到数据文件中

tell.client(0)://向只写管道中写入信息”OK”

J close("itefd)://关闭只写管道 与之对应的sR枷进程的通信实现: While(1)//大循环

memset(buff,0,姒】(LI旧://清信息缓存区

clienti=Wait-server()://从只读管道中读出信息 if(clienti一0)//如果没有信息 f?//从数据文件中读出数据写入SRAII中

else if(clienti>0)//如果有信息

While(strncmp(buff,response[0],2)I_O)//判断是否为oK

{ if(st丌IcⅢp(buff,response[1],4)一O)//判断是否为STtell一server(O)://向只写管道中写入信息”OF

m∞set(buff。0,姒)[LINE):////清信息缓存区 Wait—se玎,er()://继续从只读管道读信息

} ) }

5.4 .2网络通信的实现 1.先看初始化:

if((sock“一listen=socket(AF_INET,SOCK_STRE_^lI,O))<o)//建立套接字

{ err_quit(’failed tD creat listen socket\n’): ) socket-addr.sin-f∞ily=AF-IN盱:

36

oP信息

本文来源:https://www.bwwdw.com/article/84ng.html

Top