五、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寄存器中,然后执行中断返回自指令,中断返回指令强制执行任务代码
本文来自博客园,作者:种星记,转载请注明原文链接:https://www.cnblogs.com/zhongxingji/p/17697228.html