【发布时间】:2019-09-22 22:15:45
【问题描述】:
我正在使用 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 等待它停止工作但没有进入任何故障处理程序
【问题讨论】:
-
延迟完成的可能性更大,它进入
osMailGet(),在那里它会永远等待(或至少直到有东西发送消息或它)。 -
是的,我的意思是邮件是正确的,然后它会延迟但永远不会再次到达 osMailGet
-
我的意思是你是如何确定的?您的代码在该循环中没有执行任何外部可观察的操作,因此您必须使用调试器和断点来确定 - 您没有提到。从外部看,除了它分配给
commandData的一小段时间之外,它总是会出现“阻塞”(并且什么都不做)。 -
是的,我实际上是在使用 Keil v5 进行调试;我在
osDelay上设置了一个断点并到达了它,但是如果我让它再次运行,我可以看到它卡在prvCheckTasksWaitingTermination函数中 -
“编辑”中描述的代码听起来不像是同一个代码。您是否已验证问题中显示的代码是否以与“根据收到的内容执行一些代码”的代码相同的方式失败? SYSTICK 正在运行吗? SYSTICK 中断处理程序是否正在执行?关于
prvCheckTasksWaitingTermination的内容应该出现在问题中——它可能是相关的。在实时系统中删除任务应该被认为是“不寻常的”——显示的代码没有显示你可能在哪里或为什么这样做。
标签: embedded stm32 freertos rtos cmsis