OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4327|回复: 6

void OS_Sched (void) 任务调度器疑问

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
发表于 2015-10-21 15:25:25 | 显示全部楼层 |阅读模式
5金钱
2.88中的是这样的:
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3u                           
    OS_CPU_SR  cpu_sr = 0u;
#endif


    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0u) {                          
        if (OSLockNesting == 0u) {                     
            OS_SchedNew();
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            if (OSPrioHighRdy != OSPrioCur) {         
#if OS_TASK_PROFILE_EN > 0u
                OSTCBHighRdy->OSTCBCtxSwCtr++;         
#endif
                OSCtxSwCtr++;                          
                OS_TASK_SW();                          
            }
        }
    }
    OS_EXIT_CRITICAL();
}

请问 if (OSPrioHighRdy != OSPrioCur) 这个if语句有存在的必要吗?
我是这么想的:
1.uC/OS-II里的任务优先级是唯一的,即:不能存在优先级相等的任务。
2.运行中的任务根本就不在就绪列表中。
基于以上2点,本人认为“当前运行任务的优先级OSPrioCur”绝不会存在与“就绪列表中优先级最高的任务的优先级OSPrioHighRdy”相等的可能。因此我很怀疑 if (OSPrioHighRdy != OSPrioCur) 这个if语句有存在的必要性。

我是看了几遍任哲的那本书之后的疑问。显然是我哪里理解错了,请指正。谢谢。

最佳答案

查看完整内容[请看2#楼]

你说错了,这句话一定要存在!!即判断如果当前的任务是最高优先级任务的话就不需要切换,有其他的任务调度点(可以引发任务调度的函数)是直接发起任务调度的,这个时候就要做判断的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-10-21 15:25:26 | 显示全部楼层
你说错了,这句话一定要存在!!即判断如果当前的任务是最高优先级任务的话就不需要切换,有其他的任务调度点(可以引发任务调度的函数)是直接发起任务调度的,这个时候就要做判断的。
开往春天的手扶拖拉机
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2015-10-21 15:55:30 | 显示全部楼层
这确实值得想一想,有那么几个情况下需要判定。
我举其中1个例子,给楼主参考:TaskA创建比自己优先级低的TaskB。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2015-10-21 16:28:01 | 显示全部楼层
回复【2楼】emWin:
---------------------------------
能展开说下吗?意思点到就行。
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2015-10-22 13:20:07 | 显示全部楼层
仔细看了看任哲的书。对于提问的认知有些写调整。
1.uC/OS-II里的任务优先级是唯一的,即:不能存在优先级相等的任务
2.运行中的任务根本就不在就绪列表中。

对于1,这是正确的。uC/OS-II不支持时间片轮番调度法。应用程序中的个任务的优先级必须互不相等。
对于2,则是错误的。正在运行的任务可以是就绪状态也可以不是就绪状态。即运行状态的任务可能在就绪列表有标记,也可能没有。

观察任哲书对OSTimeDly()函数的注释可以得到启示。
注释中有这么一句话
“取消当前任务的就绪状态”,可以揣摩出:正在运行的任务“可以是/也可以不是”就绪表中标记的任务。


例如:在发送事件时(事件的等待队列中含有等待的任务的情况下),系统将执行等待队列中优先级最高的任务,此时当前运行的任务就不是就绪状态。



PS:在不断的学习过程中,也越发的觉得正在运行的任务可能就在就绪列表中有标记。当认定“正在运行的任务“可以是/也可以不是”就绪表中标记的任务”是正确的后,思考各种情况下的任务调度也是合理的。



目前,认知就到这里。不知道理解的对不对。希望大牛指正。
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2015-10-22 13:22:22 | 显示全部楼层
在上楼中认为“正在运行的任务“可以是/也可以不是”就绪表中标记的任务”是正确的,但现在认为“正在运行中的任务肯定在就绪列表中有标记”。
在上楼中举的例子中,认为执行事件等待列表里优先级最高的任务时,此任务没有在就绪列表中标记。但现在认为,执行事件等待列表里优先级最高的任务之前应该将此任务在事件的等待列表中清楚并在就绪列表中进行了标记。这样一来,正在运行中的任务肯定在就绪列表中有标记”了。
对于2.86和2.88版本的关于任务级调度器void  OS_Sched (void)中OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; 位置的变动就好理解了。
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3u                           
    OS_CPU_SR  cpu_sr = 0u;
#endif


    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0u) {                          
        if (OSLockNesting == 0u) {                     
            OS_SchedNew();
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];    //2.88版本

            if (OSPrioHighRdy != OSPrioCur) {         
#if OS_TASK_PROFILE_EN > 0u
                OSTCBHighRdy->OSTCBCtxSwCtr++;         
#endif
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; //2.86版本
                OSCtxSwCtr++;                          
                OS_TASK_SW();                          
            }
        }
    }
    OS_EXIT_CRITICAL();
}
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2015-10-22 13:23:43 | 显示全部楼层
回复【4楼】zuozhongkai:
---------------------------------
但是你没有正面回答我的问题。你告知的是“结论”,而不是“为什么”。不过仍感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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