嵌入式学习小组
直播中

苗雨

7年用户 255经验值
私信 关注

请问这个if语句有存在的必要吗?

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语句有存在的必要性。
我是看了几遍任哲的那本书之后的疑问。显然是我哪里理解错了,请指正。谢谢。

回帖(6)

胡谦倩

2019-6-26 06:17:35
你说错了,这句话一定要存在!!即判断如果当前的任务是最高优先级任务的话就不需要切换,有其他的任务调度点(可以引发任务调度的函数)是直接发起任务调度的,这个时候就要做判断的。
举报

余少华

2019-6-26 06:30:46
这确实值得想一想,有那么几个情况下需要判定。
我举其中1个例子,给楼主参考:TaskA创建比自己优先级低的TaskB。
举报

李玉林

2019-6-26 06:48:24
能展开说下吗?意思点到就行。
举报

高原

2019-6-26 06:55:58
仔细看了看任哲的书。对于提问的认知有些写调整。
1.uC/OS-II里的任务优先级是唯一的,即:不能存在优先级相等的任务
2.运行中的任务根本就不在就绪列表中。
对于1,这是正确的。uC/OS-II不支持时间片轮番调度法。应用程序中的个任务的优先级必须互不相等。
对于2,则是错误的。正在运行的任务可以是就绪状态也可以不是就绪状态。即运行状态的任务可能在就绪列表有标记,也可能没有。
观察任哲书对OSTimeDly()函数的注释可以得到启示。
注释中有这么一句话“取消当前任务的就绪状态”,可以揣摩出:正在运行的任务“可以是/也可以不是”就绪表中标记的任务。

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

PS:在不断的学习过程中,也越发的觉得正在运行的任务可能就在就绪列表中有标记。当认定“正在运行的任务“可以是/也可以不是”就绪表中标记的任务”是正确的后,思考各种情况下的任务调度也是合理的。
目前,认知就到这里。不知道理解的对不对。希望大牛指正。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分