RT-Preempt笔记

基于Zynq平台的Linux实时性研究及在数据采集中的应用_马啸

嵌入式实时系统研究现状

实时操作系统专门用于在时间约束条件下运行时间关键的应用程序。用于操作处理实时任务所需的最坏情况执行时间(Worst Case Execution Time,WCET)是实时系统最为关心的。从二十世纪90年代开始,实时操作系统在嵌入式系统领域里逐渐占据主导地位。越来越多的用户选择使用实时操作系统。因为中国有最大的电信市场,所以中国也是世界上最大的实时操作系统的市场之一。随着计算机技术和芯片制造工艺的发展,越来越多的应用环境中使用到了嵌入式系统。从民用的电视、智能电话到军用的飞机、坦克,随处可见嵌入式系统的身影。实时嵌入式系统也得到了广泛的应用,因此市场需求是分巨大。有很多系统设计企业和开发组织相继推出了实时操作系统。这些实时操作系统由于需求不同,设计不同,因此有不同的特征。常见的嵌入式实时操作系统有:FreeRTOS,RTLinux,RT-Thread,μClinux,μC/OS-II、eCos和VxWorks等。在此将逐一介绍。

FreeRTOS相较于国内,还是在欧美使用的更加普遍,但依然有不错的发展趋势。FreeRTOS是一个轻量级的开源实时内核。其内核本身只包含3个C文件,故它主要由C语言编写,只在需要的地方包含了一些汇编函数,1因此相较而言易于移植和维护。不同于Linux或者Microsoft Windows等操作系统中拥有高级功能,例如设备驱动程序,高级内存管理,用户账户和网络,FreeRTOS更加紧凑和轻便,开销很低,FreeRTOS通过优先级调度策略来调度任务。2

RTLinux是一个硬实时操作系统(RTOS)微内核,它将整个Linux操作系统作为一个完全抢占的进程来运行,核心代码由C语言编写3。硬实时属性可以让RTLinux应用于机器人控制、数据采集系统、工业制造和其他对时间敏感的仪器和机器。关键的RTLinux设计目标是使系统成为透明的,模块化的和可扩展的。透明度意味着没有不可打开的黑匣子,任何操作都应该是可以确定的。模块化意味着如果不需要,可以省略功能和该功能的费用。可扩展性意味着程序员应该能够添加模块并根据他们的要求定制系统。它具有简单的优先级调度器,也可以很容易地替换为更适合某些特定应用程序需求的调度器。

RT-Thread是一种用于嵌入式设备的开源实时操作系统。RT-Thread由位于中国的RT-Thread开发团队经过十年的全面集中开发。旨在改变中国目前的情况,即微控制器领域没有很好的开源实时操作系统。RT-Thread有8,32或256个优先级调度多线程调度,使用循环策略(RR)可确保具有相同优先级的所有线程将被平等调度4

μClinux是一种优秀的嵌入式Linux版本。虽然同标准的Linux相比,它的内核非常小,因为它是针对没有内存管理单元(MMU)的微控制器而设计。但它依然继承了Linux操作系统的特性,例如稳定性强、可移植、网络功能强、文件系统出色等5

μC/OS-II内核专为在有大量CPU架构上使用而设计6,μC/OS内核的功能包括:具有可选循环调度(RR)的抢先式多任务实时内核,高度可扩展,资源高效,拥有6K到24K字节的代码空间,1K字节数据空间,中断禁止时间非常短。

eCos是一个免费的开源实时操作系统,适用于只需要一个具有多个线程的进程的嵌入式系统和应用程序7。它旨在根据运行时性能和硬件需求的精确应用要求进行定制。它以C/C++实现,并具有POSIX和μITRON的兼容层和应用程序编程接口。它受到流行的SSL/TLS库的支持,因此符合嵌入式安全的所有标准。

VxWorks是由美国TPG Capital的全资子公司Wind River Systems开发的专有软件实时操作系统(RTOS),VxWorks于1987年首次发布,专为需要实时,确定性能的嵌入式系统而设计,在许多情况下还用于安全和安全认证,在航空航天和国防,医疗设备,工业设备,机器人,能源等行业广泛应用8。VxWorks的优先级调度策略包含固定优先级调度、FIFO调度策略和RR循环调度策略。

Preempt-RT发展历程

根据实时性系统要求,再结合Linux内核的特点,让Linux实时化有很多种方法,Preempt-RT就是让Linux内核实时化方法的其中一种。

从1995年到2004年,进行的是早期的将Linux实时化的工作。实时研究人员着手将Linux转换为实时操作系统。将Linux实时化的方法可分为两种:第一种是双核方案,利用Nano或Micro-Kernel作为RTOS内核,在其空闲任务中运行Linux内核。实例有:RT/Linux,RTAI,DROPS以及后来的Xenomai;第二种是在内核中实现实时,也就是修改内核代码本身以获得实时操作系统属性,实例有:KURT和Linux/RK。这些项目都没有真正合并到主线内核中。从2004年到2009年,Preempt-RT项目开始启动并逐步发展起来,2004年秋季,不同的相关方发布了各种补丁系列,提供了将Linux内核转换为实时操作系统的基本技术。

Ingo Molnar作为当时内核调度程序的维护者,他选择了一些补丁从头开始重写它们并将它们组合成一组一致的补丁,旨在实现完整的内核实时。很快就形成了一个由核心开发人员组成的小团队。在相对较短的时间内创建了第一个可用的Preempt-RT版本。

2005年的Linux内核峰会中讨论了将Preempt-RT集成到上游内核的一般方法,并且获得大多数开发人员的一致同意。前提是它不会破坏现有的工作,也不会为未来的开发造成障碍。这期间,Preempt-RT工作的大部分内容都进入了Linux内核,包括:通用计时,高分辨率计时器,互斥基础结构,通用中断处理基础结构,用户空间互斥锁的优先级继承,可抢占和分层的RCU,线程化中断处理程序等。
从2009年至2013年,在RedHat公司的资助下,Preempt-RT依然保持活力。

在2014年,RedHat彻底削减了Preempt-RT资金后,Preempt-RT成为业余爱好者项目。随后不久,OSADL提供全职资金,以便在2015年能够保持Preempt-RT的维护。在2015年,Linux基金会开始在Kate Stewart的领导下创建一个名为Real-Time Linux Collaborative Project的项目。该项目资金允许五名工程师全职工作,其明确的目标是将Preempt-RT补丁合并到主线内核中。

从2016年到2018年:Preempt-RT成为实时Linux协作项目。在这两年,Thomas Gleixner的Preempt-RT团队生成的数百个补丁被集成到Linux内核中。这项工作大部分是重构现有的上游代码,以便更轻松地集成Preempt-RT。主要成就是:重写CPU热插拔基础架构,重构高分辨率计时器等。虽然这项工作使Preempt-RT的集成和维护更容易,但它不仅仅是特定于Preempt-RT,它本身对Linux内核的质量和性能而言也很有价值。虽然这种努力减少了Preempt-RT补丁集的大小。在2017年底和2018年初发生Meltdown/Spectre安全灾难,使得Preempt-RT团队负责人Thomas Gleixner参与到Linux内核的针对这场灾难的缓解措施的开发当中,因此将Preempt-RT的开发速度降低了约两个月,现在已恢复正常。到目前为止,RT-Preempt实时抢占补丁成功地将对主线Linux内核的影响保持在最低限度9

RT_preempt补丁原理:

与实时相关的一个概念就是“抢占”,即系统有能在许多“抢占点”中断任务的能力。不可中断的程序单元越长,优先级较高的任务在启动或恢复之前的等待时间(“延迟”)就越长。GNU/Linux是“用户空间可抢占的":它允许用户任务在任何时候被中断。但是这种抢占程度依然不能保证系统是实时的。Preempt-RT的目标是提高实时性能。但Preempt-RT并不能提高吞吐量和整体性能,相反,它是降低整体性能。Preempt-RT也并不是减少了延时,而是将最大延时减小。因此,Preempt-RT重要目标是使系统的可预测性和可确定性增强。Preempt-RT用可抢占的构造取代不可抢占的构造,使操作系统尽可能地抢占。使中断线程化,这样中断处理程序也可以被调度10,自旋锁转换为互斥锁(换句话时说,睡眠自旋锁)不禁用中断并允许抢占适用于线程中断。

实时抢占补丁采用中断线程化、临界区可抢占、高精度时钟、优先级继承等方法提高Linux内核实时性。

1、临界区可抢占

实时最重要的方面,就是通过内核在任何地方都可以通过抢占来控制延迟。Preempt-RT通过重新实现实时互斥锁(rt mutex)使内核里的自旋锁(spinlocks)可被抢占1112。如下图所示,在一段不重要的代码之后产生了一个紧急的中断。由于紧接着不重要代码之后的是一段关键的代码部分,所以中断处理函数并不能得到马上运行,需要在关键代码执行完之后才能运行中断处理函数并唤醒另外一个进程。如图所示:

在这里插入图片描述

如果是实时内核,则内核增加了抢占点,则如下图所示,在关键代码部分依然有很多可以抢占的位置,而非重要代码结束后系统产生的紧急中断则可以在这些抢占点处得到运行。通过这种增加抢占点的方式,使高优先级任务以及中断处理能够得到及时的响应。

在这里插入图片描述

2、中断线程化

线程化中断也是Preempt-RT使Linux实时化的的主要工作10。使用中断处理线程来处理中断,使得中断处理程序可以在普通内核线程中运行,因此可以为其配置优先级。中断处理函数可分为上半部和下半部。在中断线程化后,其上半部依然做最小的工作,即回应中断,表示已经接收到了该中断,而中断下半部,则转化为内核线程用来处理中断。

在这里插入图片描述

如上图所示,TASK1是一个高优先级的任务。在普通内核中,高优先级任务TASK1就会因为被中断而被挂起,直到中断处理程序结束,TASK1才能得以继续运行。而在中断线程化后的内核中,发生中断后中断上半部依然正常执行,但由于其所做工作十分少,所以并不占用太多时间,中断下半部的工作由内核线程来执行,由于其优先级比TASK1的优先级低,故中断上半部结束后调度器选择TASK1继续执行,TASK1结束之后,中断处理程序才得以执行。通过这种方法,高优先级任务受中断延迟的影响便会减少。在实现中断线程化之后,几乎所有内核空间变为可抢占。其中,中断可以发生在任何时刻;被中断唤醒的进程也会得到立刻执行。

3、高精度时钟

Preempt-RT使Linux支持高精度时钟。Linux系统可以在体系架构和配置支持的情况下,将时钟频率从100HZ升级为1000HZ13相应的,定时器能够以1us的精度运行。从Linux v2.6.24-rc1开始,高分辨率定时器补丁被完全合并14,合并之后会出现一些问题,高优先级任务会抢占计时器中断线程,使其延迟很长时间。Preempt-RT实时抢占补丁包含针对这个问题的解决方案,根据信号需要被传递到的任务优先级来动态调整软中断优先级15

4、优先级继承

在这里插入图片描述

Preempt-RT解决了优先级反转问题。优先级反转问题如图所示16。一个低优先级任务获得了一个互斥锁,然后一个高优先级任务抢占了低优先级任务。但高优先级任务在执行了一段时间后也需要之前的互斥锁,此时高优先级任务便被锁住,只能等待低优先级任务释放互斥锁。低优先级任务在继续执行时,被一个中等优先级任务抢占,该中等优先级任务不需要互斥锁,因此可以持续运行。这相当于中等优先级任务即抢占了第优先级任务,也抢占了高优先级任务,于是发生了优先级反转问题。该问题造成了高优先级任务得到响应的延时增加。为提高系统实时性,必须解决该优先级反转问题。优先级反转问题可由优先级继承来解决,即获得互斥锁的进程会继承等待锁的更高优先级的进程的优先级[^17]。如下图所示,高优先级抢占低优先级任务之后,由于无法获得互斥资源便进入等待状态。原本的低优先级进程继承了此时高优先级进程的优先级后继续执行,当该进程释放了锁之后,就被高优先级进程抢占。通过这种方式,解决了高优先级进程被中等优先级进程抢占的问题。

在这里插入图片描述


参考文献:


  1. Barry R. Using the FreeRTOS Real Time Kernel - a Practical Guide[J]. 2010. ↩︎

  2. RandalE.Bryant,DavidR.O’Hallaron.深入理解计算机系统:a programmer’s perspective[M].机械工业出版社,2011. ↩︎

  3. 何挺有关RTLINUX的原理和应用浅析[J].中国科技纵横,2015(18):29-29. ↩︎

  4. 曹成嵌入式实时操作系统RT-Thread原理分析与应用[D].山东科技大学,2011. ↩︎

  5. 丁丁,汤晓斌,陈立德,殷树根基于 Clinux的FPGA远程更新系统的实现[J].电子技术应用,2014,40(03):6-8 ↩︎

  6. 俞佳敏,王成群,徐伟强实时操作系统1C/OS-1I最大优先级数扩展实现[J].无线电通信技术,2018,44(06):550-553. ↩︎

  7. 陆家珍.eCos的优化、移植及在UPS监控系统中的应用研究[D].武汉理工大学,2005. ↩︎

  8. Yue-Peng L I, Kang J J, Zhang J, et al. Abnormal Analysis and Processing Method in VxWorks Application Development [J]. Computer Knowledge & Technology, 2017. ↩︎

  9. RT-Preempt[EB/OL].https://wiki.linuxfoundation.org/realtime/tl/blog#preempt-rt-history. ↩︎

  10. 王帅华,杨东升,王允森,等,基于ARM的Linux实时抢占补丁的研究与实现[J].组合机床与自动化加工技术,2015(9):1-4. ↩︎ ↩︎

  11. 李玉奇,基于Linux的实时嵌入式操作系统内核的改进研究[D].沈阳理工大学,2011. ↩︎

  12. Spin locks [EB/OL] https//www.kernel.org/doc/Document ation/locking/spinlocks.txt ↩︎

  13. Hrtimers-subsystem for high-resolution kernel timers [EB/OL] https://www.kernel.org/doc/Documentation/timers/hrtimers.txt. ↩︎

  14. High resolution timerEB/OL] https://wiki.linuxfoundation.org/realtime/documentation/technical_details/hr_timers. ↩︎

  15. 万海龙linux嵌入式开发基本研究[J.西部皮革,2017,39(6):16-16. ↩︎

  16. 赵奇,索晓冉实时系统优先级反转研究[J].计算机应用研究,2008(06):1728-1730. ↩︎

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值