OSStart()函数分析
多任务的的启动是通过调用OSStart()实现的,而在启动uc/os之前至少需要建立一个应用任务。
OSStart()函数源码
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) {//参数检验,多任务尚未启动
y = OSUnMapTbl[OSRdyGrp];//这几句通过uc/os设定最高优先级查找算法找出当前最高优先级
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;//第一次开始多任务调度,最高优先级任务运行,即当前优先级和最高优先级一样
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; //通过最高优先级超找优先级TCB表获得最高优先级TCB
OSTCBCur = OSTCBHighRdy;//第一次启动,二者一样
OSStartHighRdy();//调用启动函数,实质上是将任务栈中保存的值弹回到CPU寄存器中,然后执行中断返回自指令,中断返回指令强制执行任务代码
}
}
Ø OSStartHighRdy()永远不返回到OSStart()
Ø