UC/OS-II学习3

学习系统就得看源代码,不然讲再多都是没有用的,内核的主要工作就是实现任务间的调度,但是内核如何调度每个任务呢?

在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 ]置位第六位

在任务调度的时候会在就绪表中选择优先级最高的任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值