首页 > 解决方案 > 使用事件标志阻塞任务会停止程序

问题描述

我在我的 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);
    }
 }

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

这种行为的最佳解决方案是什么?我需要任务等待一个标志并且不阻止其他标志运行,例如终端输入读取。

标签: cstm32freertoscmsis

解决方案


问题提供的任务代码一直很忙,轮询 RTOS 事件。这是一种设计反模式,在事件源触发之前让任务阻塞实际上总是更好。零超时调用可能更有意义的唯一例外osEventFlagsWait()是,如果您必须监视几个不同的事件/数据源,而这些事件/数据源没有通用的 RTOS API 等待(即使这样,这也只是“紧急情况”出口”)。因此,osWaitForver应使用。

接下来,应该寻找 HardFault 的原因。仅在此任务代码中,我看不出有什么原因 - HardFault 源可能在其他地方。当 HardFault 可能来自的区域时,这可能值得一个新问题(或已经修复)。祝你好运!


推荐阅读