曲径通幽论坛

标题: 任务调度OS_Sched() [打印本页]

作者: beyes    时间: 2009-4-14 00:06
标题: 任务调度OS_Sched()
任务调度有两种:任务级调度 OSSched()
                            中断级调度 OSIntExt()
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr;
#endif  
    INT8U      y;


    OS_ENTER_CRITICAL();    /*所有代码都属于临界代码,在寻找进入就绪态的优先级最高的任务过

                                                   程中,为防止中断服务程序把一个或几个任务的就绪位置位,中断要

                                                   关掉*/


    if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked    */
        y             = OSUnMapTbl[OSRdyGrp];          /* Get pointer to HPT ready to run              */
        OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
        if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy     */
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;                              /* Increment context switch counter             */
            OS_TASK_SW();                              /* Perform a context switch                     */
        }
    }
    OS_EXIT_CRITICAL();
说明:
OSIntNesting == 0 && OSLockNesting == 0 只有不是在中断服务子程序中且调度是允许时,才可以进行OS_Sched
调度。
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);  找到已经就绪的最高优先级任务的优先级号。

查找已就绪最高优先级号原理见:就绪表
OSPrioHighRdy-->已就绪最高优先级号(整数类型)
OSPrioCur-->当前任务优先级号(整数类型)
OSTCBPrioTbl[]-->数组元素为指向 OS_TCB 类型指针,数组的下标号为 TCB 相应任务的优先级号
OSTCBHighRdy-->指向已就绪的最高优先级任务的 TCB 指针
OSCtxSwCtr 任务切换次数计数器。目的是让用户知道每秒做了多少次任务切换。用户需每秒将 OSCtxSwCtr 的值存入另一个变量,然后将 OSCtxSwCtr 清 0 。
OS_TASK_SW() 宏调用,完成实际上的任务切换。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2