五、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寄存器中,然后执行中断返回自指令,中断返回指令强制执行任务代码

posted @ 2023-06-08 15:34  种星记  阅读(65)  评论(0编辑  收藏  举报  来源