嵌入式程式設計 while(1)的妙用!
阿新 • • 發佈:2019-02-13
在嵌入式程式設計程式碼中,我們往往能看到許多地方有while(1)的身影。最初接觸嵌入式程式設計時,對這個常見的符號有些不解,後來慢慢熟悉後發現,while(1)原來有著這麼多有用的小技巧。
1 迴圈主函式
我們都知道while(1)是一個死迴圈,很多微控制器程式裸跑的時候的結構基本上為
main()
{
init_something();
while(1)
{
do_something();
}
}
Interrupt()
{
doing_something();
}
這樣的結構使得程式在主迴圈中執行,有中斷來時去執行中斷。其效果和for(;;)類似。
2 除錯程式碼
有時我們為了檢測某一段程式碼是否有bug,就在這段程式碼後面加上while(1),程式執行完之後,便停在了這個位置,防止後面的程式對之前的程式執行結果產生影響。當然,打斷點也是可以的。
3 程式復位
微控制器的執行機制是由看門狗防止程式跑飛。
當微控制器在規定時間內沒有喂狗,這程式啟動復位機制,強制微控制器復位執行。
因此,在需要微控制器執行復位操作的地方,可以新增while(1)來實現。
筆者測試過某些微控制器,發現有些微控制器存在看門狗中斷,也就是在看門狗計數器快達到臨界值時進入看門狗中斷,在中斷中喂狗。防止程式沒有喂狗造成的跑飛。
如果存在這種情況,while(1)的復位效果就不那麼理想了。這時我們可以編寫一個簡單的程式執行控制權轉移函式,俗稱跳轉函式實現復位。
大致結構為:
static void vControlSwitch(unsigned int sp,unsigned int pc)
{
asm("ldr r0, [r0]");
asm("mov sp, r0");
asm("ldr r0, [r1]");
asm("bx r0");
}
函式中的sp為程式起始地址,pc為sp+4即復位中斷地址。這樣便可以實現復位操作。
關於while(1)的妙用就說到這,以後筆者會慢慢更新其他嵌入式程式設計相關的小技巧,敬請期待。