基于Linux内核修改的车载监控系统实时性研究

时间:2022-09-14 08:15:09

基于Linux内核修改的车载监控系统实时性研究

摘 要:针对以往车载监控系统存在较大延时的缺点,设计一种实时宽带车载监控系统。该系统通过在32位ARM微处理器中选用可抢占内核和O(1)调度器的Linux 2.6.13 操作系统,以直接修改Linux 内核的方式,从线程化中断、自旋锁可抢占两方面提高系统的实时响应性。测试表明,此系统的数据传输实时性和带宽可以满足车载监控的要求。

关键词:Linux; ARM微处理器; 线程化中断; 自旋锁; 实时响应性

中图分类号:TN919; TP914文献标识码:A

文章编号:1004-373X(2010)15-0173-04

Real-time Vehicle Monitoring System Based on Linux Kernel Modification

LIANG Zhong-hua1,WU Xiao-yun1, FENG Xing-le1,2

(1. School of Information Engineering, Chang’an University, Xi’an 710064, China; 2. Xi’an Research Institute of Navigation Technology, Xi’an 710068, China)

Abstract: A real-time wide-band vehicle monitoring system was designed in view of the long time delay of former vehicle monitoring system. The Linux2.6.13 kernel of O(1) scheduler and preemption in the 32 bits ARM microprocessor is selected. In order to improve real-time responsiveness, the kernel is modified directly by means of threaded interrupt and preemptive spin lock. It is demonstrated that the real-time performance and the band width of this system can satisfy the request of vehicle monitoring system.

Keywords: Linux; ARM microprocessor; threaded interrupt; preemptive spin lock; real-time responsiveness

0 引 言

随着信息化社会和公路交通的快速发展,车载监控系统已广泛应用于物流、公交、客运等方面,监控内容也由单纯的位置信息转变为实时在线的多媒体信息,这对系统的实时处理能力和传输带宽提出了更高的要求,选用高性能的嵌入式CPU成为目前高端车载监控系统的发展趋势,其中选择嵌入式操作系统又成为影响传输效率和实时性的重要因素。目前主流的商用实时嵌入式操作系统(如QNX ,VxWorks 和pSOS 等)由于价格昂贵、技术保密的特点而限制了它的广泛应用。而Linux操作系统具有开放代码,易于移植的优点,但由于其设计初衷是实现多任务/多用户功能,强调各任务共享资源的公平性,采用非抢占式的调度方法,所以无法满足实时系统的需求[1]。为了使Linux适应实时系统的要求,许多文献从内核构架、调度机制和抢占能力等方面对现有的Linux操作系统进行改良。文献[2]提出在Linux内核中插入抢占点的办法提高实时性,但该方法需要在很多模块中插入抢占点,实现复杂度很高;另外,若缺乏有效的机制保证抢占前后内核状态的一致性,特别是抢占点的插入位置选择不当可能使整个系统崩溃。文献[3]提出在Linux 内核基础上增加实时内核的双内核方式,该方法虽然实现了硬实时,但舍弃了Linux 固有的稳定性、可靠性、支持多种架构的优点,并且需要针对实时内核重新编写驱动程序。

本文以提高车载监控系统的实时性为出发点,通过线程化中断、自旋锁可抢占两方面对Linux内核进行修改,以基于ARM9内核的友善之臂mini2440开发平台,结合高性能的GPS模块和宽带GPRS通讯模块,设计了实时宽带车载监控系统,可以实现图像、声音、位置信息和报警等多任务的快速切换和高效队列管理,提高了系统的实时性。

1 车载监控系统的整体结构

车载监控系统的结构框图如图1所示。主要包括信息采集模块、数据处理模块、通信传输模块和监控中心4部分。

车载监控系统的工作原理如下:

GPS模块采集位置信息,摄像头采集监控图像,这些数据经串口传送到ARM控制器,经数据处理后,将位置信息显示于终端显示器,并通过GPRS无线通信模块将位置信息和多媒体数据发送到监控中心,存储到车辆监控数据库。客户可以直接访问监控中心,查看具体的监控图像和声音信息,实现对监控车辆的位置查询、跟踪、调度、控制指令,若车载终端遇到紧急情况,可以通过自动或人工方式把位置坐标或报警信息迅速传给监控中心,进行应急处理。

图1 车载监控系统结构框图

车载监控系统的软件工作主要包括基于嵌入式微处理器的Linux操作系统优化和车载监控应用软件两部分。其中应用软件的主要功能包括:GPS数据的接收处理与传输,信令的接收、处理与传输,建立基于TCP/IP协议的GPRS数据传输与通信。操作系统的优化是影响系统实时性的重要因素,下面将重点阐述。

2 系统实时性分析

尽管Linux操作系统的设计初衷是实现多任务共享资源,但随着Linux在实时控制系统中的应用,提高Linux实时性能也成为一个研究热点。通常来讲,影响Linux实时性能的因素主要包括中断处理机制、定时器的时钟精度、内核是否可被抢占、实时任务调度机制和调度算法等[4]。许多学者也在这些方面不断改进Linux操作系统的实时性,例如本系统采用的Linux 2.6.13内核采用了可抢占式内核和高效的调度算法,在中断响应和进程间调度切换时间等方面较以前的版本有明显的改进[5],但是内核中仍有大量的不可抢占区域影响着系统的实时性能。

其中最主要的制约因素有两点:

(1) 中断处理。在标准的Linux系统中,中断不可抢占,若系统一直处在中断处理状态,这样再紧急的实时任务都无法运行。

(2) 自旋锁。Linux 2.6内核普遍使用自旋锁,在自旋锁期间任务不能被抢占,这将增加抢占延迟。

具体到本文研究的车载监控系统,抢占式操作系统是根据优先级从高到低的顺序依次调度任务。分别是:系统监视、键盘扫描、位置信息采集和GPRS通信。其中系统监视任务将按照预先设定的处理表监视并处理其他任务,并能在监视任务出现差错时对其处理并恢复运行,提高系统运行的可靠性。位置信息采集部分放到定时器中断程序中执行,根据预设的时间间隔采集经度、纬度等位置信息,存储并更新地理信息缓冲区的内容;最后把位置信息按序存储在非易失性数据存储器SDRAM中。

由于车辆在行驶过程中速度很快,有些需要中断常规的位置信息传输任务,而响应实时任务(例如紧急报警、事故处理、路线引导等),因此对系统的实时性提出了更高的要求。因此,本文从监控系统的实际需要出发,借鉴TimeSys Linux思路[6],从中断处理和自旋锁两方面入手直接修改内核,采用线程化中断,修改spinlock自旋锁,以此保证及时响应车载系统中发生的紧急任务。

2.1 线程化中断

线程化中断的核心是将中断当作一个线程进行处理,同时根据中断是否紧急,又可分为实时线程化中断和非实时线程化中断两种类型。在中断初始化阶段,线程化中断与常规中断的惟一区别在于:线程化中断在内核初始化创建线程函数init()中调用init_hardirqs为每个中断创建一个在内核空间执行的内核线程。具体来讲,init_hardirqs()函数首先判断irq_desc[]数组的0~223项中是否存在action不为空,且该项声明可以被线程化(非IRQ_NODELAY)的项,若存在,则调用kthread_create()创建内核线程,并且唤醒该线程。

创建中断内核线程的主要代码如下:

for (i = 0; i < NR_IRQS; i++)

{

irq_desc_t *desc = irq_desc + i;

if (desc->action && !(desc->status & IRQ_NODELAY));

desc->thread = kthread_create(do_irqd,desc,″IRQ%d″,irq);

wake_up_process(desc->thread);

}

对于已被线程化的非紧急中断,根据中断号为其设置一定的静态实时优先级和调度策略。中断到来后,调用wake_up_process()函数唤醒中断处理线程,比较该中断线程和当前运行任务的优先级后作出调度决策,这样就保证当前运行的高优先级实时任务不会受到非紧急中断的影响;而在其他时刻内核线程将分别调用do_hardirq()函数和handle_IRQ_event()函数来判断并响应需要处理的中断。

可以看出:中断线程化具有以下优点:

(1) 对于实时任务,由于分配了更高的优先级,而且在调度时无需在用户空间和内核空间之间切换,使其运行更加高效。

(2) 对于紧急中断(比如时钟中断或紧急报警事件),内核保持原来的中断处理方式,而不为其创建中断线程,这样就保证了紧急中断的快速响应。

(3) 由于Linux 2.6内核采用复杂度为O(1)的调度机制,不会因为增加内核线程数而额外增加调度开销。

2.2 自旋锁改互斥锁

由于Linux 2.6.13内核中使用了自旋锁spinlock,存在大量的内核不可抢占的临界区,严重影响系统的实时性,本系统用实时互斥锁rt_mutex代替spinlock,以提高内核的实时性能。其结构体如下:

typede fstruct{

struct rt_mutex lock; /*实时互斥锁*/

unsigned int break_lock;

} spinlock_t;

struct rt_mutex

{ …

raw_spinlock_t wait_lock;/*原来的spinlock_t*/

struct task_struct *owner;/*拥有该锁的进程的信息*/

struct plist wait_list;/*优先级化的等待队列*/

int owner_prio;/*拥有该锁的进程的优先级 */

}

设置等待队列优先级的目的是为了改善实时性,每次spinlock保持者释放锁时总是唤醒优先级最高的进程或线程,而唤醒的时间复杂度为O(1)。对于实时rt_mutex,如果当前任务优先级高,可以抢占该锁,并且在新的锁拥有者的task_struct结构中增加一项mutex_list_t*locks_held,用于记录进程所拥有的互斥锁的相关信息,包括从该互斥锁继承的优先级、互斥锁的拥有者等,同时将锁的先前拥有者添加到该锁的等待队列中;若不能获得当前锁,则把当前任务放到锁的优先级等待队列中,直到锁的先前拥有者释放该锁,唤醒等待队列中最高优先级的任务进入临界区。结构类mutex_list_t 的定义如下:

typedef struct {

struct task_struct proc;/* 拥有锁的进程*/

struct mutex_list_t *next, *prev; /* 队列列表指针*/

struct mutex_t rt_mutex;/* 互斥锁*/

unsigned long inherit_rt_priority; /* 该锁继承的实时优先级*/

unsigned long inherit_policy;/* 该锁继承的调度策略*/

} mutex_list_t;

另外,实时内核中的一些底层临界区,比如调度器的运行队列、硬件寄存器必须是不可抢占的,所以必须由不可抢占的自旋锁保护[7]。函数映射结构PICK_OP是允许自旋锁与互斥锁共存的机制,但要在编译阶段将锁转化为合适的类型(rt_mutex或者spinlock):

#define TYPE_EQUAL(lock, type) builtin_types_compatible_p(typeof(lock), type *)

#define PICK_OP(type,optype,op,lock)

do {

if (TYPE_EQUAL(lock, type))

raw_optype_op((type *)(lock));

else if (TYPE_EQUAL(lock, spinlock_t))

spin_op((spinlock_t *)(lock));

else bad_spinlock_type();

} while (0)

#define spin_lock(lock) PICK_OP(raw_spinlock_t, spin,_lock,lock)

根据宏处理的结果,若锁类型为spinlock_t,将运行函数_spin_lock;若锁类型为raw_spinlock_t,将运行函数_raw_spin_lock。

3 试验结果

为了提高实时性测试结果的有效性和可信度,本文采用软硬件协同测试的思想[8],即在相同的系统硬件环境下,分别通过软件编程和硬件辅助设备测试系统的实时性能,并比较分析其结果,以达到互相验证和支持的目的。图2和图3分别是对采用标准的Linux 2.6.13和修改后的Linux 2.6.13,对位置信息和报警任务的响应时间进行5万次测试后的响应时间对照图,表1是平均响应时间的对比表。

图2 位置信息响应时间

图3 报警任务响应时间

表1 任务响应平均时间对比结果μs

位置信息报警信息

标准的2.6内核1 472203

修改后的2.6内核16013

以上测试结果表明,通过对实时Linux 2.6.13内核进行中断线程化和互斥锁的改进,监控系统的实时性提高了一个数量级。

4 结 语

通过线程化中断和自旋锁改为互斥锁两方面对Linux 内核进行改进,提高了基于ARM9的车载监控系统的实时性能。设计并完成了宽带实时车载监控系统的样机,能够实时传输车辆位置数据和多媒体信息,解决了多任务并行处理的实时性问题。随着3G网络的建成和完善,研究基于3G网络的超宽带实时可视车载监控系统将是未来发展的方向。

参考文献

[1]王继刚,顾国昌,徐立峰,等.强实时性Linux 内核的研究与设计[J].系统工程与电子技术, 2006, 28(12):1932-1935.

[2]WANG Yu-chung, LIU Kwei Jay. Some discussion on the low latency patch for Linux[D]. Berkeley: University of California, 2001.

[3]陈文星,张辉宜.嵌入式Linux的实时性改进技术[J].计算机技术与发展,2006,16(10):114-117.

[4]曾树洪,刘卫国.Linux内核抢占的实现机制分析[J].惠州学院学报:自然科学版,2008:28(3):56-59.

[5]何克右,周彩贞.Linux 2.6进程调度机制的剖析[J].华中师范大学学报:自然科学版,2007,41(4):520-522.

[6]RAO M V Panduranga, SHET K Chandrashekar, BALAKRISHNA R,et.al. Development of scheduler for real time and embedded system domain[C]//22nd International Conference on Advanced Information Networking and Applications. [S.l.]: Workshops, 2008: 1-6.

[7]褚文奎,张凤鸣,樊晓光.嵌入式Linux系统实时性能测试研究[J].系统工程与电子技术,2007,29(8):1386-1390.

[8]YANG Jian, CHEN Yu, WANG Hua-yong, et al. A Linux kernel with fixed interrupt latency for embedded real-time system[C]//Proceedings of the Second International Conference on Embedded Software and Systems. [S.l.]: [s.n.], 2005: 131-135.

[9]高婷,王晓楠.基于域的交通联网监控模型研究[J].现代电子技术,2010,33(5):161-163,170.

上一篇:基于RFID和GSM网络\银行支付的自动售货系统 下一篇:一种Windows下实时高效图形绘制算法