通过RTOS实现状态机

时间:2018-03-16 09:27:00

标签: c embedded state-machine rtos freertos

我是初学者,我对RTOS中的任务与状态机之间的区别感到有些困惑。让我们举一个我愿意实施的状态机的例子:

enum states{
  READY_STATE
  RUNNING_STATE
  BLOCKED_STATE
  FINISHED_STATE
}STATES;

如果可以使用事件/中断枚举此状态机而不使用任何RTOS,那么使用RTOS和创建任务有什么好处?

1 个答案:

答案 0 :(得分:2)

RTOS用于通过将不相关的任务放在不同的过程中来处理程序的复杂性,以便它们可以看似同时执行。例如,在3个独立的过程中拆分应用程序逻辑,GUI和串行通信可能是有意义的。

这是否提供真正的多处理或多处理仿真,取决于可用的CPU核心数量。传统上,大多数RTOS都是单核上的多处理仿真。

另一方面,状态机是程序设计规范,其可能或可能不具有分解复杂性的目的。所以它不一定与RTOS有关。

然而,你可以设计一个“穷人的RTOS”作为有限状态机的方式,你给每个状态一个特定的时间片,并期望状态在它过去之前完成(或看门狗会咬人)。这可以提供与RTOS相同的实时行为,但是只有一个堆栈而没有“真正的”上下文切换。

挑选裸机或RTOS在很大程度上取决于程序的复杂性。除非最初的程序设计是最先进的(很少是),否则裸机程序在成长到50k-100k LOC之间时往往会变得很痛苦。在这些情况下,从一开始就选择RTOS可能会更明智。

另一方面,如果你认为程序不会那么大,那么裸机就更容易使用了。 RTOS引入了额外的复杂性,而额外的复杂性引入了错误。黄金法则是始终保持软件尽可能简单。