使用事件标志阻塞任务会停止程序
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 可能来自的区域时,这可能值得一个新问题(或已经修复)。祝你好运!
我在我的 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 可能来自的区域时,这可能值得一个新问题(或已经修复)。祝你好运!