天天看点

μC/OS-II微小内核分析

μC/OS-II 嵌入式实时操作系统的源代码可以分成三部分:与硬件无关的内核代码、与处理器有关的移植代码和用户配置文件。

μC/OS-II微小内核分析

  内核代码位于source目录下,提供了4个微小内核。它们分别位于source\SOURCE1(包含建立任务和延时功能)、source \SOURCE2(增加删除任务功能)、source\SOURCE3(增加信号量文件)和source\SOURCE4(增加删除信号量功能)。它们的 功能依次增强,代码也依次增大。

μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析
μC/OS-II微小内核分析

  μC/OS-Ⅱ是通过任务控制块来管理任务的。任务控制块是一个基于链表的数据结构,任务控制块主要用于记录任务的堆栈栈顶指针、指向下一个任务控制块的指针、任务等待的延迟时间、任务的当前状态标志与任务的优先级别等一些与任务管理有关的属性。

     当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用任务控制块来保存该任务的状态,从而保证任务重新获得CPU使用权时从断点处执行。

     μC/OS-II必须通过函数OSInit()初始化后才可以使用,该仅调用OS_InitMisc()、OS_InitRdyList()、OS_InitTCBList()和OS_InitTaskIdle() 4个函数。

μC/OS-II微小内核分析

OSTaskCreate()调用了OSTaskStkInit()任务堆栈初始化函数和OS_TCBInit()函数获得并初始化一个OS_TCB。

μC/OS-II微小内核分析

任务调度小结:

μC/OS-II微小内核分析

可重入的代码指的是一段代码可以被多个任务同时调用,而不必担心数据被破坏。即就是说,可重入型函数在任何时候都可以被打断,一段时间以后又可以继续运行,而相应数据却不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器或堆栈中。如果使用全局变量,则要对全局变量予以保护。由此可见,代码的可重入性是保证完成多任务的基础。

   μC/OS-Ⅱ为了处理临界区代码需要禁止中断,处理完毕后再允许中断,这使得μC/OS-Ⅱ能够避免同时有其它任务或中断服务进入临界段代码,两个宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来禁止中断和允许中断。

   µC/OS-II将信号量、互斥信号量、消息邮箱、消息队列等统称为“事件”,然后通过一个称为“事件控制块(ECB)”的数据结构来管理事件,也就是说,任务和中断服务程序可以通过ECB向另外的任务程发送信号,任务也可以等待另一个任务或者中断服务程序给它发送信号。

   在使用事件控制块之前,需要将所有事件控制块链接成一个空闲事件控制块链表。每当建立一个信号量、互斥信号量、消息邮箱、消息队列时,就从该链表中取出一 个空闲事件控制块,并对它进行初始化。当信号量、互斥信号量、消息邮箱、消息队列被删除时,对应的事件控制块也需要放回到空闲事件控制块链表中。

  μC/OS-II支持对信号量的3种操作:创建信号量OSSemCreate()、发送信号量OSSemPost()和等待信号量OSSemPend()。