在有作業系統的系統上,Delay不是問題,只要呼叫對的函式就對了。
程式也很好寫,樣子大概就是以下程式:
void Task(void)
{
for(;;)
{
delay(1);
// do something
}
}
只要控制delay的參數,就可以控制執行頻率。
但在無作業系統的MCU上,這可是嚴重的問題。Bee也以如何處理這個問題來看工程師的MCU程式設計的專業程度。
在許多入門書可以看到delay是這樣寫的:
void delay(unsigned int n)
{
while(n--);
}
若是這樣用,就是MCU新鮮人。
因為做為產品,不會只有一項功能,老闆隨時都會加功能,一但功能修改,就會調不完。
有一個變形方法解決在不同MCU上執行的效率差,就是利用Watch Dog計時器去取代delay()中的參數。利用檢查參數值做為時間計數。
另一個問題是:一但在執行delay()其他工作就停擺。
這樣做出來的產品,往往有一個問題,只會做單工,不會處理多重工作。產品特性很挑時序,只能在對的時間送入對的信號,使產品不具適應性。
專業一點的作法,會使用一個Timer做為計時器去改變變數的值,做為計時的檢知。
int delay=DELAY_TIME;
void main(void)
{
while(1)
{
if(delay == 0)
{
// do something
delay=DELAY_TIME;
}
}
}
void Timer_Interrupt(void)
{
if(delay) delay--;
}
這樣做的效果不錯,只是程式有點不太好寫。但可以使不同工作之間較不相互干擾。不過每次加入新的計時器,又要去改寫中斷程式。
這樣做其產品對於多重工作具有近似的反應時間,唯一的問題是工程師要負擔中斷及其他資源管理,也就是無法多人一起開發程式。另外閱讀性稍差,交接需要多花時間去追蹤變數功能。
沒有留言:
張貼留言