曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6756|回复: 0
打印 上一主题 下一主题

任务调度OS_Sched()

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 00:06:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务调度有两种:任务级调度 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() 宏调用,完成实际上的任务切换。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-6-2 12:30 , Processed in 0.059328 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表