首页 > 解决方案 > FreeRTOS 卡在 osDelay 中

问题描述

我正在使用 STM32F446 和使用 STM32CubeMX 创建的样板进行一个项目(用于外围设备初始化和中间件,如带有 CMSIS-V1 接口的 FreeRTOS)。我有两个使用邮箱进行通信的线程,但我遇到了一个问题:线程主体之一是

void StartDispatcherTask(void const * argument)
{
    mailCommand *commandData = NULL;
    mailCommandResponse *commandResponse = NULL;
    osEvent event;
    for(;;)
    {       
        event = osMailGet(commandMailHandle, osWaitForever);
        commandData = (mailCommand *)event.value.p;

        // Here is the problem
        osDelay(5000);
    }
}

它会延迟,但永远不会出来。在同一个线程中使用邮箱和延迟是否有问题?我也尝试在它之前带来延迟for(;;)并且它有效。

编辑:我想我可以尝试为问题添加更多细节。第一个线程发送某种类型的邮件,然后等待另一种类型的邮件;我遇到问题的线程接收邮件进入第一种类型并根据它接收到的内容执行一些代码,然后将结果作为第二种类型的邮件发送;有时它必须使用 osDelay 等待它停止工作但没有进入任何故障处理程序

标签: embeddedstm32freertosrtoscmsis

解决方案


我宁愿使用标准的 freeRTOS API。ARM CMSIS 包装器是垃圾。

顺便说一句,我相当怀疑osMailGet(commandMailHandle, osWaitForever);

在这种情况下,根本不需要延迟。如果等待数据处于 BLOCKED 状态,则任务不会消耗任何处理能力

如果另一个猜测是:

  1. 你降落在高频
  2. 你被堆叠在上下文切换中(错误的中断优先级)

使用您的调试器,看看发生了什么。


推荐阅读