新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于AT91R40008微處理器的軟件定時器設計

        基于AT91R40008微處理器的軟件定時器設計

        作者:趙艷萍,粟秋碩 時間:2008-07-04 來源:電子元器件應用 收藏

          0引言

        本文引用地址:http://www.104case.com/article/85288.htm

          當前,系統的軟件代碼日趨復雜。然而,由于、定時器等硬件資源仍然相對有限。如何在不影響系統整體性能的情況下,為系統提供優異的定時性能,使系統能夠高效運行,已是一個值得關注的問題。

          1

          是一組定時器實體的集合,是一種針對不同定時服務進行統一管理的多任務鏈表類型數據結構。可使系統在某一確定時刻執行指定操作。它以可編程定時/計數器或單穩延時電路為基礎。利用硬件定時器產生的定時中斷來實現。雖然軟件定時器也需要占用CPU時間,但是相對于硬件定時器來說,它的資源多,定時時間長,使用靈活,實現起來簡單方便,因而在復雜系統或定時器工作方式比較復雜的應用場合更能體現其價值。 對定時器的組織和管理常用的有多隊列式和單鏈表式。前者通過將定時器劃分成不同時長的隊列來減少每次參與計數的定時器個數。這種組織方式在空負載檢查時存在很多冗余操作,而真正有效的操作只占少部分。后者則通過將定時器采取先進先出方式來組織定時器隊列,這種方式使用起來雖然比較簡單,但存在以下兩個問題:一是定時器隊列太長。找到所有到點定時器的時間開銷難以接受;二是在當時鐘中斷發生時,需要對所有的定時器的時長域進行減法操作,而這部分的時間性開銷很大。 本文采用的是單鏈表定時器隊列,但在定時器隊列組織方式上,根據各個定時器節點的定時值,對其按升序進行排序,然后按照后一個定時器的值是前面所有定時器值加上本身值的規則對此節點重新賦定時值。以使所有的到點定時節點集中于隊列的前面。由于所有定時器節點的隱含值均遞減,故可形成一個相對時長定時隊列。這樣,在每次產生時鐘中斷時,只需修改第一個定時器節點的值即可,從而大大降低了時鐘中斷處理函數的工作量。當需要添加新的定時器節點時,可在插入定時器進入列表前,根據第一項來修改超時值。對于這樣的組織管理方式,由于第一個節點就是當前定時器鏈表中定時時間最短的節點,且對鏈表的到期操作只需要集中在第一個節點上,故能減少對定時器鏈表多余的冗余操作,也免去了查找定時節點的開銷。

          2 AT91R40008

          AT91R40008是美國ATMEL公司推出的一款基于ARM7TDMI的16/32位。該器件的定時器/計數器模塊含有三個完全相同的16位定時器/計數器通道。每個通道都能獨立編程來完成多種功能(如頻率測量、事件計數、時間間隔測量、脈沖產生、延遲和脈沖寬度調制等)。每個通道有三個外部時鐘輸入、5個內部時鐘輸入和2個可由用戶配置的多功能I/O。此外,每個通道還可驅動一個內部信號,以通過A-IC(先進中斷控制器)產生處理器中斷。AT91R40008器件中的定時器/計數器模塊有兩個控制所有通道的全局寄存器。其中模塊控制器寄存器可以使三個通道由同一條指令同時啟動,而模塊模式寄存器則為每一個通道定義了外部時鐘輸入,并允許它們級聯。每一個定時器/計數器都可以獨立工作于兩種模式,分別是捕獲模式和波形模式。前者用于對信號的測量,后者則允許產生波形。通過TC通道模式寄存器的WAVE位可以控制定時器/計數器的工作模式。定時器的重新設定和啟動可由觸發條件決定。每個模式下通常有三種類型的內部觸發和一個外部觸發。其內部的三種觸發類型分別是:

          (1)軟件觸發

          每個通道有一個軟件觸發,可通過設定TC通道控制寄存器的SWTRG來得到。

          (2)SYNC觸發

          每個通道有一個同步觸發。該信號被響應和同一個軟件的一般效果觸發相同。所有通道的同步信號均可通過設定TC模塊控制寄存器的SYNC來同時響應。

          (3)RC比較觸發

          如果CPCTRG在TC通道模式寄存器被置位,那么,RC將在每個通道中執行,此時如果計數器與RC寄存器中的數值相匹配,則將得到一個RC比較觸發。

          事實上,定時器通道也能配置成一個外部觸發器。在捕獲模式中,外部觸發器信號能在TIOA和TIOB之間被選擇而執行一個觸發。而在波形模式中,外部事件則可通過TIOB、XC0、XC1或XC2編程來執行一個觸發。如果產生一個外部觸發,那么,脈沖周期必須比系統時鐘周期更長才能保證該觸發被檢測到。

          3軟件定時器的實現

          由于AT91R40008中的三個定時器/計數器都是16位,所以每個計數器的值只能從0x0000增加到0xFFFF,在溢出中斷以后,這個值將重新從0x0000開始。該特性限制了定時器/計數器單次最長的定時時間。為此,本文采用改進的單鏈表方式組織定時器鏈表,這樣,在定時器中斷上,硬件定時器不再周期性地產生中斷請求,而只在用戶預先指定的時刻產生,同時將下一次中斷發生時間動態寫入硬件定時器。

          軟件定時器的實現可通過各種函數來實現,主要有定時器驅動函數、定時器的初始化函數、定時器任務函數、定時器的啟動和關閉函數、定時器的添加和刪除函數以及定時器中斷處理函數等。

          3.1定時器的驅動

          軟件定時器可通過一個16位定時器/計數器來提供定時中斷,然后關閉定時器/計數器相應的中斷并設置相關參數,然后打開相應的中斷來完成。定時器驅動流程圖如圖1所示。

          3.2定時器初始化

          定時器初始化函數主要是初始化定時器單鏈表,給定時器單鏈表分配一塊內存單元;該函數將設置一個頭結點,這個頭結點包含定有時器鏈表中定時器單元個數、定時器單元句柄以及指向單鏈表隊列的頭指針。然后創建一個定時器任務,以作為定時器到期時的執行函數。

          3.3定時器的啟動和關閉

          定時器啟動函數可通過設置定時器寄存器TC_RC(TC寄存器)和TC_CCR(TC通道控制寄存器)來實現,而定時器關閉函數則可通過TC_CCR(TC通道控制寄存器)和TC_SR(TC狀態寄存器)來執行。

          3.4定時器的添加和刪除

          在定時器添加函數中,需要判斷新加的定時器所要插入的位置。插入時,如果鏈表為空,則直接插入第一個節點位置;否則,需要將新加的定時器值與鏈表中其余元素做一個比較,以找到新加的定時器在鏈表中的合適位置,同時相應修改自身的定時值。其示意性代碼如下:

          3.5定時器中斷處理

          在定時器中斷處理函數中,首先要求得逝去的定時器ticks值。然后將這個值與定時器隊列的第一個定時器節點做比較,以判斷第一個定時器節點是否定時時間到。這個函數的示意性代碼如下:

          3.6定時器任務

          在定時器任務中設置有一個無限循環等待,可創建一個定時器等待消息隊列,以等待定時消息的到來。定時器消息到時,即執行這個定時消息所對應的任務,同時釋放該函數定時器所占用的定時器單元節點,然后開始下一輪循環。

          4軟件定時器應用實例

          為了檢驗上述算法的可行性和可靠性,筆者采用RC比較觸發方式來對定時器報文進行了設計。其中時鐘信號選擇為MCK/1024,即MCK為50MHz,ticks為62500,也就是每1.28s產生一次定時器中斷,設置定時時間為5s。運行該應用程序后,用Sniffer抓包軟件抓獲的報文如圖2所示。

          由圖2可以看出,取平均值后,定時器任務間隔時間約為5.000 207s,完全可以達到設計要求,滿足設計需要。

          5 結束語

          本文介紹了一種在AT91微處理器上通過單鏈表實現的軟件定時器的設計方法。雖然創建時,該定時器的到期時間是亂序的,但啟動后的定時器則會嚴格按照到期時間的先后順序形成定時器單鏈表,并依次進入定時中斷同時發出對應消息。經過測試。利用此定時器隊列管理機制,能夠簡單有效地滿足系統對定時器的需求,同時節省了嵌入式系統定時管理所需要的計算資源。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        存儲器相關文章:存儲器原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 绥德县| 庐江县| 呼和浩特市| 静海县| 噶尔县| 曲阜市| 根河市| 遂平县| 买车| 寿光市| 汶川县| 名山县| 民勤县| 砚山县| 永登县| 汽车| 奇台县| 普定县| 彭山县| 高安市| 铁岭市| 子长县| 泸定县| 许昌县| 长治市| 宁明县| 枣强县| 百色市| 宿松县| 波密县| 通化县| 嵩明县| 鄂托克前旗| 惠水县| 宜兰市| 如东县| 青岛市| 济阳县| 咸宁市| 兴宁市| 鹤山市|