|
本帖最后由 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周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|