2014-04-29 44 views
2

我想知道爲什麼我們在大多數c程序的末尾包含一個空的while(1)循環,例如電機驅動器,陀螺儀傳感器例程?我搜查了但沒有找到任何令人滿意的理由。爲什麼我們在嵌入式c程序結束時使用empty(1)?

謝謝。

例如以下上的ATmega8的代碼:

#include <avr/io.h> 
#include <util/delay.h> 
void main (void) 
{ 
int n = 1; 
DDRB = 0xFF; 
for (n=1; n<=10; ++n) 
{ 
PORTB = 0x00; 
_delay_ms(1000); 
PORTB = 0XFF; 
} 
while (1) 
{} 
} 
+3

誰是'我們'?你能舉個例子嗎? –

+1

我已經與嵌入式C/C++編程工作了8年,從未見過這個。它通常在較小的系統上運行輕重量硬件? – Martin

+0

@ scy7he - 在這樣的系統中這種情況並不少見,但由於浪費了大量的資源,這通常是一個壞主意。 –

回答

5

許多嵌入式系統使用定時器,中斷或其他事件來驅動他們的行爲。他們也可以運行提供線程或任務的操作系統,這些線程或任務可以建立給他真正工作的執行者。所以一旦初始化完成,main()程序就沒有什麼可做的了,但在這樣簡單的系統中,main()往往沒有任何返回值,所以無限循環可以讓處理器保持繁忙狀態,而其他任何事情都不會發生。

+0

雖然(真),如果有一個RTOS涉及一個簡單的while(1){}循環浪費堆棧,即使main()被用作空閒任務,因此CPU浪費也是可以的。 main()通常有一個很大的堆棧,因爲它用於crt和static ctors的初始化,所以它更適合用於某些實際工作,而另一個線程則成爲空閒任務。我使用main()來運行需要大堆棧的SD卡驅動程序,以及一個空閒線程,該程序通過睡眠()循環閃爍LED,並使處理器進入「等待中斷」低功耗模式。 –

0

一個空的while(1)循環防止線程從離開。也許這就是你正在看的代碼所期望的。

+0

的確,在最小的環境中,main()返回可能是一件非常糟糕的事情。 –

0

即使在簡單的程序,實現自由

  • 重啓(復位)
  • 或掛

main()末。

你可以通過這個無限循環強制執行後一種行爲。

如果你想讓程序無限重複,你也可以這樣做。

如果您從main()返回時不完全知道庫的功能,則最好不要返回,而是循環一次或其他方式。

相關問題