在State machine program design in FreeRTOS - vTaskStartScheduler in a switch statement的讨论之后,我有一个状态机,有4个状态,每个状态都有不同的任务读取传感器数据。
当传感器数据达到阈值时,其任务必须导致状态改变。
我们的想法是通过switch语句控制状态(并暂停/恢复相应的任务)。我的问题是:传感器任务应该如何将STATE与上级任务进行通信?
一个建议的解决方案是拥有一个由事件生成任务调用的set_state函数,但我读到不建议在FreeRTOS中使用全局变量。我想通过队列实现它:
1- Task1检测传感器阈值,并将STATE发送到队列。
2-高级任务被阻止等待从队列接收数据。当它收到STATE时,switch语句处理状态改变。
如果这种方法是正确的,我的疑问与STATE定义的方式和位置有关(全局,或者只是存在于每个任务的堆栈中,或者是高级任务......)
答案 0 :(得分:1)
STATE
应该只在需要的地方存在,'在'优越的任务。我假设您正在使用C,因此在" superior_task.c"中声明STATE
为static
变量。 (或者不管它叫什么)。这意味着它只能在该文件中受到影响 - C等效于C ++中的私有成员变量。
然后,如果您的劣质任务需要影响状态更改,他们会将状态更改事件发布到由上级任务管理的队列中。处理队列时,上级状态会更改为私有STATE
变量。
如果其他任务需要知道状态对于他们自己的处理是什么,他们可以使用私有变量的访问器,例如State get_state() { return STATE; }
。正如马丁所说,其他任务不应该知道状态,否则任务之间不存在相互依存关系。