调用的模块OS_TASK_SW()是一个宏,它是在Small RTOS 51从低优先级任务切换到最高优先级任务时被调用的。 void OS-TASK-SW(viod)
{
保存任务环境;
堆栈空间变换;
堆栈指针指向新的任务堆栈;
OSTaskID=OSNestTaskID;
恢复任务的环境;
恢复程序指针;
}
OS_TASK_SW()总是在任务级代码中被调用的。另一个函数OSIntExit()被用来在ISR使得更高优先级任务处于就绪状态时,执行任务切换功能。任务切换只是简单的将处理器寄存器保存到将被挂起的任务的堆栈中,并且将更高优先级的任务从堆栈中恢复出来
(2)中断退出处理函数OSIntExit进行中断后的任务切换的代码:
/*************************************
** 全局变量: OSIntNesting,OSNextTaskID
** 调用模块: OSIntCtxSw
******************************************
void OSIntExit(void)
{
uint8 temp;
OS_ENTER_CRITICAL();
/* 中断嵌套处理 */
#if EN_OS_INT_ENTER > 0
if (OSIntNesting > 0)
{
OSIntNesting--;
}
if (OSIntNesting == 0)
{
#endif
Os_Enter_Sum = 0; /* 因为在中断中,所以关中断计数器为0 */
#if OS_MAX_TASKS < 9
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning;
for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
开 始 |
关 中 断 |
禁止中断 嵌 套? |
中断层数减1 OSIntNesting+++ |
有中断嵌套? |
在就绪任务中找优先级最高的任务
|
任务切换 |
开 中 断 |
结 束 |
Y |
图2.5中断级任务的切换的流程图 |
{
break;
}
temp = temp >> 1;
}
OSIntCtxSw(); /* 进行任务调度 */
#else
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning % 256;
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
goto TaskSw;
}
temp = temp >> 1;
}
temp = OSTaskRuning / 256;
for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
TaskSw:
OSIntCtxSw(); /* 进行任务调度 */
#endif
#if EN_OS_INT_ENTER >0
}
#endif
OS_EXIT_CRITICAL();
}
http://xky19870905.blog.163.com/blog/static/51855417200931724438476/
文章评论(0条评论)
登录后参与讨论