微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux的技术分析

嵌入式Linux的技术分析

时间:03-26 来源:互联网 点击:

之前不被打断。因此,这时进入关中模式,这是外部中断管理中影响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设置实对进程的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top