嵌入式实时操作系统(RTOS)设计
田上飞 王庆华(Rainbow队)
摘要 本文从实时操作系统实时性的重要性出发,引出了基于优先级和时间片的实时性的实现方案:链表+位图,并在此基础上提出了一种嵌入式实时操作系统的实现方案——ATOP操作系统。
关键词:嵌入式 实时操作系统 优先级调度 时间片轮询
1 前言
实时操作系统(RTOS)是指能满足实时控制系统的实时性要求,可有效管理系统任务及资源的操作系统软件。实时性是指对物理过程发生的真实时间的限制和要求的满足程度,是RTOS区别于其它OS的一个重要特征。RTOS正确性不仅依赖系统计算的逻辑结果,还依赖于产生这个结果的时间。实时系统能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出响应的系统。因此实时系统应该具有在一定的时间范围内识别并处理相应事件的能力。可见对于实时系统实时性的重要性,它要求系统运行程序的时间精确并可预知,也即在系统运行之前,可一定程度上预知某一时刻哪个任务或程序段在运行,特别是在强实时操作系统中。
2 任务调度
在操作系统中,应用功能被设计成几个任务来完成,一个任务是一个进程或线程,它是一个具有独立功能的程序段的一次运行活动,是系统调度的基本单位。对于一个特定的硬件平台,在运行环境相同条件下,一个任务的实际运行时间是一定的。这样,RTOS的实时性的保征就落在了任务调度上。
常见的任务调度策略有优生级调度、时间片轮询调度等,本文介绍基于优先级和时间片的调度。优先级调度的方式常用的有任务队列和优先级位图。任务队列调度时都需要一定程度的优先级排序,这导致了任务调度时间的不确定性。在T-kernel,FreeRTOS中定义了一个全局变量来记录当前系统中最高优先级的任务,在调度时间上比直接优先级排序队列优化了许多,但调度时间还是不确定,如最高优先级任务睡眠时还要搜索队列来获取最高优先级任务。
优先级位图很好地解决了调度时间不确定性问题。它用全局变量OSRdyGrp(就绪组)和OSRdyTbl[](就绪表)来存储当前系统中任务优先级信息,某一优先级任务就绪时设置相应就绪表中的某一位,某一所有优先级任务都阻塞时对相应就绪表的位清零。由于位图可准确地置位和清零,这就保征了任务调度时间的确定性。这里的准确是指时间确定且有效,无论有多少任务,置位和清零的步骤是一定的,代码执行时间确定并且快速。
下图显示了优先级调度时获取最高优先级的过程。
图1位图法获取最高优先级
(高效、准确)
时间片轮询调度采用双向链表可达到较好的效果。如下图所示,因为调度时只是对OSTCBPrioTbl[]中某一指针元素赋值,时间确定性达到最大程度保证。
下图显示了时间片调度——双向链表的处理过程。
图2同优先级时优先级TCB指针依次指向TCB1、TCB2、TCB3
(FCFS)
由上述分析可知,位图与双向链表操作时间确定,两者相结合能够很好的保证RTOS对实时性的要求。
ATOP设计时采用了ucos的位图思想,但与ucos中位图中一位与一个任务直接相联系不同,ATOP中一位与一个优先级相联系,它引出的是一个优先级链表,即双向链表。ucos采用位图完成了任务的优先级调度。在ATOP中,位图只是任务调度的一部分,ATOP用位图来做优先级的相关工作(位图完成优先级的记录与获取),而直接与任务相关的是时间片部分,即双向循环链表。一个双向循环链表是由同一个优先级的处于就绪态和运行态任务控制块组成。它与时间阻塞链表,信号量阻塞链表(这三个链表相对独立)一起完成整个任务的运行(下面将作介绍)。真因为两者的调度方式实现的不同,在不同的调度方式基础上搭建系统的方法和最终形成的系统就完全不同了。
在此要强调的一点是,ATOP在整个设计过程中巧妙地利用了数组下标这一资源。在任务优先级表OSTCBPrioTbl[]中,数组下标就是优先级,这样我们只要知道了优先级,就能以此为下标访问任务优先级表,进而获知双向链表,也就知道了要运行的那个具体的任务。
3 任务管理
在任务调度策略选定的基础上我们来构建一个实时操作系统,因为位图+双向链表已保证了实时性的要求,接下来就是要填充一般操作系统的功能,这里主要绍任务管理和任务间通信与同步。一个操作系统最基本能功能就是任务管理,任务是系统调度的单位。下图显示了要设计的系统的任务状态转换。
图3状态转换图
ATOP中任务共有五种状态:休眠态,就绪态,运行态,挂起态和中断态。每个时刻CPU只能运行一个任务,所以处于运行态的任务数只能为1或0(中断运行时),可以简单地把它作为就绪态的一部分(实际设计时也是这样做的,并没有为运行态单独设置下一个标识)。中断态时CPU运行的是中断相关内容,这进CPU按照指定流程运行,可从任务中分离出来。这样要考虑的任务管理就是处于休眠态,就绪态和挂起态的任务了。
ATOP设计中采用了任务状态与链表相对应的策略来管理任务,状态变化即对相应链表进行操作,可最大限度消除冗余,操作简单易于理解。就绪链表(RdyList)与就绪态对应,而挂起态又根据挂起的原因不同分成两类,时间阻塞链表(DlyList)与时间阻塞挂起态相对应,信号量阻塞链表(SemList)与信号量阻塞挂起态相对应,其它归为一类没有链表与这相对应。这样避免了ucos中时钟服务要搜索整个任务链表而带来的巨大时间消耗,使任务调度更加实时,调度时间更加精确。
需要指出的一点是,ATOP中链表可选FCFS操作,使链表中插入删除元素时间确定。
4 任务间通信与同步
在多任务操作系统中,一项工作可能需要多个任务或多个中断处理程序共同完成。那么,它们之间必须协调工作、相互配合,必要时还要交换信息。操作系统通过任务间通信与同步机制来解决这个问题。可以这样认为,任务是操作系统的实体,通信与同步提供相关实体(任务)之间的联系,有了这两部分,操作系统才能很好的工作(当然,还需要有中断等其它部分的支持)。
任务间通信与同步的方法很多,如开头中断、禁止任务切换、信号量、邮箱等。这里主要介绍信号量机制的实现,当然开关中断、禁止任务切换等一些相对简单的方法ATOP中也提供。
信号量可分为三类,同步信号量,资源信号量,互斥信号量。资源信号量和互斥信号量都是标识资源是否可用,但互斥信号量只为保护一个资源被互斥地访问,很容易出现优先级逆转现象需要多加考虑而单独列出来。同步信号量与资源信号量有许多共性,ATOP中把两种信号量归为一类,提供服务的简单过程可描述为:有资源或事件发生,申请信号量的任务获得信号量继续运行;没有资源或事件没有发生,就加入等待队列,直到有资源或事件发生时把任务唤醒。
互斥信号量与同步或资源信号量处理流程相似,只是在此基础上设计了优先级逆转保护机制:优先级天花板协议。避免优先级逆转的协议(或方法)有两种:优先级天花板协议和优先级继承协议,只所以采用优先级天花板协议,是因为优先级继承协议有两处不足:
一.优先级继承协议本身不能避免死锁的发生;
二.在优先级继承协议中,任务的阻塞时间虽然是有界的,但由于可能出现阻塞链,使得任务的阻塞时间可能会很长。
同时也要注意,任务在访问互斥体时提升了优先级,访问完之后还要恢复原先的优先级,以原先的优先级继续运行,这是个相当耗时过程。此外,ATOP设计中也对优先级天花板协议作了改进,只有低优先级阻塞了高优先级任务运行时才提升互斥信号量拥有者的优先级至天花板。其流程如下图,其中T0,T1,T2,T3代表申请该信号量的任务。
图4 改进的优先级天花板协议的处理流程
(只有T1阻塞了高优先任务时优先级才提升至天花板)
与优先级继承协议相比,优先级天花板协议有避免死锁,执行效率高优点,改进后的优先级天花板协议,一定程度降低了程序运行时间提高了程序运行效率。
5 结束语
本文只是粗略地介绍了一个实时操作系统的实现方案——ATOP,着重强调了ATOP为了保征实时性所采取的策略,位图+双向链表可保证任务调度的强实时性,状态与链表相对应操作简单节省时间,改进的天花板协议在节省时间的同时,避免了死锁和优先级反转。嵌入式实时操作系统最重要的就是强实时性,任务运行时间精确可预知,通过上述方案的实现过程可知,ATOP很好地解决了这个问题。
参考文献:
【1】夏靖波 王航 陈雅蓉 编著. 嵌入式系统原理与开发. 西安:西安电子科技大学出版社,2007.7
【2】任哲 潘树林 房红征 编著. 嵌入式操作系统基础uc/os-II和Linux. 北京:北京航空航天大学出版社,2006.8
【3】邵贝贝译,uC/OS-II 源码公开的实时嵌入式操作系统,中国电力出版社