首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

UC/OS-II内核调度分析 02

UC/OS-II内核调度分析 02

三。任务控制块OS_TCB描述:
   
    UC/OS-II的TCB数据结构简单,内容容易理解,保存最基本的任务信息,同时还支持裁减来减小内存消耗,TCB是事先根据用户配置,静态分配内存的结构数组,通过优先级序号进行添加,查找,删除等功能。减少动态内存分配和释放。因为依靠优先级进行TCB分配,每个任务必须有自己的优先级,不能和其他任务具有相同的优先级。
   
    typedefstructos_tcb
   
    {
   
    OS_STK*OSTCBStkPtr;
   
    #ifOS_TASK_CREATE_EXT_EN
   
    void*OSTCBExtPtr;
   
    OS_STK*OSTCBStkBottom;
   
    INT32UOSTCBStkSize;
   
    INT16UOSTCBOpt;
   
    INT16UOSTCBId;
   
    #endif
   
    structos_tcb*OSTCBNext;
   
    structos_tcb*OSTCBPrev;
   
    #if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_EN
   
    OS_EVENT*OSTCBEventPtr;
   
    #endif
   
    #if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN
   
    void*OSTCBMsg;
   
    #endif
   
    INT16UOSTCBDly;
   
    INT8UOSTCBStat;
   
    INT8UOSTCBPrio;
   
    INT8UOSTCBX;
   
    INT8UOSTCBY;
   
    INT8UOSTCBBitX;
   
    INT8UOSTCBBitY;
   
    #ifOS_TASK_DEL_EN
   
    BOOLEANOSTCBDelReq;
   
    #endif
   
    }OS_TCB;
   
    .OSTCBStkPtr是指向当前任务栈顶的指针。
   
    .*OSTCBExtPtr;:任务扩展模块使用;
   
    .*OSTCBStkBottom;
   
    .OSTCBStkSize;.
   
    .OSTCBOpt;
   
    .OSTCBId;
   
    .OSTCBNext和。OSTCBPrev用于任务控制块OS_TCBs的双重链接,
   
    .OSTCBEventPtr是指向事件控制块的指针
   
    .OSTCBMsg是指向传给任务的消息的指针。
   
    .OSTCBDly当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段时间以等待某事件的发生,
   
    .OSTCBStat是任务的状态字。
   
    .OSTCBPrio是任务优先级。
   
    .OSTCBX,.OSTCBY,.OSTCBBitX和。OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程
   
    OSTCBY=priority》3;
   
    OSTCBBitY=OSMapTbl[priority》3];
   
    OSTCBX=priority&0x07;
   
    OSTCBBitX=OSMapTbl[priority&0x07];
   
    .OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除
   
    四。就绪表(ReadyList):
   
    UC/OS-II采用内存映射的方式来实现READY队列的加入,查找,删除功能,效率非常高。但是也因此只能支持64个任务,每个任务都有自己的优先级,不能和其他任务优先级向同。
   
    每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[].在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。就绪表OSRdyTbl[]数组的大小取决于OS_LOWEST_PRIO(见文件OS_CFG.H)。
   
    为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_LOWEST_PRIO在就绪表中相应字节的相应位置1.OSRdyGrp和OSRdyTbl[]的关系见图3.3,是按以下规则给出的:
   
    当OSRdyTbl中的任何一位是1时,OSRdyGrp的第i位置1.i从0到7.
   
    使任务进入就绪态
   
    OSRdyGrp|=OSMapTbl[prio》3];
   
    OSRdyTbl[prio》3]|=OSMapTbl[prio&0x07];
   
    任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的三位用于确定是在OSRdyTbl[]数组的第几个元素。OSMapTbl[]是在ROM中的(见文件OS_CORE.C)屏蔽字,用于限制OSRdyTbl[]数组的元素下标在0到7之间,如果一个任务被删除了,则用程序清单3.6中的代码做求反处理。
   
    程序清单L3.6从就绪表中删除一个任务
   
    if((OSRdyTbl[prio》3]&=~OSMapTbl[prio&0x07])==0)
   
    OSRdyGrp&=~OSMapTbl[prio》3];
返回列表