您的位置 首页 解答

嵌入式实时Linux的技术研究

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

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中注册的底半处理程序处理行列中的使命。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/297588.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部