嵌入式Linux下的实时性增强方案

上传人:lis****211 文档编号:187955932 上传时间:2023-02-16 格式:DOCX 页数:4 大小:15.83KB
收藏 版权申诉 举报 下载
嵌入式Linux下的实时性增强方案_第1页
第1页 / 共4页
嵌入式Linux下的实时性增强方案_第2页
第2页 / 共4页
嵌入式Linux下的实时性增强方案_第3页
第3页 / 共4页
资源描述:

《嵌入式Linux下的实时性增强方案》由会员分享,可在线阅读,更多相关《嵌入式Linux下的实时性增强方案(4页珍藏版)》请在装配图网上搜索。

1、嵌入式Linux下的实时性增强方案摘 要:分析了嵌入式Linux在实时性方面的不足,针对Linux2.6内核的中断运行机制、 内核不可抢占性、自旋锁及大内核锁等问题进行研究,提出相应的实时性改进方法。测试表 明,改进后的嵌入式Linux实时性效果较好。关键词:嵌入式Linux;实时性;中断;可 抢占性;自旋锁Linux以其功能强大、源代码开放、支持多种硬件平台、模块化设计方案以及丰富的开 发工具支持等特点广泛应用在嵌入式系统领域。作为嵌入式产品的操作系统平台,具有较好 的实时性、系统可靠性、任务处理随机性是系统追求的目标,目前商业嵌入式操作系统实时 性能可以满足嵌入式领域的需求,但由于其价格昂

2、贵,应用受到了限制1。而嵌入式Linux 以其非常低廉的价格,可以大大地降低成本,逐渐成为嵌入式操作系统的首选。但由于其在 实时应用领域的技术障碍,要应用在嵌入式领域,还必须对Linux内核作必要的改进。本文以 S3C2410+Linux作为移动机器人操作平台,为了提高机器人任务处理的实时性,针对影响 Linux OS实时性能的若干方面进行研究,并利用相应的解决方法基于标准Linux2.6内核加 以实现,最后通过测试,验证了此改进方法的效果。1 Linux内核实时性分析1.1 Linux内 核制约实时性的因素衡量操作系统实时性的指标主要有中断延迟和抢占延迟。嵌入式系统中很多实时任务是靠中断驱动

3、的,中断事件必须在限定的时限内处理,否则将产生灾难性 的后果。大多数实时系统都是处理一些周期性的或非周期性的重复事件,事件产生的频度就 确定了任务的执行时限,因此每次事件发生时,相应的处理任务必须及时响应处理,否则将 无法满足时限2。抢占延迟就反映了系统的响应及时程度。针对Linux内核,中断关闭及中 断优先级执行机制、内核不可抢占性、自旋锁(spinlock)及大内核锁及一些O(n)的任务调 度算法影响了系统的实时性能。1.2现存增强Linux内核实时性的技术多年来,Linux实时性改进技术的发展主要有两种技术方案:(1)直接修改Linux内核。针对内核数据结构、调 度函数、中断方式进行改动

4、,重新设计一个由优先级驱动的实时调度器,替换原有Linux内核 中的进程调度器sched.c。这一方案主要是针对中断机制、任务调度算法进行改进的,较为 成功的案例为Kansas大学开发的Kurt-Linux。Kurt提高了 Linux系统中的实时精度,将时 钟芯片设置为单触发状态。对于实时任务的调度,Kurt-Linux采用基于时间的静态实时CPU 调度算法。实时任务在设计阶段就需要明确地说明其实时事件要发生的时间。这种调度算法 对于那些循环执行的任务能够取得较好的调度效果;(2)在Linux内核之外进行实时性扩展, 添加一个实时内核。实时内核接管硬件所有中断,并依据是否为实时任务给予响应。F

5、smLabs 公司开发的RTLinux就是依据这种策略开发设计的3。以上论述的两种技术方案有其可借鉴 之处,但如果综合考虑任务响应、内核可抢占性、实时调度策略等都将影响操作系统的实时 性能,因此,这两种技术还不能很好地满足实时性要求。为了增强嵌入式Linux实时性能, 下面将介绍中断机制、内核的抢占性以及大内核锁等相关问题。2 Linux实时性改进方法 Linux2.4及以前版本内核是不可抢占的,在Linux2.6中,内核已经可以抢占,实时性有所增 强。但是内核中仍然有不可抢占的区域,如自旋锁spinlock保护的临界区等。另外,影响内 核实时性能的因素还有中断运行机制、大内核锁机制以及调度算

6、法等。2.1 中断运行机制改 进 在Linux标准内核中,中断是最高优先级的执行单元,硬件架构决定了硬件中断到来的时 候在该中断没有被屏蔽的条件下必须处理。不管内核当时处理什么,即便是Linux中最高优 先级的实时进程,只要有中断发生,系统将立即响应该事件并执行相应的中断处理程序,这 就大大削弱了 Linux的实时性能。特别是系统有严重的网络或I/O负载时,中断将非常频繁, 实时任务将很难有机会运行,这对于Linux的实时应用来说是不可接受的。Linux采用的关 中断技术在关中断区域使相应实时任务得不到响应,增加了实时任务的中断延迟。Linux实 时化后自旋锁变为互斥锁的技术,但由于自旋锁的中

7、断处理不能及时响应,降低了系统的实时性能。因此,借鉴Ingo Molnar实时补丁的实时化方法,采用中断线程化技术改进中断运 行机制,中断将作为内核线程运行而且赋予不同的实时优先级,实时任务可以有比中断线程 更高的优先级,这样,实时任务就可以作为最高优先级的执行单元来运行了,即使在严重负 载下仍有实时性保证。另一方面,中断处理线程也可以因为在内核同步中得不到锁而挂载到锁 的等待队列中,很多关中断就不必真正的禁止硬件中断了,而是禁止内核进程抢占,从而减小 了中断延迟4。在初始化阶段,常规中断初始化和中断线程化的初始化在start_kernel() 函数中都调用trap_init()和init_I

8、RQ()两个函数来初始化irq_desc_t结构体,区别主要 体现在内核初始化创建init线程时,中断线程化的中断在init()函数中还将调用void _init ……for (i = 0; i < NR_IRQS; i+)/对于每一个中断建立一个中断线程 irq_desc_t if(desc->action && !(desc->status /有IRQ_NODELAY标志的中断不允许线程化 kthread_create(do_irqd,/建立线程 desc)desc, ……/分配中断线程优先级init

9、_hardirqs(kernel/irq/manage.c)来为每一个IRQ创建一个内核线程,最高实时优先 级为50,依次类推直到25。因此,任何IRQ线程的最低实时优先级为25,具体实现是通过 kthread_create函数创建的。功能实现等同于如下代码: init_hardirqs(void) *desc = irq_desc + i; & IRQ_NODELAY) desc->thread = "IRQ %d", irq);static int do_irqd(void * _, 5025 ……/*Scale irq thr

10、ead priorities from prio 50 toprio 25 */param.sched_priority = curr_irq_prio;if(param.sched_priority > 25)curr_irq_prio = param.sched_priority - 1;…… 在中断处理阶段当中断发生时,CPU调用do_IRQ()函数来处理中断, do_IRQ()在做了必要的相关处理之后调用_do_IRQ( )。_do_IRQ()主要功能为判断该中断是 否已经被线程化(核对终端描述符的状态字段是否包含IRQ_NODELAY标志),对于没有

11、线程化 的中断,将直接调用handle_IRQ_event()函数来处理。功能实现等同于如下代码:fastcall notrace unsigned int _do_IRQ(unsigned int irq,struct pt_regs *regs) ……if (redirect_hardirq(desc)/检测是否为线程化中断,若是则唤醒中断线程goto out_no_end;……处理非线程化中断 irq_desc *desc) ……action_ret = handle_IRQ_event(irq, reg

12、s, action); …… int redirect_hardirq(structNODELAY) | | !desc->thread)/检测irq_desc结构体,判断是否线程化 if (!hardirq_preemption | (desc->status & IRQ_ return 0;……if (desc->thread && desc->thread->state != TASK_ RUNNING)wake_up_process(desc->thread);&hell

13、ip;… 针对已线程化的情况,调用wake_up_process()函数唤醒中断处理 线程执行,内核线程将调用do_hardirq()来处理相应的中断。具体实现是通过 handle_IRQ_event()函数直接调用相应的中断处理函数完成的。对于紧急的中断(如时钟中 断),内核保持原来的中断处理方式,而不为其创建中断线程,这样就保证了紧急中断的快速 响应。2.2内核可抢占性设计 在Linux标准内核中,因不具有可抢占性和导致较大的延迟, 增加内核的可抢占性能,可提高系统的实时任务处理能力。当前修改Linux内核提高实时性 的方法主要有增加抢占点和改造成抢占式内核两种方法。增加抢占

14、点方法是在内核中插入抢 占点,通过检测抢占点调度标志来决定是否进行实时任务的调度。采用这种方法,在检测抢 占点标志时大大增加了系统开销,因此本方案采用直接改造Linux内核的方法,通过修改自 旋锁为互斥锁来提高内核的可抢占性5。即借鉴Ingo Molnar的实时补丁的实时化方法,使 用mutex互斥锁来替换spinlock自旋锁。使用mutex替换spinlock,可以让spinlock可抢 占。起初spinlock不可抢占性设计目的是避免死锁,可抢占性设计可能导致竞争者与保持者的死锁局面。中断处理函数中也可以使用spinlock,如果spinlock已经被某一进程保持, 则中断处理函数无法进

15、行,从而形成死锁。中断线程化以后,中断线程将挂在等待队列上并 放弃CPU让别的线程或进程来运行,让每个spinlock都有一个等待队列,该等待队列按进程 或线程优先级排队,如果一个进程或线程竞争的spinlock已经被另一个线程保持,它将把自 己挂在该spinlock的优先级化的等待队列上,然后发生调度把CPU让给别的进程或线程。 mutex 替换 spinlock 后, spinlock 结构定义如下代码:typedef struct structrt_mutex lock;/ 新的实时互斥锁unsigned int break_lock; spinlock_t; 其 中 struct rt

16、_mutex 结 构如 下:struct rt_mutexraw_spinlock_t wait_lock;struct plist wait_list;/优先级等待队列struct task_struct *owner; / 拥有该锁进程的信息int owner_prio;… … ;在如上代码中,类型 raw_spinlock_t就是原来的spinlock_t。即代码中的spinlock_t就是新设计的自旋锁。rt_mutex结构 中,wait_list字段为优先级等待队列。在mutex使用中,当遇到锁住的临界资源时,任务被 挂起到wait_list中,临界资源解

17、锁时等待任务被激活。临界资源被保护的同时可以抢占。 由于Linux内核底层的临界资源是不可抢占的,使用mutex替换spinlock的过程中,这部分 可以保留,仍由不可抢占的spinlock保护,如:保护硬件寄存器的锁、调度器的运行队列锁 等。不可抢占的spinlock被重新命名为raw_spinlock_t。spin_lock被宏定义为:#define spin_lock(lock) PICK_OP(raw_spinlock_t,spin,_lock,lock) 函数 PICK_OP 支持两种锁 共存机制,PICK_OP在编译阶段将锁操作转化为mutex或者spinlock:#defineP

18、ICK_OP(type, optype, op, lock) do if(TYPE_EQUAL(lock), type) _raw_#optype#op(type *)(lock); else if (TYPE_EQUAL(lock, spinlock_t) / 调用 gcc 的内嵌函数_builtin_types_compatible_p()_spin#op(spinlock_t *)(lock); else _bad_spinlock_type(); while (0)#defineTYPE_EQUAL(lock, type) _builtin_types_compatible_p(typ

19、eof(lock), type *)gcc的内嵌函数_builtin_types_compatible_p用于判断一个变量的类型是否为某指定的类 型,如果类型为spinlock_t,将运行函数_spin_lock;类型为raw_spinlock_t,将运行函数 _raw_spin_lock。实时rt_mutex在具体应用中,一个高优先级任务抢占该锁的同时,把先前的锁拥有者添加到互斥锁等待队列中,并在当前拥有该锁的任务task_struct中标记等 待该锁的所有任务;反之,不能得到该锁就把当前任务添加到锁的优先级等待队列中,直到唤 醒执行。为了防止优先级逆转,可以改变锁的当前拥有者的优先级为锁的

20、等待队列中任务的 最高优先级。rt_mutex可以使高优先级任务利用抢占锁进入临界区,这样内核不可抢占区 的数量和范围大大缩小,内核可抢占性有了很大的提高,且降低了实时高优先级任务的抢占 延迟,改善了系统的实时性能。2.3可抢占大内核锁设计 大内核锁BKL(Big Kernel Lock) 实质上也是spinlock,它用于保护整个内核,该锁保持时间较长,对系统的实时性能影响很 大6。采用Ingo Molnar的实时化方法,BKL使用semaphore实现,结构定义如下代码: struct semaphore atomic_t count;struct rt_mutex lock;实时互斥锁的

21、使用;由结构体发现,在BKL实现中利用了实时互斥锁rt_mutex,在改进后的spinlock结构体spinlock_t中也利用了实时互斥锁rt_mutex,因此可抢占大内 核锁和新的spinlock共用了低层的处理代码。使用semaphore之后,大内核锁就可抢占了。 3内核实时性测试 针对Linux2.6内核,本文并没有作出对内核调度算法的修正,只是探 讨了中断运行机制、自旋锁及大内核锁技术在系统实时性能上的局限性,所以实验测试主要 测试中断延迟时间和任务响应时间。实验环境:Intel 2 GHz CPU,256 DDR内存,Kernel 2.6.22 版本。测试结果如表1所示。由表可知,

22、在中断服务程序中写入标记,测试中断触发至中断服务程序执行平均响应时 间,标准Linux2.6内核平均中断响应时间为182 μs,改进后Linux2.6内核为14 μs。 采用开源软件LMbench3.0测试系统任务调度延迟时间,标准Linux2.6内核平均任务响应时 间为1 260μs,改进后Linux2.6内核为162μs。由此可见,改进策略在一定程度上大 大减小了中断延迟和任务调度时间,有利于改善移动机器人任务处理的实时性能。本文基于 Linux2.6内核的关中断、中断优先级、内核的不可抢占性以及大内核锁保持时间过长等问题 进行了实时性分析,提出了相应的改进方法。利用中断线程化、互斥锁的应用及大内核锁的 改进等技术提高了系统的实时性能,降低了内核中断延迟和调度延迟。改进后的内核在移动 机器人控制器平台中有很好的应用价值,提高了机器人控制的实时性能。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!