嵌入式系统/超级循环架构
在为嵌入式系统编程时,重要的是满足系统的时限,并在合理的时间内完成系统的所有任务,同时也要以良好的顺序执行。本页将讨论一种常见的程序架构,称为超级循环架构,它在满足这些要求方面非常有用。
超级循环是一种程序结构,它包含一个无限循环,系统的所有任务都在该循环中执行。以下是超级循环实现的一般伪代码。
Function Main_Function() { Initialization(); Do_Forever { Check_Status(); Do_Calculations(); Output_Response(); } }
我们在进入超级循环之前执行初始化例程,因为我们只想初始化系统一次。一旦无限循环开始,我们就不想重置值,因为我们需要在嵌入式系统中维护持久状态。
循环实际上是经典“批处理”控制流的一种变体:读取输入,计算一些值,写入值。一直执行,直到没有更多输入数据“卡”。因此,嵌入式系统软件并不是唯一使用这种架构的软件类型。例如,电脑游戏经常使用类似的循环。在那里,循环被称为(紧密)(主)游戏循环。
假设我们有一个嵌入式系统,它的平均循环时间为1毫秒,并且只需要每秒检查一次特定输入。继续循环程序似乎是一种浪费,尤其是在大多数情况下我们不需要做任何事情的时候。在这种情况下,程序将在读取输入之前循环1000次,程序的其他999次循环仅仅是到下一次读取的倒计时。在这种情况下,让处理器一直以100%的容量运行效率极低。现在,我们将实现一个扩展的超级循环来构建一个延迟。
Function Main_Function() { Initialization(); Do_Forever { Check_Status(); Do_Calculations(); Output_Response(); Delay_For_Next_Loop(); } }
请注意,我们如何在超级循环末尾添加了一个延迟?如果我们将此延迟设置为延迟999毫秒,我们不需要循环1000次,我们可以在每次循环时读取输入。
此外,重要的是要注意,许多微控制器都有节能模式,在这种模式下,它们将需要更少的电力,如果系统是通过电池供电的,这将尤其有用。
假设我们有一个微控制器,它在“正常模式”下使用20毫瓦的功率,但在“低功耗模式”下只需要5毫瓦的功率。假设我们正在使用上面的示例超级循环,它在99.9%的时间(每秒1毫秒的计算)处于“低功耗模式”,并且仅在0.1%的时间处于正常模式。
请注意,我们可以通过添加大量的延迟来降低功耗?这尤其重要,因为很少有嵌入式应用程序需要100%的处理器资源。大多数嵌入式系统能够在低功耗状态下等待,直到需要时才运行。