embedded - 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 等待它停止工作但没有进入任何故障处理程序
解决方案
我宁愿使用标准的 freeRTOS API。ARM CMSIS 包装器是垃圾。
顺便说一句,我相当怀疑osMailGet(commandMailHandle, osWaitForever);
在这种情况下,根本不需要延迟。如果等待数据处于 BLOCKED 状态,则任务不会消耗任何处理能力
如果另一个猜测是:
- 你降落在高频
- 你被堆叠在上下文切换中(错误的中断优先级)
使用您的调试器,看看发生了什么。
推荐阅读
- javascript - 如何通过单击此框显示仅活动框的图标
- ios - 错误:在搜索路径中找不到包含的文件“Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig”(在目标“Runner”中)
- c - 是否可以从静态库中删除死代码?
- c# - 如何按大小对从 GetFiles/GetDirectories 检索到的文件/文件夹进行排序
- rspec - 如何根据标签区分测试用例?
- sap-cloud-sdk - 如何在 SAP Cloud SDK 中为自己的 OData 服务执行集成测试
- ajax - Ajax 图像上传给我 405 错误(不允许方法)并且来源已被 CORS 策略阻止
- html - 悬停时的 CSS 过渡类宽度
- typescript - TYPEORM 设置 fk 为 1:m / m:1
- vue.js - VueJS 和 NuxtJS 中是否有类似 React Fragment 的东西?