1. 程式人生 > >嵌入式程式設計 while(1)的妙用!

嵌入式程式設計 while(1)的妙用!

在嵌入式程式設計程式碼中,我們往往能看到許多地方有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)的妙用就說到這,以後筆者會慢慢更新其他嵌入式程式設計相關的小技巧,敬請期待。