分享

基于多核处理器的RTOS多核扩展分析与研究二

 lycbje 2013-12-31
第3章  uC/OS-II内核分析
    uC/OS-II是由美国Micrium公司出品的一个源码开放、可移植、可固化、可裁减、可抢占的RTOS[22],并且通过了美国航空管理局FAA(Federal Aviation Administration)认证。uC/OS-II仅是一个实现多任务切换的内核,并没有提供I/O管理、文件系统、网络设备等额外服务。正因为其简洁高效,所以本文选择对其进行SMP扩展。uC/OS-II从结构上可以分成系统初始化模块、任务调度模块、互斥同步机制模块、以及中断处理模块,下面本文对这四个模块的运行机制进行分析。

3.1  系统初始化模块
uC/OS-II初始化过程可分成两个部分:
  1. 处理器平台相关的硬件初始化,包括处理器内部寄存器、堆栈寄存器的初始化;
  2. 操作系统内核的初始化,包括系统核心数据结构的初始化、初始任务的创建、启动多任务运行机制,其系统初始化流程如图3-1所示。
基于多核处理器的RTOS多核扩展分析与研究 <wbr>二
3.2  任务调度
3.2.1  调度策略
    设计支持多任务RTOS的关键是设计调度器,uC/OS-II调度器的目标是保证优先级最高的就绪任务处于运行状态。为了达到一目的,需要在uC/OS-II内核的调度点判断就绪队列中优先级最高的任务是否正在运行,如果不在运行,调度器就会让这个优先级最高的任务抢占正在运行任务的CPU。
保证就绪队列中优先级最高的任务始终占据CPU是uC/OS-II内核可抢占的实质,其采用位图查找算法来定位最高优先级的进程,该算法的时间复杂度为O(1),且与系统当前任务总数无关,即与系统负载无关,但是与系统支持的优先级数有关。

3.2.2  调度实施
    uC/OS-II的调度点有两处,一处是任务主动让出CPU;另一处是中断返回。根据调度点的不同,uC/OS-II的调度器分为两类。任务主动让出CPU执行的函数OS_Sched()称为任务级调度器;uC/OS-II在中断返回时执行的函数OSIntExit()称为中断级调度器。
(1)任务级调度器OS_Sched()实现原理
uC/OS-II通过TCB控制块来管理任务,任务级调度器OS_Sched()的主要工作是获取处于就绪态的最高优先级任务的TCB指针和正在运行任务的TCB指针,然后判断是否需要调度任务,如果需要就进行任务切换。任务级调度器执行流程如图3-2所示。
基于多核处理器的RTOS多核扩展分析与研究 <wbr>二
(2)中断级调度器OSIntExit()实现原理
    uC/OS-II在中断返回时会执行中断级调度器OSIntExit()函数来判断是返回被中断的任务,还是执行一个更高优先级的就绪任务,其处理流程如图3-3示。

基于多核处理器的RTOS多核扩展分析与研究 <wbr>二
3.3  互斥同步机制模块
    互斥同步机制模块包含任务间同步通信模块和锁机制模块。

3.5.1  同步通信机制
    实现任务间同步和通信机制需要解决两个问题:一是对全局共享资源的保护,通过中断锁和抢占锁来实现;二是实现任务间的同步与通信,由于存在多个任务作为某个应用的一部分执行,uC/OS-II必须提供这些任务间的通信机制,同时内核也要提供共享资源和临界区的同步机制。为了减少中断延时,中断子程序只处理少量必须要处理的工作,大量的工作放在任务中处理,因此必须实现任务和中断之间进行通信。
uC/OS-II一般不使用全局变量来实现任务间通信,因为全局变量改变了函数的可重入性,如果不对共享全局变量加以保护,那么发生中断或任务调度时全局变量存储的数据就会失去一致性,如果频繁使用中断锁或抢占锁来对其进行保护就会降低系统的实时性和可预测性。因此uC/OS-II推荐使用信号量、邮箱、消息队列来实现任务间通信和同步,这些同步机制是uC/OS-II支持多任务必须提供的系统服务。

3.5.2  锁机制
    抢占锁OSSchedLock()用于任务给调度器上锁来禁止被更高优先级的任务抢占,直到该任务调用OSSchedUnlock()释放抢占锁为止,在该任务使用抢占锁期间并没有关中断,因此中断是可以被响应的。但是需要注意的是,抢占锁的使用必须非常谨慎,因为它们影响到uC/OS-II对任务的正常管理,占用抢占锁期间该任务不得挂起,否则调度器将被锁住而不能调度其它任务到CPU上运行。

3.4  中断管理
    在uC/OS-II中,中断服务子程序用与具体平台相关的汇编指令实现,如果开发者所使用的目标平台编译器支持内联汇编,也可以直接将中断服务子程序放在C语言中实现,uC/OS-II中断处理流程如图3-4所示。
基于多核处理器的RTOS多核扩展分析与研究 <wbr>二
    需要特别指出的是,uC/OS-II的时钟中断是中断处理的一个典型流程,其中中断服务程序OSTimeTick()的执行效率直接影响系统的性能,因为该函数会遍历uC/OS-II内核中的所有任务,将定时时间到的任务放到就绪队列中。由于uC/OS中任务最多只有64个,所有OSTimeTick()的时间复杂度最高不会超过遍历64个任务的时间。从这个角度来看,时钟中断的处理时延是确定的。但是如果对uC/OS-II任务优先级数进行扩展,使其支持相同优先级的话,那么系统中的任务数就有可能非常大,此时时钟中断ISR的负载会很重,进而影响到系统的实时性。所以对uC/OS-II的进一步改进,该函数的优化是不可避免的。

3.5  本章小结
    本章对uC/OS-II内核进行了深入剖析,为了便于在SBC8641D[23]平台对其进行SMP扩展,我们参考文献[24]将uC/OS-II移植到SBC8641D开发板上的一个CPU上运行。

待续。。。。。。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多