原创 Small Rtos51学习笔记2

2010-11-24 20:47 2145 5 5 分类: MCU/ 嵌入式

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中使用
看来最本质的东西还不在这里,这里只是查找出来而,而真正操作系统的保存环境
载入新任务的环境的实现方法还得继续追踪了
汇编是俺的弱项,所以这里要查资料一点一点分析了……
得去下载个汇编教程才能继续分析了,今天比较忙,就分析到这里了,呵呵

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条