#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) 添加到等待列表中。

代码解析:

  1. 条件判断: 代码首先判断操作系统是否支持多个事件等待 (OS_EVENT_MULTI_EN > 0u) 以及任务是否拥有事件等待列表 (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0)。

  2. 遍历事件等待列表: 代码使用循环遍历任务的事件等待列表,逐个更新每个等待事件的优先级信息。

  3. 删除旧任务优先级: 代码使用位运算 (&=) 将旧任务优先级 (bitx_old) 从等待列表 (OSEventTbl) 中移除。如果旧任务是该事件等待列表中最后一个等待任务,则也需要从事件等待组 (OSEventGrp) 中移除该任务的优先级信息 (bity_old)。

  4. 添加新任务优先级: 代码使用位运算 (|=) 将新任务优先级 (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)

代码分析:

代码使用了位运算来高效地更新事件等待列表。使用位运算可以避免遍历整个等待列表,提高代码执行效率。

注意事项:

  • 该代码假设操作系统支持多个事件等待,如果操作系统不支持多个事件等待,则代码将不起作用。
  • 为了确保代码正常工作,必须确保任务的优先级信息正确设置,并且任务的事件等待列表正确维护。
μC/OS-II 任务优先级变更事件等待列表更新代码解析

原文地址: https://www.cveoy.top/t/topic/mLLL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录