搜索
bottom↓
回复: 4

ucos-II学习笔记 -任务控制块

[复制链接]

出0入0汤圆

发表于 2013-10-25 14:40:27 | 显示全部楼层 |阅读模式
本帖最后由 jzhang123 于 2013-10-25 16:15 编辑

任务控制块链表:
    在μC/OS-II中存在两条管理任务的链表,一条是空任务块链表,另一条是任务块链表. 分别由OSTCBFreeList,
OSTCBList两个指针指向头节点.
    空任务块链表是在系统初始化时创建的,链表中节点的个数为OS_MAX_TASKS + OS_N_SYS_TASKS,其中
OS_N_SYS_TASKS为系统任务数.建立任务时会从空任务块链表中截取一个任务块,填充任务属性后再将其加
入控制块链表.为了加快对任务控制块的访问速度,除了任务控制块链表被创建为双向之外,系统中还定义有一个
类型为OS_TCB*的数组OSTCBTbl[]按优先级存放任务块地址,使系统在访问一个任务的任务控制块时不必遍历
任务控制块链表.另外系统中还定义有一个OS_TCB*类型的变量OSTCBCur指向当前正在运行的任务块.

任务的建立:
当应用程序调用OSTaskCreate()或OSTaskCreateExt()创建任务时, OSTCBFreeList所指的任务控制块将被分配
给该任务(任务初始化过程见下文),此节点会从OSTCBFreeList所指链表中剔除,加入OSTCBList所指链表,并根据
任务的优先级别将此任务块的地址放入OSTCBTbl[]相应位置.如果该任务被立即执行, OSTCBCur会指向该任务
控制块,至此一个任务创建完成.

任务删除:
    而程序调用OSTaskDel()删除一个任务时,其实际操作就是创建的反向操作.将该任务控制块的任务属性置空,
从OSTCBTbl[],OSTCBList中剔除该任务控制块,在OSTCBFreeList加入该任务控制块.

任务控制块的相关数据:
OSTCB *OSTCBCur;           //指向当前运行任务的控制块指针
OSTCB *OSTCBFreeList;     //“空任务控制块”链表的表头指针,TCB链表中空闲的任务控制TCB的第一个。
OSTCB *OSTCBHighRdy;    //指向最高优先级就绪任务控制块的指针
OSTCB *OSTCBList;          //指向任务控制块列表首地址,“已使用任务控制块”链表的表头指针;
OSTCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];   //定义任务控制块优先级表
OSTCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];         //任务控制块列表


(图片转自新浪博客)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-10-25 16:03:17 | 显示全部楼层
教学资料,一律帮顶。

出0入0汤圆

 楼主| 发表于 2013-10-25 16:20:35 | 显示全部楼层
把这个总结出来,算是搞明白了任务控制块是怎么回事了!

出0入0汤圆

 楼主| 发表于 2013-10-25 16:21:54 | 显示全部楼层
最好是看着任务建立代码,里面有TCB模块的初始化,结合这个文字说明和图片,就很清晰明了的明白了这个恶过程。

出0入0汤圆

 楼主| 发表于 2013-11-29 14:12:00 | 显示全部楼层
typedef struct os_tcb {
    OS_STK          *OSTCBStkPtr;           /* Pointer to current top of stack                         */

#if OS_TASK_CREATE_EXT_EN > 0
    void            *OSTCBExtPtr;           /* Pointer to user definable data for TCB extension        */
    OS_STK          *OSTCBStkBottom;        /* Pointer to bottom of stack                              */
    INT32U           OSTCBStkSize;          /* Size of task stack (in number of stack elements)        */
    INT16U           OSTCBOpt;              /* Task options as passed by OSTaskCreateExt()             */
    INT16U           OSTCBId;               /* Task ID (0..65535)                                      */
#endif

    struct os_tcb   *OSTCBNext;             /* Pointer to next     TCB in the TCB list                 */
    struct os_tcb   *OSTCBPrev;             /* Pointer to previous TCB in the TCB list                 */

#if (OS_EVENT_EN) || (OS_FLAG_EN > 0)   //定义指向事件控制块的指针
    OS_EVENT        *OSTCBEventPtr;         /* Pointer to          event control block                 */
#endif

#if (OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0)  //
    OS_EVENT       **OSTCBEventMultiPtr;    /* Pointer to multiple event control blocks                */
#endif

#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)  //任务的消息指针
    void            *OSTCBMsg;              /* Message received from OSMboxPost() or OSQPost()         */
#endif

#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0  //定义事件标志节点的指针
    OS_FLAG_NODE    *OSTCBFlagNode;         /* Pointer to event flag node                              */
#endif
    OS_FLAGS         OSTCBFlagsRdy;         /* Event flags that made task ready to run                 */
#endif

    INT16U           OSTCBDly;              /* Nbr ticks to delay task or, timeout waiting for event   */
    INT8U            OSTCBStat;             /* Task      status                                        */
    INT8U            OSTCBStatPend;         /* Task PEND status                                        */
    INT8U            OSTCBPrio;             /* Task priority (0 == highest)                            */

    INT8U            OSTCBX;                /* Bit position in group  corresponding to task priority   */
    INT8U            OSTCBY;                /* Index into ready table corresponding to task priority   */
#if OS_LOWEST_PRIO <= 63
    INT8U            OSTCBBitX;             /* Bit mask to access bit position in ready table          */
    INT8U            OSTCBBitY;             /* Bit mask to access bit position in ready group          */
#else
    INT16U           OSTCBBitX;             /* Bit mask to access bit position in ready table          */
    INT16U           OSTCBBitY;             /* Bit mask to access bit position in ready group          */
#endif

#if OS_TASK_DEL_EN > 0
    INT8U            OSTCBDelReq;           /* Indicates whether a task needs to delete itself         */
#endif

#if OS_TASK_PROFILE_EN > 0
    INT32U           OSTCBCtxSwCtr;         /* Number of time the task was switched in                 */
    INT32U           OSTCBCyclesTot;        /* Total number of clock cycles the task has been running  */
    INT32U           OSTCBCyclesStart;      /* Snapshot of cycle counter at start of task resumption   */
    OS_STK          *OSTCBStkBase;          /* Pointer to the beginning of the task stack              */
    INT32U           OSTCBStkUsed;          /* Number of bytes used from the stack                     */
#endif

#if OS_TASK_NAME_SIZE > 1
    INT8U            OSTCBTaskName[OS_TASK_NAME_SIZE];
#endif
} OS_TCB;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 01:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表