c - 使用事件标志阻塞任务会停止程序
问题描述
我在我的 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。
这种行为的最佳解决方案是什么?我需要任务等待一个标志并且不阻止其他标志运行,例如终端输入读取。
解决方案
问题提供的任务代码一直很忙,轮询 RTOS 事件。这是一种设计反模式,在事件源触发之前让任务阻塞实际上总是更好。零超时调用可能更有意义的唯一例外osEventFlagsWait()
是,如果您必须监视几个不同的事件/数据源,而这些事件/数据源没有通用的 RTOS API 等待(即使这样,这也只是“紧急情况”出口”)。因此,osWaitForver
应使用。
接下来,应该寻找 HardFault 的原因。仅在此任务代码中,我看不出有什么原因 - HardFault 源可能在其他地方。当 HardFault 可能来自的区域时,这可能值得一个新问题(或已经修复)。祝你好运!
推荐阅读
- javascript - 从任何 web 应用程序调用时,Window exe API cors 问题。C++
- python - 如果字段不存在,则更新 MongoDB 文档
- firebase - Flutter Firestorage getDownloadUrl() 返回 NoSuchMethodError
- css - 如何删除元素并用空格代替显示:vuetify中的无
- python - heroku 在 python 中打开应用程序到系统
- c# - Unity C# 变量在 OnCollisionEnter 中不起作用
- visual-studio-code - 如何克服 vs 代码拒绝更改为我选择的字体的问题?
- html - CSS网格的网格模板区域将所有内容移动到右上角
- db2 - db2 - 在不同的表上使用 select 更新批量行
- php - 在 WooCommerce 中将特定选项值显示为选择字段的默认值