能否从两个线程调用CMSIS-RTOS2 osEventFlagsWait?多线程场景支持确认
CMSIS-RTOS2 osEventFlagsWait多线程共享事件对象场景的合规性确认
问题背景
CMSIS-RTOS2的osEventFlagsWait函数文档未明确提及禁止多线程共享同一事件对象并等待不同标志位的限制,需确认该函数实现是否必须支持以下场景,且线程间标志位等待无干扰:
场景代码
osEventFlagsId_t eventId = osEventFlagsNew(NULL); void threadA(void) { for (;;) { ... uint32_t flags = osEventFlagsWait(eventId, 0x001u, osFlagsWaitAny, osWaitForever); ... } } void threadB(void) { for (;;) { ... uint32_t flags = osEventFlagsWait(eventId, 0x100u, osFlagsWaitAny, osWaitForever); ... } } void threadC(void) { for (;;) { ... uint32_t flags = osEventFlagsSet(eventId, 0x001u); ... flags = osEventFlagsSet(eventId, 0x100u); ... flags = osEventFlagsSet(eventId, 0x101u); } }
规范与实现要求
CMSIS-RTOS2核心规范定义
事件标志对象是设计为多线程安全的同步原语,明确支持多个线程同时等待同一事件对象的不同标志组合。内核会独立处理每个线程的等待条件:- 当
osEventFlagsSet设置标志位时,会遍历所有等待该事件的线程,逐一检查其等待条件是否满足; - 满足条件的线程会被唤醒,默认情况下会自动清除自身等待的标志位(若未指定
osFlagsNoClear选项),该清除操作仅对当前线程的等待逻辑生效,不会影响其他线程的等待标志。
- 当
测试用例佐证
ARM官方提供的CMSIS-RTOS2验证套件中,包含专门的多线程共享事件对象测试场景,验证不同线程等待不同标志位时的独立性:- 测试设置单个标志位时,仅对应等待线程被唤醒;
- 测试设置多个标志位时,所有满足条件的线程同时被唤醒,且各自的标志位处理无干扰。
结论
该场景是CMSIS-RTOS2规范要求必须支持的,threadA与threadB的标志位等待操作完全独立,彼此不会产生干扰。
内容的提问来源于stack exchange,提问作者Mekugi
相关产品推荐
相关产品推荐

