学习系统就得看源代码,不然讲再多都是没有用的,内核的主要工作就是实现任务间的调度,但是内核如何调度每个任务呢? 在UC/OS-II中每个每个任务都会有一个任务控制块,用来记录任务的状态。
应用程序可以有的最多的任务数,是由os_cfg.h中定义的OS_MAX_TASKS来定义的,最多可以设置为64个任务(最新的可以设置265个),不过为了减小开支,可以根据自己的需要减少一些数量,但因为系统本身会占用几个优先级,所以基本是这样的(最高的四个与最低的四个不用,之间的留给用户自己使用) 所有的任务控制块都放在任务控制块列表数字OSTCBTbl[]中,然后通过一个OSTCBNext指针连接成链表
在任务建立时会使用函数OS_TCBInit()初始化任务控制块TCB,OSTaskCreate() 与 OSTaskCreateExt()都会调用此函数。 INT8U OS_TCBInit (INT8U prio, -->任务优先级 赋值给OSTCBX,Y,.. OS_STK *ptos, -->指向栈顶的指针 赋值给OSTCBStkPtr OS_STK *pbos, -->指向栈底指针 赋值给OSTCBStkBottom INT16U id, -->任务ID 赋值给OSTCBId INT32U stk_size, -->堆栈空间 赋值给OSTCBStkSize void *pext, -->指向TCB扩展指针 赋值给OSTCBExtPtr INT16U opt) -->OS_TCB选择像 赋值给OSTCBOpt
任务就绪表没个就绪的任务都会根据其任务优先级放在就绪表中的相应位置,就绪表中的两个变量 OSRdyGrp: 按任务优先级分组,8个任务为一组 OSRdyTbl[]表示OSRdy中的第几位
OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */ OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; 有一个优先级为30的任务就绪,则初始化时候ptcb->OSTCBY= 3 ptcb->OSTCBX = 6 然后
ptcb->OSTCBBitY = 8; ptcb->OSTCBBitX = 64; 在就绪表中 OSRdyGrp也就置位第三位 OSRdyTb1[3]置位第六位 在任务调度的时候会在就绪表中选择优先级最高的任务 |
UC/OS-II学习3
最新推荐文章于 2020-08-12 09:24:01 发布