其实任务切换很好理解,打个比方来说吧:
假如我有两套房子(是假如噢,目前我还没那有钱,就算有,也会卖掉用来做别的用途,呵呵,), 去B房前我是不是得把A房的门锁上啊,免得我不在的时候被贼娃子进去乱翻,虽说不一定被偷点啥,总要被弄乱或弄坏吧,说不定什么东西我就找不到了,在系统OS里,这个贼娃子就是其他的任务或中断,如果AA任务的场景没被锁住,就被别的任务搞坏了,那系统岂不乱了,还谈什么稳定性,全成了屁话,所以在做任务切换时我们一定要要求各个任务有自己房间(堆栈),有自己的锁(堆栈栈顶)。
void OSTaskSW (void) REENTRANT
{
EnterCritical();
if (gOs.taskNum<2) // 只有一套房子,没得选择,
// 继续回去呆家里吧,
{
return;
}
#pragma asm
PUSHALL //把东西收拾下,锁门。
#pragma endasm
OsTaskSwitch(); // 到另一套房子去,并准备好钥匙
#pragma asm
POPALL // 开门了,开始把放到柜子里的烟啊,
//酒啊,全拿出来爽吧,呵呵,
#pragma endasm
ExitCritical();
}
//翻口袋找钥匙啊,可别花太长时间,现如今社会动乱,
//一不小心,就有可能被抢啊,所以路上要小心,且要走得快
void OsTaskSwitch (void) REENTRANT
{
U8 tmp;
U8 tmpsp1;
U8 tmpsp2;
if (gOsShedLock)
{ return;
}
__asm POP DPL
__asm POP DPH
if (1==gOsIntLevel)
{
tmpsp1 = DPL;
tmpsp2 = DPH;
__asm POP DPL
__asm POP DPH
}
tmp = gOs.currTask;
gOs.tcb[tmp].sp = SP;
if (OS_TASK_RUN==gOs.tcb[tmp].state)
{
gOs.tcb[tmp].state = OS_TASK_RDY;
}
for(tmp=0;tmp<OS_TASK_MAX_NUM;tmp++)
{
if (gOs.osPrio&(1<<tmp))
{
if (OS_TASK_RDY==gOs.tcb[tmp].state)
{
//只有房子有美酒,香烟的才去,那些空屋子去了有什么意思,喝西北风啊??
gOs.tcb[tmp].state = OS_TASK_RDY;
gOs.currTask = tmp;
SP = gOs.tcb[tmp].sp;
break;
}
}
}
__asm PUSH DPH
__asm PUSH DPL
if (1==gOsIntLevel)
{
DPH = tmpsp2;
DPL = tmpsp1;
__asm PUSH DPH
__asm PUSH DPL
}
}
文章评论(0条评论)
登录后参与讨论