【摘要】針對51單片機速度慢、驅動能力差、抗干擾能力低及事件觸發往往帶來不確定性和不穩定性等問題,提出了AVR微控制器與時間觸發方式相結合的嵌入式系統。該系統結合了AVR的硬件優勢及時間觸發的調度理念將系統精度有效的控制在ms級,具有占存儲單元少,可靠性好,可預測性強,安全性高的特點。實驗表明,該系統適用于中小型實時控制系統,并可靠穩定運行。
【關鍵詞】AVR;微控制器;時間觸發;嵌入式系統;混合式調度器
1.引言
近年來,嵌入式發展迅速,采用51單片機死循環的事件觸發編程方式已逐漸不能滿足企業對產品穩定性和安全性的要求。目前,嵌入式系統軟件有VxWork、Linux、WinCE、μC/OS-II等,可出于成本和技術上的考慮,微控制器往往不會選取其進行設計。在實際應用中,往往會面臨同時應付多外設、多任務的情況,則對它們的相互調度必不可少。時間觸發嵌入式系統就是這樣的簡單實用的操作系統。
本文設計了基于AVR微控制器的時間觸發多任務調度器并應用于實際。該調度器使用傳遞消息(message)的方式使得微控制器在多個任務及設備間切換。
2.AVR微控制器的結構特點
AVR是目前使用以該系列的ATmega128為例說明,它采用哈佛結構,RISC指令集、低功耗、片上資源豐富的特點,極大簡化了外圍電路,使系統更加穩定可靠。其特點為嵌入式系統設計提供了良好的硬件保證。
3.嵌入式兩種觸發方式的對比
在嵌入式系統中,通常采用兩種本質上不同的調度方式:事件觸發和時間觸發。事件觸發方式往往使用多級中斷來實現,其發生時間具有隨機性;而時間觸發方式由一個全局時鐘驅動,系統的行為在功能與時間上都是確定的,即具有可預測性。
3.1 事件觸發方式存在的問題
嵌入式系統開發人員有一種中斷事件絕不會丟失的錯誤觀念,這往往給開發的產品帶來災難性的后果。中斷事件丟失在實際應用中是一個不爭的事實,產生的原因有多方面,但無外乎內因和外因兩種。外因指嵌入式系統外產生的原因,這里主要指中斷源信號丟失或過于頻繁;而內因又可分為硬件原因和軟件原因,硬件原因主要由所用嵌入式器件的中斷嵌套能力所致,軟件原因主要由開發者編程時對任務中斷優先級設置錯誤以及任務處理不當所致。
例如,中斷0是一個高優先級中斷,而中斷1是一個低優先級中斷,則由高優先級中斷激活的中斷服務程序不能被低優先級的中斷打斷。于是,對第二個中斷的響應將被延遲,甚至在一些情況下它有被完全忽略的可能。
如果多個中斷源可能在“隨機的”時間間隔產生中斷,則中斷響應可能被遺漏。實際上,在同時有幾個有效的中斷源的情況下,幾乎不可能創建程序代碼來正確地處理所有可能的中斷組合。并且同時處理多個事件不但增加了系統復雜性,而且降低了系統在所有情況下的行為預測能力。至于使用效率,Metzner討論并得出結論:一個包含27個任務、采用RM調度算法的事件觸發系統,CPU的實際利用率僅為18%。
3.2 時間觸發方式的優勢
在該系統中,設計人員能夠通過仔細安排可控的順序,保證一次只處理一個事件。它的可預測性使其成為安全相關的系統的首選。Kopetz首先提出:使用基于時間觸發的合作式調度器會使得系統有非常好的可預測性。除可提高可靠性之外,使用該方式有助于減輕CPU的負荷及存儲器的使用量。
4.時間觸發嵌入式系統的設計
在該調度器中,定時器的設置被分離出來,并使之不依賴于編譯器的數據類型以及處理器的位數,通過修改該部分可以輕松移植到多種硬件平臺。系統整體方框圖如圖1所示:
4.1 消息隊列
消息隊列是調度器的核心,它是用戶自定義的數據類型,包括了每個任務所需要的信息。盡量將其存儲在DATA區,以供快速存取。對于基于時間觸發的混合式調度器,使用如下的數據結構,對于每個任務存儲器的開銷僅為8個字節。即使是使用32位處理器,每個任務的開銷也僅為14個字節。
typedef data struct
{void(code*pTask)(void);uint16 Delay;
uint16 Period;uint8 State;uint8 Co_op;}s_task;
s_task SCH_task_array[SCH_MAX_TASKS];
4.2 調度器定時器初始化函數
該函數用來產生驅動調度器的定時時標。本文所選用AVR系列的ATmega128微控制器具有四個定時器(兩個8位,兩個16位),任一個都能用來驅動調度器,權衡考慮選用定時器0。
void SCH_Init_T0(void)
{逐個刪除各個任務;停止定時器0;設置時間大小函數;
使能定時器0方式;啟動定時器0;}
注:在此期間不可開啟總中斷,即:SREG=0x80或SEI();
調度器必須先設定一個默認的時間片,這并不是件簡單的事。時間片過長會導致系統對交互行為的響應表現欠佳;時間片太短又會明顯地增大調度器處理耗時,而留給任務運行的時間卻很短。
根據筆者經驗,一個較為可取的時間片是略大于一次典型的交互所需要的時間,使大多數進程在一個時間片內完成。經反復嘗試,時間片選擇在1~5ms之間執行效率較高,這樣既可滿足響應速度的要求又能把任務執行的時間降到最低。該時間與任務個數和任務運行時間均有關,具體大小視情況而定。
4.3 中斷服務程序
建議該函數由CTC方式激活,當某任務需要運行時,使之處于就緒態等待被執行。該函數內容由具體任務而定。
4.4 調度器任務添加函數
該函數用來將任務添加到消息隊列,以保證條件滿足時被調用,函數如下所示:
uint8 SCH_Add_Task(void(code*pFu-nction)(),const uint16 delay,const uint16 period)
{定義靜態變量i;循環判斷任務隊列是否有空間;若無,報錯返回;否則,添加任務;}
4.5 調度函數
刷新函數雖然能夠直接激活任務,但若直接運行,長任務將破壞時標中斷,這意味著所有的系統定時都將受到嚴重影響,造成許多任務不能被調度。因此,為了在長任務存在的情況下使調度器的可靠性最大化,分離刷新和調度這兩個操作是必要的。
時間觸發嵌入式系統采用的是FCFS算法,為了提高系統的響應速度,必須要求Dura-tiontask void SCH_Dispatch_Tasks(void) {定義靜態變量i;如果運行標志位大于0,則執行該任務; 該標志位清零;如果是單次任務,則將其刪除;} 4.6 調度器任務刪除函數 void SCH_Delete_Task(const uint8 task_id) {定義 靜態返回值;若指針函數為空,返回空閑代碼; 否則,對其延遲、周期、狀態等變量清零;返回代碼;} 5.應用實驗 以電磁爐系統為例,進一步介紹基于AVR微控制器的時間觸發嵌入式系統的具體應用。 電磁爐系統是一個復雜的嵌入式系統,如圖2所示,AVR要處理大量的外圍設備,為便于開發,將整個程序按照硬件及功能進行模塊劃分,各個功能模塊之間通過傳遞消息的方式來完成多任務的處理。 針對該應用,可設計功能模塊:MSGMap[],該數組由各個功能模塊組成,具體子函數如表1所列,使用函數數組的方式可以增強程序的擴展能力。如果有新的外設,只需在這里添加對應的模塊入口,并完成相應的模塊就可以增加系統的功能。 其中每個任務的運行周期間隔時間是程序中設定的參數(周期應為4ms的倍數),具體執行時間由AVR Studio測得,均應小于設定時間片4ms,否則應用將出錯,需重新設定時間片大小或再次分割功能模塊。其中看門狗處理任務是唯一的搶占式任務。 6.結論與展望 實驗表明,以AVR微控制器為核心的控制系統,外圍擴展功能強大、開發較簡單,結合以時間觸發理念為內核的操作系統,設計時一次只為一個任務分配空間,每個任務的存儲開銷只有8個字節,采用由C語言與匯編混合式編程,簡單、安全,可預測性強,尤其適用于對成本和穩定性均有要求的中小企業。隨著嵌入式系統的發展,基于AVR的時間觸發嵌入式系統必然有著廣闊的應用前景。 參考文獻 [1]朱鳳新,姚竹亭.基于AVR的時間觸發嵌入式系統[J].工業控制計算機,2006(7):56-57. [2]Robert Love.Linux,陳莉君,等譯.內核設計與實現[M].北京:機械工業出版社,2006:31-32. [3]李奇,樊曉平.一種時間觸發的多任務調度器設計[J].單片機與嵌入式系統應用,2008(5):17-19. 作者簡介: 邵峰(1979—),男,河南鄭州人,碩士研究生,畢業于太原理工大學,現供職于鄭州科技學院電氣工程學院,研究方向:電力設備與嵌入式軟硬件開發。 劉林陰(1985—),女,河南鄭州人,碩士研究生,畢業于天津工業大學,現供職于鄭州科技學院電氣工程學院,研究方向:機電一體化智能控制裝備。