1、 11.1嵌入式系统简介 11.1.1 嵌入式系统的定义 嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。Linux提供了完成嵌入功能的基本的内核和所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。将Linux看作是连续的统一体,从一个具有内存管理、任务切换和时间服务及其他的分拆的、微内核到完整的服务器,支持所有的文件系统和网络服务。11.1.2 嵌入式系统的特征 嵌入式系统是面向用户、面向产品、面向应用的,如果独立于应用自行发展,则会失去市场。嵌入式处理器的功耗、体积、成本、可靠性、速度、处理能力、电磁兼容性等方面均受到应用要求的制约,这
2、些也是各个半导体厂商之间竞争的热点。11.2 嵌入式Linux基础 11.2.1 嵌入式Linux的应用信息家电:PDA,机顶盒,Digital Telephone,Answering Machine,Screen Phone;数据网络:Ethernet Switches,Router,Bridge,Hub,Remote access servers,ATM,Frame relay;远程通信;医疗电子;交通运输;计算机外设;工业控制;航空航天领域 11.2.2 Linux作为嵌入式操作系统的优势1免许可证费用 嵌入式Linux的版权费是免费的,其购买费用仅为媒介成本。大多数的商业操作系统,例如
3、Windows,Windows CE对每套操作系统收取一定的许可证费用。相对地,Linux是一个免费软件,并且公开源代码。只要不违反GPL(General Public License,通用版权许可协议),就可以自由应用和发布Linux。2有很高的稳定性 在PC硬件上运行时,Linux是非常可靠和稳定的,特别是和现在流行的一些操作系统相比。有两个因素会影响稳定性,一是使用了混乱的驱动程序。驱动程序的选择很有限,有些稳定有些不稳定。一旦离开了通用的PC平台,需要自己编写。二是使用了硬盘。3强大的网络功能 Linux天生就是一个网络操作系统,几乎所有的网络防议和网络接口都已经被定制在Linux中。
4、Linux内核在处理网络防议方面比标准的Unix更具执行效率,在每一个端口上有更高的吞吐量。4丰富的开发工具 Linux提供C,C+,JAVA以及其他很多的开发工具。更重要的是,爱好者可以免费获得,技术上由全世界的自由软件开发者提供支持。Linux基于GNU的工具包,此工具包提供了完整与无缝交叉平台开发工具,从编辑器到底层调试。其C编译器产生更有效率的执行代码。5实时性 在实时性能方面,RT_Linux,Hardhat Linux 等嵌入式Linux支持实时性能;稳定性好,安全性好。11.3 Linux I/O端口编程 11.3.1如何在C语言下使用I/O端口一般方法 在存取任何I/O端口之前
5、,必须让程序有如此做的权限。要完成这个目的,可以在程序一开始的地方(但是,要在任何I/O端口存取动作之前)调用ioperm()这个函数(该函数在文件unistd.h中,并且被定义在内核中)。使用语法是:ioperm(from,num,turn_on)其中from是第一个允许存取的I/O端口地址,num是接着连续存取I/O端口地址的数目。函数ioperm()只能取得端口地址0 x000到0 x3ff的存取权限;至于较高地址的端口,需要使用函数iopl()(该函数可以一次存取所有的端口地址)。将权限等级参数值设为3(例如,iopl(3)),以便程序能够存取所有的I/O端口(如果存取到错误的端口地址
6、将对计算机造成各种不可预期的损害。同样地,调用函数iopl()必需要拥有root的权限。接着来实际地存取I/O端口。要从某个端口地址输入一个字节(8位)的信息,调用函数inb(port),该函数会传回所取得的一个字节的信息。要输出一个字节的信息,调用函数outb(value,port)。要从某两个端口地址x和x+1(两个字节组成一个字,故使用组合语言指令inw)输入一个字(16个bit)的信息,需要调用函数inw(x);要输出一个字的信息到两个端口地址,需要调用函数outw(value,x)。2替代方法:/dev/port 另一个存取I/O端口的方法是以函数open()打开文件/dev/por
7、t(一个字符设备,主设备编号为1,次设备编号为4),以便执行读与(或)写的动作(注意标准输出入函数f*()有内部的缓冲,所以要避免使用)。11.3.2 硬件中断与DMA存取 用户程序如果在用户模式下执行,不可以直接使用硬件中断(IRQ)或DMA。用户必须编写一个内核驱动程序。也就是说,在用户模式中所写的程序无法控制硬件中断的产生。11.3.3 延迟时间 在用户模式中执行的进程不能精确地控制时间,因为Linux是个多用户的操作环境,在执行中的进程随时会因为各种原因被暂停大约10ms到数秒(在系统负荷非常高的时候)。然而对于大多数使用I/O端口的应用程序而言,这个延迟时间实际上算不了什么。要缩短延
8、迟时间,需要使用函数nice将你在执行中的进程设定成高优先权,或使用即时调度法(real-time scheduling)。11.4 嵌入式Linux开发 11.4.1 构造嵌入式Linux前先要了解的几个关键问题1如何引导?在PC上运行的Linux依靠PC的BIOS来提供这些配置和OS加载功能。在一个嵌入式系统里经常没有这种BIOS。这样就要提供同等的启动代码。在大多数情况下,一个最小的通电自检模块,可以检查内存的正常运行、让LED闪烁,并目驱动其它必须的硬件以使主Linux OS启动和运行。2需要虚拟内存吗?由于CPU的原因,在嵌入式Linux中保存虚拟内存代码是明智的,因为将它清除很费事
9、。而且还有另外一个原因它支持共享文本,这样就可以使许多程序共享一个软件。虚拟内存的调入功能可以被关掉,只要将交换空间的大小设置为零。然后,如果用户写的程序比实际的内存大,系统就会当作用户的运行用尽了交换空间来处理,这个程序将不会运行。3选用什么样的文件系统?实际上,许多商业性嵌入式系统,提供文件系统作为选项。许多或者是专用的文件系统或者是MS-DOS-Compatible文件系统。Linux提供MS-DOS-Compatible文件系统,同时还有其它多种选择。文件系统可以被放在传统的磁盘驱动器、Flash Memory或其它这类的介质上。而且,用于暂时保存文件,一个小RAM盘就足够了。4如何消
10、除嵌入式Linux系统对磁盘的依赖?在一个嵌入式系统里,可能没有磁盘。有两种途径可以消除对磁盘的依赖,这要看系统的复杂性和硬件的设计。在一个简单的系统里,当系统启动后,内核和所有的应用程序都在内存里。这就是大多数传统的嵌入式系统工作模式,它同样可以被Linux支持。有了Linux,就有了第二种可能性。因为Linux已经有能力“加载”和“卸载”程序,一个嵌入式系统就可以利用它来节省内存。5嵌入式Linux达到怎样的实时性?在嵌入式领域中,实时并非是最重要的。嵌入式系统常常被错误地分为实时系统,尽管多数系统一般并不要求实时功能。实时是一个相对的词,常常被严格地定义实时为对一事件以预定的方式在极短的
11、时间如微秒作出响应,渐渐地,在如此短暂时间间隔内的严格实时功能在专用DSP芯片或ASIC上实现了。只有在设计低层硬件FIFO、分散/聚集DMA引擎和定制硬件时才会有这样的要求。11.4.2 嵌入式Linux开发环境 嵌入式Linux开发流程 11.4.3 开发嵌入式Linux的步骤1精简内核构造内核常用命令包括:make config,dep,clean,mrproper,zImage,bzImage,modules,modules install。(1)make config核心配置,(2)make dep寻找依存关系。(3)make clean清除以前构核所产生的所有目标文件、模块文件、核
12、心以及一些临时文件等,不产生任何文件。(4)make rmproper删除所有因构核过程中产生的所有文件。(5)make,make zImage,make bzImagemake:构核。make zImage:在make的基础上产生压缩的核心映象文件./arch/$(ARCH)/boot/zImage以及在./arch/$(ARCH)/boot/compresed/目录下产生一些临时文件。make bzImage:在make的基础上产生压缩比例更大的核心映象文件./arch/$(ARCH)/boot/bzImage以及在./arch/$(ARCH)/boot/compresed/目录下产生一些
13、临时文件。在核心太大时进行。(6)make modules编译模块文件。(7)make modules install 2系统启动bootsect是第一个被读入内存中并执行的程序。bootsect的启动程序如下:第一步,bootsect将它从被ROM BIOS载入的绝对地址0 x7C00处搬到0 x90000处,然后利用一个jmpi(jump indirectly)的指令,跳到新位置的jmpi的下一行去执行。第二步,将其他segment registers包括DS,ES,SS都指向0 x9000这个位置,与CS看齐。另外将SP及DX指向一任意位移地址(offset),这个地址等一下会用来存放磁
14、盘参数表(disk para-meter table)。第三步,接着利用BIOS中断服务int 13h的第0号功能,重置磁盘控制器,使得刚才的设定发挥功能。第四步,完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup程序,也就是setup.S,此读入动作是利用BIOS中断服务int 13h的第2号功能。Setup的image将会读入至程序所指定的内存绝对地址0 x90200处,也就是在内存中紧邻着bootsect所在的位置。待setup的image读入内存后,利用BIOS中断服务int 13h的第8号功能读取目前磁盘的参数。第五步,读入Linux的kerne
15、l。在读入前,将会先呼叫BIOS中断服务int l0h的第3号功能,读取游标位置,之后再呼叫BIOS中断服务int l0h的第13h号功能,在屏幕上输出字串“Loading”,这个字串在boot linux时都会首先被看到。第六步,接下来做的事是检查root device 3驱动程序在Linux系统里,设备驱动程序所提供的这组入口点由一个结构来向系统进行说明,此结构定义为:#includestruct file_ operations int(*lseek)(struct inode *inode,struct file*filp,off_ t off,int pos);int(*read)(
16、struct inode *inode,struct file*filp,char*buf,int count);int(*write)(struct inode *inode,struct file*filp,char*buf,int count);int(*readdir)(struct inode *inode,struct file*filp,struct dirent*dirent,int count);int(*select)(struct inode*inode,struct file*filp,int sel_ type,select_ table*wait);int(*ioc
17、tl)(struct inode*inode,struct file*filp,unsigned int cmd,unsigned int arg);int (*mmap)(void);int(*open)(struct inode*inode,struct file*filp);void(*release)(struct inode*inode,struct file*filp);int(*fsync)(struct inode*inode,struct file*filp);4.将X-WINDOW换成MICRO WINDOWS Microwindows是使用分层结构的设计方法。允许改变不同的层来适应实际的应用。在最底一层,提供了屏幕、鼠标/触摸屏和键盘的驱动,使程序能访问实际的硬件设备和其他用户定制设备。在中间一层,有一个轻巧的图形引擎,提供了绘制线条,区域填充、绘制多边形、裁剪和使用颜色模式的方法。在最上一层,提供了不同的API给图形应用程序使用。这些API可以提供或不提供桌面和窗口外型。