您的位置:首页 > 其它

《建立一个属于自己的AVR的RTOS》笔记——OSSched

2013-12-12 11:03 381 查看
第四篇:只有延时服务的协作式的内核——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——>出栈——>中断返回
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: