FreeRTOS 中的状态机程序设计 - 管理状态变化的任务
State machine program design in FreeRTOS - Task managing the state changes
根据 的讨论,我有一个具有 4 个状态的状态机,每个状态都有不同的任务读取传感器数据。
当传感器数据达到阈值时,其任务必须引起状态变化。
这个想法是有一个高级任务,它用 switch 语句控制状态(和 suspends/resumes 相应的任务)。我的问题是:传感器任务应该如何与上级任务沟通状态?
一个提议的解决方案是有一个由事件生成任务调用的 set_state 函数,但我读到不鼓励在 FreeRTOS 中使用全局变量。我想通过队列来实现它:
1- Task1 检测传感器阈值,并将 STATE 发送到队列。
2- 高级任务被阻塞等待从队列接收数据。当它收到 STATE 时,switch 语句处理状态更改。
如果这种方法是正确的,我怀疑应该如何以及在何处定义 STATE(全局的,或者只存在于每个任务的堆栈中,或者上级任务...)
STATE
应该只存在于它需要的地方,'in' 上级任务。我假设您使用的是 C,因此将 STATE
声明为 "superior_task.c" 中的 static
变量(或任何名称)。这意味着它只能在该文件内受到影响 - C 相当于 C++ 中的私有成员变量。
然后,如果您的下级任务需要影响状态更改,它们 post 将状态更改事件发送到由上级任务管理的队列。处理队列时,上级状态对私有 STATE
变量进行更改。
如果其他任务需要知道自己处理的状态是什么,它们可以使用私有变量的访问器,例如 State get_state() { return STATE; }
。正如 Martin 所说,其他任务不需要知道状态,否则任务之间存在不应该存在的相互依赖关系。
根据
当传感器数据达到阈值时,其任务必须引起状态变化。
这个想法是有一个高级任务,它用 switch 语句控制状态(和 suspends/resumes 相应的任务)。我的问题是:传感器任务应该如何与上级任务沟通状态?
一个提议的解决方案是有一个由事件生成任务调用的 set_state 函数,但我读到不鼓励在 FreeRTOS 中使用全局变量。我想通过队列来实现它:
1- Task1 检测传感器阈值,并将 STATE 发送到队列。
2- 高级任务被阻塞等待从队列接收数据。当它收到 STATE 时,switch 语句处理状态更改。
如果这种方法是正确的,我怀疑应该如何以及在何处定义 STATE(全局的,或者只存在于每个任务的堆栈中,或者上级任务...)
STATE
应该只存在于它需要的地方,'in' 上级任务。我假设您使用的是 C,因此将 STATE
声明为 "superior_task.c" 中的 static
变量(或任何名称)。这意味着它只能在该文件内受到影响 - C 相当于 C++ 中的私有成员变量。
然后,如果您的下级任务需要影响状态更改,它们 post 将状态更改事件发送到由上级任务管理的队列。处理队列时,上级状态对私有 STATE
变量进行更改。
如果其他任务需要知道自己处理的状态是什么,它们可以使用私有变量的访问器,例如 State get_state() { return STATE; }
。正如 Martin 所说,其他任务不需要知道状态,否则任务之间存在不应该存在的相互依赖关系。