基于AT91R40008微處理器的軟件定時器設計
0引言
本文引用地址:http://www.ex-cimer.com/article/85288.htm當前,嵌入式系統(tǒng)的軟件代碼日趨復雜。然而,由于存儲器、定時器等硬件資源仍然相對有限。如何在不影響系統(tǒng)整體性能的情況下,為嵌入式系統(tǒng)提供優(yōu)異的定時性能,使系統(tǒng)能夠高效運行,已是一個值得關注的問題。
軟件定時器是一組定時器實體的集合,是一種針對不同定時服務進行統(tǒng)一管理的多任務鏈表類型數(shù)據(jù)結構。軟件定時器可使系統(tǒng)在某一確定時刻執(zhí)行指定操作。它以可編程定時/計數(shù)器或單穩(wěn)延時電路為基礎。利用硬件定時器產(chǎn)生的定時中斷來實現(xiàn)。雖然軟件定時器也需要占用CPU時間,但是相對于硬件定時器來說,它的資源多,定時時間長,使用靈活,實現(xiàn)起來簡單方便,因而在復雜系統(tǒng)或定時器工作方式比較復雜的應用場合更能體現(xiàn)其價值。 對定時器的組織和管理常用的有多隊列式和單鏈表式。前者通過將定時器劃分成不同時長的隊列來減少每次參與計數(shù)的定時器個數(shù)。這種組織方式在空負載檢查時存在很多冗余操作,而真正有效的操作只占少部分。后者則通過將定時器采取先進先出方式來組織定時器隊列,這種方式使用起來雖然比較簡單,但存在以下兩個問題:一是定時器隊列太長。找到所有到點定時器的時間開銷難以接受;二是在當時鐘中斷發(fā)生時,需要對所有的定時器的時長域進行減法操作,而這部分的時間性開銷很大。 本文采用的是單鏈表定時器隊列,但在定時器隊列組織方式上,根據(jù)各個定時器節(jié)點的定時值,對其按升序進行排序,然后按照后一個定時器的值是前面所有定時器值加上本身值的規(guī)則對此節(jié)點重新賦定時值。以使所有的到點定時節(jié)點集中于隊列的前面。由于所有定時器節(jié)點的隱含值均遞減,故可形成一個相對時長定時隊列。這樣,在每次產(chǎn)生時鐘中斷時,只需修改第一個定時器節(jié)點的值即可,從而大大降低了時鐘中斷處理函數(shù)的工作量。當需要添加新的定時器節(jié)點時,可在插入定時器進入列表前,根據(jù)第一項來修改超時值。對于這樣的組織管理方式,由于第一個節(jié)點就是當前定時器鏈表中定時時間最短的節(jié)點,且對鏈表的到期操作只需要集中在第一個節(jié)點上,故能減少對定時器鏈表多余的冗余操作,也免去了查找定時節(jié)點的開銷。
2 AT91R40008微處理器
AT91R40008是美國ATMEL公司推出的一款基于ARM7TDMI嵌入式微處理器的16/32位微處理器。該器件的定時器/計數(shù)器模塊含有三個完全相同的16位定時器/計數(shù)器通道。每個通道都能獨立編程來完成多種功能(如頻率測量、事件計數(shù)、時間間隔測量、脈沖產(chǎn)生、延遲和脈沖寬度調制等)。每個通道有三個外部時鐘輸入、5個內部時鐘輸入和2個可由用戶配置的多功能I/O。此外,每個通道還可驅動一個內部信號,以通過A-IC(先進中斷控制器)產(chǎn)生處理器中斷。AT91R40008器件中的定時器/計數(shù)器模塊有兩個控制所有通道的全局寄存器。其中模塊控制器寄存器可以使三個通道由同一條指令同時啟動,而模塊模式寄存器則為每一個通道定義了外部時鐘輸入,并允許它們級聯(lián)。每一個定時器/計數(shù)器都可以獨立工作于兩種模式,分別是捕獲模式和波形模式。前者用于對信號的測量,后者則允許產(chǎn)生波形。通過TC通道模式寄存器的WAVE位可以控制定時器/計數(shù)器的工作模式。定時器的重新設定和啟動可由觸發(fā)條件決定。每個模式下通常有三種類型的內部觸發(fā)和一個外部觸發(fā)。其內部的三種觸發(fā)類型分別是:
(1)軟件觸發(fā)
每個通道有一個軟件觸發(fā),可通過設定TC通道控制寄存器的SWTRG來得到。
(2)SYNC觸發(fā)
每個通道有一個同步觸發(fā)。該信號被響應和同一個軟件的一般效果觸發(fā)相同。所有通道的同步信號均可通過設定TC模塊控制寄存器的SYNC來同時響應。
(3)RC比較觸發(fā)
如果CPCTRG在TC通道模式寄存器被置位,那么,RC將在每個通道中執(zhí)行,此時如果計數(shù)器與RC寄存器中的數(shù)值相匹配,則將得到一個RC比較觸發(fā)。
事實上,定時器通道也能配置成一個外部觸發(fā)器。在捕獲模式中,外部觸發(fā)器信號能在TIOA和TIOB之間被選擇而執(zhí)行一個觸發(fā)。而在波形模式中,外部事件則可通過TIOB、XC0、XC1或XC2編程來執(zhí)行一個觸發(fā)。如果產(chǎn)生一個外部觸發(fā),那么,脈沖周期必須比系統(tǒng)時鐘周期更長才能保證該觸發(fā)被檢測到。
3軟件定時器的實現(xiàn)
由于AT91R40008中的三個定時器/計數(shù)器都是16位,所以每個計數(shù)器的值只能從0x0000增加到0xFFFF,在溢出中斷以后,這個值將重新從0x0000開始。該特性限制了定時器/計數(shù)器單次最長的定時時間。為此,本文采用改進的單鏈表方式組織定時器鏈表,這樣,在定時器中斷上,硬件定時器不再周期性地產(chǎn)生中斷請求,而只在用戶預先指定的時刻產(chǎn)生,同時將下一次中斷發(fā)生時間動態(tài)寫入硬件定時器。
軟件定時器的實現(xiàn)可通過各種函數(shù)來實現(xiàn),主要有定時器驅動函數(shù)、定時器的初始化函數(shù)、定時器任務函數(shù)、定時器的啟動和關閉函數(shù)、定時器的添加和刪除函數(shù)以及定時器中斷處理函數(shù)等。
3.1定時器的驅動
軟件定時器可通過一個16位定時器/計數(shù)器來提供定時中斷,然后關閉定時器/計數(shù)器相應的中斷并設置相關參數(shù),然后打開相應的中斷來完成。定時器驅動流程圖如圖1所示。
3.2定時器初始化
定時器初始化函數(shù)主要是初始化定時器單鏈表,給定時器單鏈表分配一塊內存單元;該函數(shù)將設置一個頭結點,這個頭結點包含定有時器鏈表中定時器單元個數(shù)、定時器單元句柄以及指向單鏈表隊列的頭指針。然后創(chuàng)建一個定時器任務,以作為定時器到期時的執(zhí)行函數(shù)。
3.3定時器的啟動和關閉
定時器啟動函數(shù)可通過設置定時器寄存器TC_RC(TC寄存器)和TC_CCR(TC通道控制寄存器)來實現(xiàn),而定時器關閉函數(shù)則可通過TC_CCR(TC通道控制寄存器)和TC_SR(TC狀態(tài)寄存器)來執(zhí)行。
3.4定時器的添加和刪除
在定時器添加函數(shù)中,需要判斷新加的定時器所要插入的位置。插入時,如果鏈表為空,則直接插入第一個節(jié)點位置;否則,需要將新加的定時器值與鏈表中其余元素做一個比較,以找到新加的定時器在鏈表中的合適位置,同時相應修改自身的定時值。其示意性代碼如下:
3.5定時器中斷處理
在定時器中斷處理函數(shù)中,首先要求得逝去的定時器ticks值。然后將這個值與定時器隊列的第一個定時器節(jié)點做比較,以判斷第一個定時器節(jié)點是否定時時間到。這個函數(shù)的示意性代碼如下:
3.6定時器任務
在定時器任務中設置有一個無限循環(huán)等待,可創(chuàng)建一個定時器等待消息隊列,以等待定時消息的到來。定時器消息到時,即執(zhí)行這個定時消息所對應的任務,同時釋放該函數(shù)定時器所占用的定時器單元節(jié)點,然后開始下一輪循環(huán)。
4軟件定時器應用實例
為了檢驗上述算法的可行性和可靠性,筆者采用RC比較觸發(fā)方式來對定時器報文進行了設計。其中時鐘信號選擇為MCK/1024,即MCK為50MHz,ticks為62500,也就是每1.28s產(chǎn)生一次定時器中斷,設置定時時間為5s。運行該應用程序后,用Sniffer抓包軟件抓獲的報文如圖2所示。
由圖2可以看出,取平均值后,定時器任務間隔時間約為5.000 207s,完全可以達到設計要求,滿足設計需要。
5 結束語
本文介紹了一種在AT91微處理器上通過單鏈表實現(xiàn)的軟件定時器的設計方法。雖然創(chuàng)建時,該定時器的到期時間是亂序的,但啟動后的定時器則會嚴格按照到期時間的先后順序形成定時器單鏈表,并依次進入定時中斷同時發(fā)出對應消息。經(jīng)過測試。利用此定時器隊列管理機制,能夠簡單有效地滿足系統(tǒng)對定時器的需求,同時節(jié)省了嵌入式系統(tǒng)定時管理所需要的計算資源。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)存儲器相關文章:存儲器原理
評論