μC/OS-II 任务优先级变更事件等待列表更新代码解析
#if (OS_EVENT_MULTI_EN > 0u) if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0) { pevents = ptcb->OSTCBEventMultiPtr; pevent = *pevents; while (pevent != (OS_EVENT )0) { pevent->OSEventTbl[y_old] &= (OS_PRIO)~bitx_old; / Remove old task prio from wait lists / if (pevent->OSEventTbl[y_old] == 0u) { pevent->OSEventGrp &= (OS_PRIO)~bity_old; } pevent->OSEventGrp |= bity_new; / Add new task prio to wait lists */ pevent->OSEventTbl[y_new] |= bitx_new; pevents++; pevent = *pevents; } } #endif
这段代码是用于更新任务的事件等待列表。如果操作系统支持多个事件等待 (OS_EVENT_MULTI_EN > 0u),则遍历任务的事件等待列表 (ptcb->OSTCBEventMultiPtr),将旧任务的优先级 (bitx_old) 从等待列表 (OSEventTbl) 中删除,并将新任务的优先级 (bitx_new) 添加到等待列表中。
代码解析:
-
条件判断: 代码首先判断操作系统是否支持多个事件等待 (OS_EVENT_MULTI_EN > 0u) 以及任务是否拥有事件等待列表 (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0)。
-
遍历事件等待列表: 代码使用循环遍历任务的事件等待列表,逐个更新每个等待事件的优先级信息。
-
删除旧任务优先级: 代码使用位运算 (&=) 将旧任务优先级 (bitx_old) 从等待列表 (OSEventTbl) 中移除。如果旧任务是该事件等待列表中最后一个等待任务,则也需要从事件等待组 (OSEventGrp) 中移除该任务的优先级信息 (bity_old)。
-
添加新任务优先级: 代码使用位运算 (|=) 将新任务优先级 (bitx_new) 添加到等待列表 (OSEventTbl) 中,并更新事件等待组 (OSEventGrp) 中的任务优先级信息 (bity_new)。
功能总结:
这段代码确保了当任务优先级发生变化时,其在事件等待列表中的优先级信息能够得到及时更新。当等待的事件被触发时,操作系统会根据等待列表中的优先级信息正确地唤醒对应的任务。
代码示例:
// 假设有一个任务 A,其优先级为 3,等待一个事件 E
// 任务 A 的优先级被更新为 5
// 更新任务 A 的事件等待列表
// 假设该代码在任务 A 的优先级更新后被调用
// y_old = 3, bitx_old = 1 << 3 (旧任务优先级)
// y_new = 5, bitx_new = 1 << 5 (新任务优先级)
// 代码执行后,事件 E 的等待列表将被更新为:
// OSEventTbl[3] = 0 (移除旧任务优先级 3)
// OSEventTbl[5] = 1 << 5 (添加新任务优先级 5)
代码分析:
代码使用了位运算来高效地更新事件等待列表。使用位运算可以避免遍历整个等待列表,提高代码执行效率。
注意事项:
- 该代码假设操作系统支持多个事件等待,如果操作系统不支持多个事件等待,则代码将不起作用。
- 为了确保代码正常工作,必须确保任务的优先级信息正确设置,并且任务的事件等待列表正确维护。
原文地址: https://www.cveoy.top/t/topic/mLLL 著作权归作者所有。请勿转载和采集!