嵌入式系統/超級迴圈架構
在為嵌入式系統程式設計時,重要的是滿足系統的時限,並在合理的時間內完成系統的所有任務,同時也要以良好的順序執行。本頁將討論一種常見的程式架構,稱為超級迴圈架構,它在滿足這些要求方面非常有用。
超級迴圈是一種程式結構,它包含一個無限迴圈,系統的所有任務都在該迴圈中執行。以下是超級迴圈實現的一般虛擬碼。
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%的處理器資源。大多數嵌入式系統能夠在低功耗狀態下等待,直到需要時才執行。