第四篇:只有延时服务的协作式的内核——OSSched
//进行任务调度
void OSSched(void)
{
// 根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况
PUSH_ALL;
TCB[OSTaskRunningPrio].OSTaskStackTop=SP; //将正在运行的任务的堆栈底保存
unsigned char OSNextTaskID; //在现有堆栈上开设新的空间
for (OSNextTaskID = 0; //进行任务调度
OSNextTaskID < OS_TASKS && !(OSRdyTbl & (0x01<<OSNextTaskID));
OSNextTaskID++);
OSTaskRunningPrio = OSNextTaskID ;
cli(); //保护堆栈转换
SP=TCB[OSTaskRunningPrio].OSTaskStackTop;
sei();
//根据中断时的出栈次序
POP_ALL;
//中断时出栈完成
}
任务切换的核心操作:
入栈——>保存SP——>查找最高任务——>装载SP——>出栈——>中断返回