|
大家好,在这里想分享下我学习OS-III的心得与体会,留下点东西以方便后来人学习,在这里我只作内核结构与思想的阐述,不做源码级的分析,我想如果在看源码之前阅读此文可以帮助你更容易的理解源码的含意!
如果在分析的过程中有什么错误,还请大家指出!
OS-III的任务管理
首先OS-III的任务状态分为下面几种:
Pending
任何阻塞式的服务调用都会使用任务进入Pending状
Running
Ready
Dormant
Interrupted
但这里需要注意实际上在OS-III的代码实现中对任务的状态有着更详细的描述一共有8种状态。
这8种任务的状态可以归纳成4种状态:
Ready 就绪状态的任务,也即准备运行或是正在运行的任务
Delay 调用系统的延时服务而被挂起的任务,比如OSTimeDly,从任务的外在表现形式来看
这种状态即是上面所提到的Pending状态,包括下面所要说的Suspended Pend统属于
Pending状态。可以理解成任务由于调用内核的服务而被阻塞的悬起的一种外在表现形式,虽然从外面看来,OSTimeDly与OSSemPend调用都会使当前的任务处于悬起,但是其本质是不一样,比如任务如果因为OSTimeDly调用被悬起,此时的任务只需要被放入到OSTick的延时列表中,而如果因为OSSemPend调用被悬起,不仅要考虑任务需要被放入到OSTick的延时列表中,还需要放入等待Sem的列表中。
Suspended
Pend
以上的4种状态组合即可得到上面所说的8种状态,比如,这里假设有任务TaskA、TaskB,任务TaskA由于调用OSTimeDly进入Delay状态,任务TaskB此时调用OSTaskSuspend(TaskA),此时TaskA在Delay的基础上进入Delay Suspended状态。如果TaskA在等等一个信号量,任务TaskB此时调用OSTaskSuspend(TaskA),此时TaskA在Pend的基础上进入Pend Suspended状态,如果有超时选项则进入Pend Timeout Suspended状态,从这里可以看出,其它的状态也即是Pend和Suspended的组合,还有Delay和Suspended的组合状态。
在这里说了这么多关于任务状态是因为这对以后理解OS-III的其它服务有着非常好重要的作用。当然目前只需要记住这8种状态,在以后的源码分析中会经常提到!
下面才到今天的主角了os_tcb:
在这个结构体中有很多的成员,这里我就不一个个解释其含意了,你可以通过OS-III的手册来了解,我这里只说五个重要的成员,如下所示:
OS_TCB *NextPtr;
OS_TCB *PrevPtr;
这两个指针是当任务处于就绪态时被插入到OSRdyList中所用到的指针,
OS_TCB *TickNextPtr;
OS_TCB *TickPrevPtr;
这两个指针是当任务处于阻塞态时被插入到OSCfg_TickWheel列表中去,
OS_TICK_SPOKE *TickSpokePtr;
指向被插入的列表, 这里关于OSRdyList就绪列表,比较简单,不做说明,而对于OSCfg_TickWheel列表,简单的说明下,这是个任务被阻塞时的归处,当任务由于内核服务而被挂起时就到这个列表里来了,这个列表的设计个人觉得非常好,它对延时的任务在插入进行排序处理,而在系统时钟节拍的函数里,即每个时钟节拍对这个列表进行一次处理看是否有超时的任务需要进入就绪态。