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

2019-06-11 22:49

第三章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


嵌入式Linux的分析及其在LED异步卡中的应用(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:业务培训开班讲话

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: