使用事件标志阻塞任务会停止程序

Blocking Task with Event Flags halts the program

我在我的 STM32F303VCx 上集成 FreeRTOS cmsis_v2 遇到了某个问题,然后在阻止任务等待另一个任务的操作批准时使用事件标志。

如果任务执行以下代码,所有其他任务将获得最小运行时间(可以理解,因为 OS 不断检查 evt_flg):

for(;;)
{       
    flag = osEventFlagsWait (evt_flg, EventOccured, osFlagsWaitAny, 0);
    if (flag == EventOccured)
    {
      /* Task main route */
      osEventFlagsClear (evt_flg,EventOccured);
    }
 }

但是如果设置timeout为osWaitForver:osEventFlagsWait (evt_flg, EventOccured, osFlagsWaitAny, osWaitForver ),整个程序就会进入HardFault

针对此类行为的最佳解决方案是什么?我需要等待标志的任务,并且不阻止其他任务,例如来自 运行.

的终端输入读取

问题提供的任务代码一直很忙,正在轮询 RTOS 事件。 这是一种设计反模式,在事件源触发之前让任务阻塞实际上总是更好。唯一的例外情况是,如果您必须监视几个不同的 event/data 源,而没有共同的 RTOS API 等待,则调用 osEventFlagsWait() 的超时时间为零可能更有意义(即便如此,这也只是一个 "emergency exit")。因此,应使用osWaitForver

接下来要查找HardFault的原因。单独在这个任务代码中,我没有看到这样做的原因 - HardFault 源可能在其他地方。当 HardFault 可能来自的区域时,这可能值得一个新问题(或已经修复)。祝你好运!