完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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个回答
|
|
你说错了,这句话一定要存在!!即判断如果当前的任务是最高优先级任务的话就不需要切换,有其他的任务调度点(可以引发任务调度的函数)是直接发起任务调度的,这个时候就要做判断的。
|
|
|
|
|
|
|
|
能展开说下吗?意思点到就行。
|
|
|
|
仔细看了看任哲的书。对于提问的认知有些写调整。
1.uC/OS-II里的任务优先级是唯一的,即:不能存在优先级相等的任务 2.运行中的任务根本就不在就绪列表中。 对于1,这是正确的。uC/OS-II不支持时间片轮番调度法。应用程序中的个任务的优先级必须互不相等。 对于2,则是错误的。正在运行的任务可以是就绪状态也可以不是就绪状态。即运行状态的任务可能在就绪列表有标记,也可能没有。 观察任哲书对OSTimeDly()函数的注释可以得到启示。 注释中有这么一句话“取消当前任务的就绪状态”,可以揣摩出:正在运行的任务“可以是/也可以不是”就绪表中标记的任务。 例如:在发送事件时(事件的等待队列中含有等待的任务的情况下),系统将执行等待队列中优先级最高的任务,此时当前运行的任务就不是就绪状态。 PS:在不断的学习过程中,也越发的觉得正在运行的任务可能就在就绪列表中有标记。当认定“正在运行的任务“可以是/也可以不是”就绪表中标记的任务”是正确的后,思考各种情况下的任务调度也是合理的。 目前,认知就到这里。不知道理解的对不对。希望大牛指正。 |
|
|
|
在上楼中认为“正在运行的任务“可以是/也可以不是”就绪表中标记的任务”是正确的,但现在认为“正在运行中的任务肯定在就绪列表中有标记”。
在上楼中举的例子中,认为执行事件等待列表里优先级最高的任务时,此任务没有在就绪列表中标记。但现在认为,执行事件等待列表里优先级最高的任务之前应该将此任务在事件的等待列表中清楚并在就绪列表中进行了标记。这样一来,“正在运行中的任务肯定在就绪列表中有标记”了。 对于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(); } |
|
|
|
但是你没有正面回答我的问题。你告知的是“结论”,而不是“为什么”。不过仍感谢。
|
|
|
|
只有小组成员才能发言,加入小组>>
663 浏览 0 评论
1083 浏览 1 评论
2456 浏览 5 评论
2784 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2619 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
642浏览 9评论
639浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
769浏览 6评论
613浏览 5评论
654浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 21:42 , Processed in 1.273960 second(s), Total 90, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号