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