while (OSWaitTick[OSTaskID] != 0) /* 判断超时时间是否到 */
{
OSClearSignal(OSTaskID); /* 任务进入等待状态 */
OSSched(); /* 运行下一个任务 */
}
因为此处的while循环,所以在OSWaitTick[OSTaskID]不被定时器调用OSTimeTick
清零之前,会一直在此处运行下去,接下来看看OSSched()是如何运行的
void OSSched(void)
{
uint8 temp;
OS_ENTER_CRITICAL();
#if EN_OS_INT_ENTER > 0
if (OSIntNesting == 0) /* 是否是中断中调用 */
{
#endif
#if OS_MAX_TASKS < 9
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning;
for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
// 在os_cpu.h 中有如下宏定义 #define OS_TASK_SW() OSCtxSw()
该OSCtxSw()在OS_CPU_A.ASM中定义,用汇编写的,将此处传递的OSNextTaskID作为参数使用
OS_TASK_SW(); /* 进行任务调度 */
#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:
OS_TASK_SW(); /* 进行任务调度 */
#endif
#if EN_OS_INT_ENTER > 0
}
#endif
OS_EXIT_CRITICAL();
}
这个函数都好理解,在没有中断嵌套的情况下,将OSTaskRuning中为1的查找出来,
也就是查找出任务就绪状态的任务ID号并赋给OSNextTaskID,用于在OSCtxSw中使用
看来最本质的东西还不在这里,这里只是查找出来而,而真正操作系统的保存环境
载入新任务的环境的实现方法还得继续追踪了
汇编是俺的弱项,所以这里要查资料一点一点分析了……
得去下载个汇编教程才能继续分析了,今天比较忙,就分析到这里了,呵呵
文章评论(0条评论)
登录后参与讨论