2013年2月10日 星期日

MCU程式設計技巧:Delay的使用

在有作業系統的系統上,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--;


}


這樣做的效果不錯,只是程式有點不太好寫。但可以使不同工作之間較不相互干擾。不過每次加入新的計時器,又要去改寫中斷程式。


這樣做其產品對於多重工作具有近似的反應時間,唯一的問題是工程師要負擔中斷及其他資源管理,也就是無法多人一起開發程式。另外閱讀性稍差,交接需要多花時間去追蹤變數功能。



沒有留言:

張貼留言