UCOS-II代码OSStart()函数分析

void  OSStart (void) {     
    INT8U y;     
    INT8U x;     
    if (OSRunning == FALSE) {         
        y = OSUnMapTbl[OSRdyGrp];           
        x = OSUnMapTbl[OSRdyTbl[y]];       
        OSPrioHighRdy = (INT8U)((y << 3) + x);  
        OSPrioCur= OSPrioHighRdy; 
        OSTCBHighRdy= OSTCBPrioTbl[OSPrioHighRdy]; 
        OSTCBCur= OSTCBHighRdy;     
        OSStartHighRdy(); 
    } 
}

INT8U y; INT8U x;

8位无符号整数x,y

 if (OSRunning == FALSE)

参数检验,多任务尚未启动

 y = OSUnMapTbl[OSRdyGrp];  //求最高优先级所在行

 x = OSUnMapTbl[OSRdyTbl[y]];  //求最高优先级所在列

 OSPrioHighRdy = (INT8U)((y << 3) + x); //还原为优先级/* Find highest priority's task priority number   */

通过UCOS查表方式求最高优先级代码

OSPrioCur= OSPrioHighRdy;

第一次开始多任务调度,最高优先级任务运行,即当前优先级和最高优先级一样

OSTCBHighRdy= OSTCBPrioTbl[OSPrioHighRdy];/* Point to highest priority task ready to run    */

通过最高优先级,查找优先级TCB表,获得最高优先级的TCB

通过上面两行代码将当前最高优先级的任务的优先级存放在OSPrioHighRdy变量中。然后通过此变量从存放任务控制块指针的数组OSTCBPrioTbl[]中获得该任务的任务控制块指针,并存放在指针变量OSTCBHighRdy中。

OSTCBCur= OSTCBHighRdy;

第一次启动,即待运行任务控制块和正在运行的运行任务控制块一样

 OSStartHighRdy();/* Execute target specific code to start task     */

调用启动函数,实质上是将任务栈中保存的值弹回到CPU寄存器中,然后执行中断返回自指令,中断返回指令强制执行任务代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值