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()
Ø 当OSSTART执行完后OSRunning为真,多任务已经启动

本文详细分析了UC/OS操作系统启动多任务的关键函数OSStart()及其内部调用的OSStartHighRdy()。在启动过程中,通过优先级算法找到最高优先级任务,并设置相应的堆栈指针,利用软中断进行任务切换。OSStartHighRdy()通过软中断进入系统模式,执行任务上下文切换,确保多任务系统的正常运行。
最低0.47元/天 解锁文章
1567

被折叠的 条评论
为什么被折叠?



