嵌入式实时Linux的技术研究

PC硬件使用的增加是近年来高端嵌入式系统的一个最重要的发展。由于这个趋势,嵌入式系统的硬件成本大大地下降了,然而应用于嵌入式PC平台的软件系统却没有太多的选择。

目前嵌入式操作系统主要有Palm OS,WindowsCE,EPOC,LinuxCE,QNX.ECOS,LYNX等,但这些系统一般都价格昂贵、不具有良好的可移植性。由于linux具有适应于多种CPU和多种硬件平台、性能稳定、裁剪性能好,开发和使用都很容易等特点,越来越多的人倾向于将Linux嵌入到移动计算平台、信息家电、媒体手机及其它产品中去。这同时也对Linux的实时性提出了更高的要求。

我们参加开发的上海数字技术中心的电子警察系统就是这样一个基于PC平台的嵌入式系统。它的主要功能是安装在十字路口上监视闯红灯的汽车,录制这些镜头,并适时通过网络传回总监控中心。该系统原来采用Vxworks作为运作平台,然而由于Vxworks的昂贵,且只能安装一台机器,因此将Linux改制成嵌入式的、具有一定实时性的系统平台。

1 硬件需求

考虑到实际的系统功能和系统开发的难度,我们决定选择X86体系作为平台,底板采PCM-5864/L板,CPU选择Intel的P55C系列,同时它也支持PC104接口。I/O方面,PCM-5864/L支持EIDE、FDD、Keyboard、Mouse、RS-232、USB等接口,同时也集成了10Mbps/l00Mbps网卡。另外PCM-5864/L还集成了显卡,并提供36位TTL的LCD接口、LVDS接口和Video-in/TV-out接口。由于电子磁盘体积小、抗震性能也较好的特点,我们选用M-Systems公司的DiskOnChip2000作为存储设备,这样比较适合该系统户外作业的特性。Doc2000还提供了安装的工具包、Linux下的驱动程序和对不同版本Linux内核的Patch。安装时只需对Linux内核和Lilo进行相应修改即可。这样的硬件选择使系统开发的难度大大降低了。

2 嵌入Linux主要解决的几个问题

由于采用X86体系作为平台,大大降低了嵌入化Linux的难度,主要要考虑的问题可分为以下几个方面:

2.1 非虚拟内存

Linux采用虚拟内存技术,当数据溢出内存时,可以将其交换到磁盘交换空间巾去,这对程序员来说是不可见的。然而,普通的嵌入式系统不需要这种强大的功能。实际上,可能不希望它在实时的关键系统里,因为它会带来无法控制的时问因素。因此,考虑将虚拟内存的功能去掉。然而,清除Linux的虚拟内存代码非常费事,我们采用一种迂回的方法,即将交换空间的大小设置为零。这样,如果你写的程序比实际的内存大,系统就会当作你的运行用尽了交换空间来处理;这个程序将不会运行,或者malloc将会失灵。这只是一种临时的解决方案,系统中存在许多冗余未清除的代码,如果进一步改进可以缩小系统体积。

2.2 处理文件系统

许多嵌入式系统没有磁盘或者文件系统,Linux不需要它们也能运行,这样可以在系统启动时就将操作系统和预先编好的应用程序全都加载到内存中去。然而.考虑到以后的扩展,我们分析了Linux当前的文件系统,将与系统和程序运行相关的文件析取出来,移植到Doc上面.这样就能为应用程序的开发人员提供更方便的接口。

2.3 设置启动(Lilo和BIOS)

当PC系统启动时,由BIOS执行了一些低水平的CPU初始化和其它硬件的配置,然后辨认哪个磁盘里有操作系统,把操作系统复制到RAM并且转向它。在PC上运行的Linux依靠PC的BIOS来提供这些配置和OS加戟功能。由于选择了X86系列作为平台,同样可以通过设置BIOS来设定由Doc启动。我们将内核安装在Doc上。同时修改目录/etc下的lilo.config文件,使Lilo记录内核代码在存储设备上的位置,然后将Lilo安装在Doc上。这样当系统启动时.BIOS指定Doc为启动设备,这时Lilo被执行。它指出Linux内核的位置,加载内核。

2.4 设备驱动程序的编写

由于采用通用PC平台,有许多驱动程序都不需要自己再编写了。系统中,唯一需要编写驱动程序的设备是上海数字中心的数据采集卡.该卡采用的是Bt848芯片。Bt848是一块很常用的芯片.许多驱动程序都非常相近,因此编写它的驱动程序有很好的例子可以参考,相应的,编写应用程序只需调用驱动程序提供的接口即可,如同操作文件一样。

3 Linux的实时性分析

以上简要介绍了实现Linux的嵌入化过程,在嵌入化Linux的同时,还考虑提高它的实时性。于是着手分析Linux的实时性能和存在的不足。

概括来讲,影响操作系统实时性能的主要有3个方面:

(1)外部中断管理

我们知道,外部中断发生时,操作系统调用中断处理程序.进入核心态。为了保证系统执行的正确性,要求内核状态不重入,也即保证这部分关键代码执行结束之前不被打断。因此,这时进入关中模式,这是外部中断管理中影响Linux性能的一个关键的地方。在这段时间内,操作系统负责将中断发送到相应的设备驱动程序去处理,系统不能进行其它任何工作,为了减少这个过程损耗的时间,Linux内核利用底半处理过程(bottom-half-handler)帮助实现中断的快速处理。在Linux设备驱动程序中,往往将最关键最迅速的部分处理完成之后,将剩余部分任务放置到队列中。当中断响应完成后.再执行剩余部分的任务。在Linux中,主要设置了以下几个数据结构来标志未完成的任务。
enum{
TIMER_BH=0,CONSOLE_BH,TQUEUE_BH,DIGI_BH,SERIAL_BH,RISCOM8_BH,SPECIALIX_BH,
ESP_BH,NET_BH,SCSI_BH,IMMEDIATE_BH,KEYBOARD_BH,CYCLADES_BH,CM206_BH,
JS_BH,MACSERIAL_BHISICOM_BH
};

上面每一项标识未完成任务的队列类型,不同队列的任务轻重缓急不同。
extern unsigned long bh_active;
extern unsigned long bh_mask;
extern void(*bh_base[32])(void);
bh_base代表的指针数组中可包含32个不同的底半处理过程。bh_mask和札bh_active的数据位分别代表对应的底半处理过程是否安装和激活。如果bh_mask的第N位为1.则说明bh_base数组的第N个元素包含某个底半处理过程的地址;如果bh_active的第N位为1.则说明必须由调度程序在适当的时候调用第N个底半处理过程。这些数据结构的设置一般是在外部设备初始化和中断处理函数运行时进行的。如:在serialc中进行serial设备的初始化,它调用语句init_bh(SERIAL_BH,do_serial_bh);来设置bh_base[]数组中相应于SERIAL_BH的那一项。又如:在serial设备的处理程序中通过语句queue_task(&info->tqueue,&tq_serial);将不是很紧急的任务放入tq_serial队列中,等中断处理函数结束,由bh_base中注册的底半处理程序处理队列中的任务。

中断管理的第二个关键部分即是系统是否允许中断嵌套的能力,也就是说,当响应一个中断时,是否允许其它更高优先级的中断打断,等更高优先级的中断处理完毕,是否还能恢复原来中断处理的现场。通过这项功能,系统设计者可以指示外部中断的优先级,从而确保高优先级的任务能及时处理。Linux允许中断嵌套,它是利用外部中断管理器来设置中断的优先级的。在Linux的中断处理程序的启动过程中,它一般调用语句mask_and_ack_8259A(irq);来设置8259中的int_mask寄存器.使优先级比此中断低的中断不能发生。在中断处理程序离开时,调用enable_8259A_irq(irq)来改回8259中int_mask寄存器原来的值。因此,intr类中断的优先级由硬件8259来决定.

由此可见,Linux的中断管理部分具有高效的特点,已经可以满足许多软实时任务的要求。

(2)进程抢先调度

在许多控制系统中,实时控制软件是非常简单的,可以直接写入中断处理程序中与一个特定的中断联系起来。还有一些就不那么简单了,必须开启专门的用户进程为它服务。

这时当这个高优先级的进程提交时,如有其它进程正在运行,它就必须打断正在运行的进程。若正在运行的进程运行在用户态,系统一般允许它被打断且执行其它优先权高的进程,若正在运行的进程运行在系统态,则此时是否允许被打断决定了系统是抢先式的还是非抢先式的。

Linux就是一个非抢先式的操作系统,在用户执行系统调用时,不允许其它进程的调度,这样就影响了系统的响应度。一个真正的抢先式的操作系统允许正在系统状态下的当前进程被打断,然后进程切换回来时还能继续从刚才的执行点继续下去。但某些关键部分的代码段。系统必须保证其原子性,并防止重入。通常有如下几种方法:

在关键代码断前关闭中断,等其执行完毕之后再将中断打开; 设计一个信号量.在关键代码段之前加锁,在其后解锁; 
在系统代码中保证安全的地方加入切换进程的代码switch(),防止该进程长久占用CPU,允许调度其它进程; 在关键代码段加入一个switchaccept标志,开始该代码段时。将此标志置为否.离开时再置回原来的值.这样在执行该段代码时,即使进程调度器被激活,它也会先检查此标志。若为否,则返回,并不进行进程切换。 

(3)进程调度策略

第三个影响系统响应速度的关键部分就是进程调度的策略。对于一个实时性能强的操作系统来说,系统必须规定不同进程的优先级,并把优先级作为唯一的进程选择的标准。Linux的后期版本参照Posixl.b标准,在某些方面已经具备了一些实时操作系统的特性。Linux有两种类型的进程:一般进程和实时进程,它可以通过sched_setscheduler系统调用设置实时进程。实时进程比所有一般进程的优先级高,Linux设置实对进程的权重为它的counter值加1000;设置一般进程的权重为counter。因此,实时进程总会被认为是最值得运行的进程。

然而,Linux核心的设计主要集中在应用程序的吞吐量上。追求吞吐量的必然结果,就是Linux调度器运用一种"公平共享"的策略保证所有的进程得到平均的CPU资源。而且,Linux的进程调度器只是简单地将标有实时标志的进程的权重加1000,至于实时进程间的轻重缓急还没有周密的完整的设计。因此,Linux的进程调度器还远不能称作是一个真正的实时进程凋度器。

4 拟采用的策略

根据以上分析的特点,我们决定主要从以下4个方面来修改Linux的核心代码。

(1)在内核中插入抢先点 由于Linux是一个非抢先式的操作系统。因此当一个实时进程提交时,很可能因为当前的进程正处于核心态不能被打断而不能得到及时的处理。因此有必要在Linux内核中插入抢先点,使实时进程得到处理。根据上一节分析的特点,太体有4种方法可供选择。权衡这4种方法的利弊,我们决定采用第4种方法,即在关键代码段加入一个switchaccept标志,开始该代码段时,将此标志置为否.离开时再置回原来的值。这种方法比采甩semaphore的好处是,如果采用许多种semaphore的话.要考虑是否会产生死锁的问题。比采用锁中断的好处是.将中断锁住将丢失中断,而这样不会。而以固定的周期加switch语句显然有失灵活性。这样.采用这种方法,需要我们分析Linux所有系统调用的代码,画出其结构流程图。分析出哪些部分是关键部分,也即不允许置入的部分。在关键代码前后更改switchaccept标志。这项工作比较艰巨。同时修改进程调度器,使其判断switchaccept标志来决定是否执行进程切换。

(2)修改进程调度器Linux的进程调度器虽然已经具有一定的实时性能,但还远远达不到真正实时调度器的标准,因此需要修改其进程调度器,必要的话可让Linux运行在两种模式下,实时模式和分时模式。可设计一些相关的系统调用,并在实时进程提交时,将系统转化为实时模式,当实时进程结束时,再转化为分时模式。

(3)Linux的中断管理根据前面分析过的,Linux的中断管理及时地将紧要的任务完成后,将其余不重要的缓慢的任务放置在任务队列中,等到系统空闲(cpu idle())或系统调用等返回时再完成这些任务,这样就提高了系统的响应速度,同时,Linux还支持中断嵌套。因此,不再对其作太大改动。

(4)锁定内存 在本项目的规划中本打算实现Linux锁内存的功能,使优先权高的进程在内存中的数据不被换出,从而提高实时进程的运行速度。然而,在分析了Linux代码后,发现后来版本的Linux已通过系统调用sys mlock实现了此项功能。

5 结束语

采用上述方法修改了内核代码后,由于每个修改方案都是有一定的代价的,它在增加了系统响应速度的同时也在某种程度上降低了系统的整体效率,比如说将内核设置成可抢先的,在进程频繁的切换过程中也要消耗一定的cpu处理时间。因此,还需要对各种解决方案进行测试、比较。另外,为了减少嵌入式Linux自身的长度,在存储管理部分对虚拟内存也应作进一步的处理。

时间: 2024-08-24 05:43:02

嵌入式实时Linux的技术研究的相关文章

嵌入式linux产品USB设备动态监控技术研究

  嵌入式linux产品USB设备动态监控技术研究   笔者最近在做PVR项目的开发工作,涉及到使用移动硬盘作为刻录节目的存储空间.目前市场上的PVR产品大多采取内置硬盘的方式,但是对于客户来说不是很实惠,内置的硬盘客户无法作为他用,所以开发用外置USB接口的移动硬盘的PVR产品在市场上是很有的竞争力的,其他类似产品也是一样.首先我们需要正确地挂载到系统中,鉴于目前用户移动硬盘的文件系统可能有FAT32/NTFS/EXT2等多种,还有就是用户的移动硬盘可能有好几个分区,也不知道各个分区的文件系统

《Linux嵌入式实时应用开发实战(原书第3版)》——1.5 开源协议

1.5 开源协议 多数软件终端用户协议都明确限制了你只可以使用协议范围内的功能.典型的限制条件是不允许复制或重新发布.你通常会被警告不要试图对软件进行"逆向工程". 相反,开源协议是只要你愿意,就允许使用.修改和复制授权的软件.和权利相伴的是义务.如果你修改并发布了一个开源协议内的软件,你就必须将修改后的源代码也纳入该框架.你的修改就成为"派生的工作",也在该协议的范围内.这就允许其他使用者更好地理解软件,并按他们的意愿做出更多的修改. 开源协议也叫"公共

[文档]三网融合下基于云计算的实时转码技术的研究和应用

三网融合下基于云计算的实时转码技术的研究和应用 包盛  段保通  邵锋军 本文将探讨三网融合下视频内容的实时转码技术,通过该技术实现视频内容的在线实时转换和匹配,使得转换后的视频内容能够在各类终端上进行播放,同时基于云计算技术,搭建实时转码服务平台,为各类终端用户提供易用.开放.快速高效的融合视频服务. 关键词: 三网融合 实时转码 云计算    temp_12051107496046.pdf

实时性-基于蓝牙的实时多媒体传输技术研究

问题描述 基于蓝牙的实时多媒体传输技术研究 哥哥姐姐们,各位大神们,这是小妹的毕设题目,有谁给点思路啊,求求各位了 解决方案 http://wenku.baidu.com/link?url=mMs_hAkIgWgoCEBuFI1X9CY7HWEjED4RFx6Beol05nwauMh7UMQKXNFu14_WV9wSNwr5z8MbV5LUegSfBHdny8VsJ7xeUePQr5GVs8DLzC_

Windows CE嵌入式导航系统研究(关键技术)

1.1 GPS全球定位技术 GPS(Global Position System):全球定位系统,它是美国从上世纪 70 年代开始研制,历时 20 年,耗资近 200 亿美元,于 1994 年全面建成的利用导航卫星进行测时和测距,具有在海.陆.空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统.如今,GPS 已经成为当今世界上最实用,也是应用最广泛的全球精密导航.指挥和调度系统. 1.1.1 GPS组成 GPS 系统主要包括有三大组成部分,即空间星座部分.地面控制部分和用户设备部分[6

中国工程院院士李伯虎:面向智慧制造云的仿真与超算技术研究与思考

2017年6月14日,由中国电子学会主办.至顶网等协办的第九届中国云计算大会在北京国家会议中心正式拉开帷幕.本届大会围绕"生态构建 深化应用"主题展开,并受到云计算大数据领域院士.专家.产业高管.技术大咖以及其他各界人士的广泛关注.支持和参与. 中国工程院院士.中国电子学会云计算专委会副主任委员.中国大数据专家委员会顾问 李伯虎 14日上午,中国工程院院士.中国电子学会云计算专委会副主任委员.中国大数据专家委员会顾问李伯虎出席了本届大会,并进行了主题为<面向智慧制造云的仿真与超算

新的合作组织加快实时Linux的发展进程

Linux基金会在近日召开的LinuxCon大会上宣布,它获得了实时Linux项目的资金控制权,这让人们重新产生了希望:嵌入式Linux会实现其历时15年的目标,即获得相当于实时操作领域的RTOS的地位.实时Linux(RTL)组织摇身一变成了实时Linux合作项目,获得了更多的资金.更多的开发人员,以及与主线内核开发更紧密的整合. 据Linux基金会声称,将RTL移到其麾下有望"为行业节省数百万美元的研发费用".此举还会"通过稳健可靠的上游内核测试基础设施,改善代码质量,&

《UNIX/Linux 系统管理技术手册(第四版)》——2.2 bash脚本编程

2.2 bash脚本编程 UNIX/Linux 系统管理技术手册(第四版) bash特别适合编写简单的脚本,用来自动执行那些以往在命令行输入的操作.在命令行用的技巧也能用在bash的脚本里,反之亦然,这让用户在bash上投入的学习时间获得了最大的回报.不过,一旦bash脚本超过了100行,或者需要的特性bash没有,那么就要换到Perl或者Python上了. bash脚本的注释以一个井号(#)开头,并且注释一直延续到行尾.和命令行中一样,可以把逻辑上的一行分成多个物理上的多行来写,每行末尾用反斜

ftp服务器-毕设求大神指点!!题目是基于SaaS模式的分布式FTP服务器技术研究

问题描述 毕设求大神指点!!题目是基于SaaS模式的分布式FTP服务器技术研究 内容是: 目前,云计算正在各领域得到越来越多的应用,出现了多种云计算环境,掌握云计算的概念,熟悉相关云计算平台上的软件开发方法,对提高学生综合运用所学知识解决实际问题具有十分重要的现实意义.作为云计算平台之一的百度云,已得到了广泛应用, 本课题在理解FTP服务器模式的前提下,在saas环境下建立分布式的ftp服务,用户可通过ftp客户端传送数据. 该课题具有以下要求: 1. 了解云计算的基本原理,掌握基于saas的开