秦玉蒙, 王婭男, 邱春玲
(吉林大學(xué) 儀器科學(xué)與電氣工程學(xué)院,吉林 長春130026)
在單片機開發(fā)系統(tǒng)中,經(jīng)常用到定時控制,比如延遲控制、超時控制和計時控制等。尤其是多任務(wù)處理中,對定時的需求很大。為了獲得所需要的定時,需求準(zhǔn)確而穩(wěn)定的時間基準(zhǔn),產(chǎn)生這種時間準(zhǔn)確通常有兩種方法:硬件定時器和軟件定時器。
單片機都含有硬件定時器,它通過對時鐘脈沖的計數(shù)實現(xiàn)定時,定時準(zhǔn)確,使用方便,但是單片機內(nèi)部的硬件定時器數(shù)量有限,軟件定時器應(yīng)運而生,它以硬件定時器的定時中斷為基礎(chǔ),利用軟件方法來實現(xiàn),定時更長,使用更靈活。
在應(yīng)用單片機進(jìn)行多任務(wù)系統(tǒng)開發(fā)時,定時器工作方式復(fù)雜,受限于單片機內(nèi)部資源數(shù)量,實時操作系統(tǒng)中的軟件定時器無法直接套用;多人開發(fā)時,代碼風(fēng)格因人而異,定時器的管理無法統(tǒng)一,給多人協(xié)作開發(fā)和后期維護(hù)帶來了不便。因此,設(shè)計并實現(xiàn)一種軟件定時器,在單個硬件定時器上實現(xiàn)了多個軟件定時器,代碼經(jīng)過封裝標(biāo)準(zhǔn)化,并根據(jù)單片機的特性進(jìn)行了優(yōu)化,可作為一個獨立模塊嵌入到單片機軟件系統(tǒng)中;所有代碼都符合ANSI-C 標(biāo)準(zhǔn),易讀易用,在多任務(wù)系統(tǒng)開發(fā)中可以大大簡化軟件設(shè)計復(fù)雜性,方便多人協(xié)作開發(fā)和后期維護(hù)。
在實時操作系統(tǒng)中,硬件定時器以固定的頻率運行,形成周期性的中斷,稱之為“時鐘節(jié)拍”[1-7]。本軟件定時器以時鐘節(jié)拍為定時基準(zhǔn)源,通過軟件計數(shù)的方式實現(xiàn)對時鐘節(jié)拍的累計,當(dāng)達(dá)到預(yù)設(shè)值時,執(zhí)行預(yù)設(shè)任務(wù)。
本軟件定時器模塊由函數(shù)、數(shù)據(jù)結(jié)構(gòu)和宏組成,可作為一個獨立模塊嵌入到單片機軟件架構(gòu)中,如圖1所示。硬件定時器驅(qū)動層為軟件定時器提供穩(wěn)定的時鐘節(jié)拍,驅(qū)動處理算法有序運行。由于單片機的RAM容量有限,動態(tài)鏈表作數(shù)據(jù)結(jié)構(gòu)顯然很不適合,選用數(shù)組、輔助變量和宏定義配合的方式作為數(shù)據(jù)結(jié)構(gòu),既滿足了軟件定時器數(shù)量可控,又滿足了動態(tài)使用需求。接口函數(shù)統(tǒng)一管理所有軟件定時器,方便使用。此外,考慮到數(shù)據(jù)臨界態(tài)和用戶輸入的不確定性,添加了加鎖保護(hù)和輸入校驗,提高了軟件的魯棒性[8-10]。
圖1 軟件定時器模塊架構(gòu)
由于軟件定時器數(shù)量較多,所以為軟件定時器設(shè)計了一個核心數(shù)據(jù)結(jié)構(gòu)SoftwareTimer,其定義如下:
每個SoftwareTimer 結(jié)構(gòu)的實例定義了一個軟件定時器。其中:Count 用于設(shè)置時鐘節(jié)拍計數(shù)值;CallBackFuction 是計時時間到后執(zhí)行的回調(diào)函數(shù)指針,其類型為函數(shù)指針類型,對function 的定義如下:
typedef void (* function )(void );
本軟件定時器數(shù)量缺省配置為8,通過數(shù)組進(jìn)行管理,其定義如下:
struct SoftwareTimer Block[Sum];
define Sum 8 //軟件定時器數(shù)量
雖然軟件定時器從存儲結(jié)構(gòu)上是靜態(tài)的,但是在設(shè)計時考慮到動態(tài)使用的需求,將軟件定時器設(shè)計為先激活后使用,用完即回收。因此,定義了一個就緒表變量,用來標(biāo)記8 個定時器的ID 號和工作狀態(tài),其定義如下:
uchar State = 0;
軟件定時器的處理算法在時鐘節(jié)拍內(nèi)執(zhí)行,其軟件流程圖如圖2 所示,在時鐘節(jié)拍中,對已開啟的軟件定時器的時鐘節(jié)拍計數(shù)值減1,并判斷時鐘節(jié)拍計數(shù)值是否溢出,如果溢出,表明定時時間到,立即執(zhí)行回調(diào)函數(shù),并更新就緒表,在操作就緒表時,不允許有更高級的中斷進(jìn)入操作軟件定時器,所以在處理過程中需要加鎖保護(hù)。本軟件定時器的處理算法通過函數(shù)TimerTickTask 實現(xiàn),通過此函數(shù)對已開啟的軟件定時器進(jìn)行上述處理,其代碼定義如下:
圖2 軟件定時器處理算法流程圖
本軟件定時器提供了標(biāo)準(zhǔn)的接口函數(shù),軟件定時器接口函數(shù)包括軟件定時器啟動函數(shù)SoftwareTimerStart 和軟件定時器關(guān)閉函數(shù)SoftwareTimerStop。SoftwareTimerStart 函數(shù)流程如圖3所示,通過該函數(shù)可以開啟一個軟件定時器,如果無可用軟件定時器,即開啟失敗,返回錯誤碼。如果開啟成功,進(jìn)行時鐘節(jié)拍計數(shù)值和回調(diào)函數(shù)初始化,并把該軟件定時器在就緒表中的位置作為ID 號返回。
圖3 啟動流程圖
通過SoftwareTimerStop 函數(shù)可以對該軟件定時器進(jìn)行關(guān)閉操作,并返回已計量的時鐘節(jié)拍數(shù),其執(zhí)行流程如圖4 所示。
圖4 關(guān)閉流程圖
注意,軟件定時器受時鐘節(jié)拍驅(qū)動,節(jié)拍精度直接影響軟件定時器的精度?;卣{(diào)函數(shù)直接在時鐘節(jié)拍中運行,如果回調(diào)函數(shù)執(zhí)行時間超過時鐘節(jié)拍間隔時長,就會造成后續(xù)節(jié)拍的滯后,不僅影響定時精度,而且影響系統(tǒng)正常運行。所以回調(diào)函數(shù)的執(zhí)行時間不能超過時鐘節(jié)拍間隔時長,如果回調(diào)函數(shù)需要較長時間運行,可以在回調(diào)函數(shù)中置位一個標(biāo)志位,在大循環(huán)中掃描該標(biāo)志位執(zhí)行所需任務(wù)。
軟件定時器開啟和關(guān)閉的理想時間段為時鐘節(jié)拍所用硬件定時器的中斷處理函數(shù)執(zhí)行期間[11-12]。但實際上軟件定時器的開啟和關(guān)閉時刻是隨機的,在操作某個軟件定時器時,由于開啟時刻和關(guān)閉時刻與時鐘節(jié)拍沒有對準(zhǔn),會存在誤差,且其值可能是一個時鐘節(jié)拍內(nèi)的任意值,該誤差稱為啟動誤差和關(guān)閉誤差。如圖5 所示,時刻1 和時刻3 為時鐘節(jié)拍所用硬件定時器的中斷處理起始時刻。如果在時刻2 開啟了一個軟件定時器,其啟動誤差即為時刻1 與時刻2 之間的時間差值。如果在時刻4 停止了該軟件定時器,其關(guān)閉誤差即為時刻3 與時刻4 之間的時間差值。
圖5 誤差分析
啟動誤差和關(guān)閉誤差無法完全消除,可以采用更快的時鐘節(jié)拍來減小誤差,但是這樣會導(dǎo)致CPU 頻繁進(jìn)出中斷,CPU 利用率不高,應(yīng)根據(jù)實際應(yīng)用的需要,選擇合適的時鐘節(jié)拍,將這兩種誤差控制在可接受的范圍內(nèi)。
在基于時鐘節(jié)拍的前后臺軟件架構(gòu)中,兩個時鐘節(jié)拍之間的時間間隔稱為“時間片”[13],為了分析軟件定時器的算法效率,以“時間片占用率”來進(jìn)行衡量??梢愿鶕?jù)時間片占用率及應(yīng)用需求設(shè)定合適的時鐘節(jié)拍,獲取更高的定時精度[14-16]。
時間片占用率 = TimerTickTask 函數(shù)運行時間/時間片。
測試環(huán)境:Keil C51 V4.11,芯片類型AT89C55,時鐘頻率設(shè)置為24 MHz。
測試方法:時間片設(shè)置為5 ms。在開啟時鐘節(jié)拍所用硬件定時器之前,開啟軟件定時器,定時時間設(shè)置為5 ms,回調(diào)函數(shù)為空函數(shù)。時鐘節(jié)拍中只有TimerTickTask 函數(shù)。使用KEIL 軟件仿真得到測試結(jié)果如表1 所示。
由測試結(jié)果可知,每增加一個軟件定時器,TimerTickTask 函數(shù)運行時間增加約為45 μs,時間片占用率增加約為0.9%;AT89C55 在24 MHz 時鐘下的指令處理速度為2 MIPS,性能有限,在8 個軟件定時器全部開啟的極端情況下,時間片占用率不到8%,可見該軟件定時器算法具有較高的執(zhí)行效率。在更高級的單片機中可將時間片進(jìn)一步縮小,保證性能的同時可獲得更高的定時精度。
表1 性能測試
本軟件定時器使用靈活,應(yīng)用場合廣泛,例如,按鍵音、串口讀超時判斷和界面顯示超時判斷等。如果兩個軟件定時器嵌套使用,還可實現(xiàn)不等長度的周期性定時。
在單片機開發(fā)系統(tǒng),尤其是51 內(nèi)核單片機,在串口開發(fā)中,需要一個硬件定時器提供波特率,還需要一個硬件定時器用于串口讀超時判斷,造成硬件定時器資源緊張,本軟件定時器可以很好解決這個問題,首先根據(jù)需要編寫ReadTimerOut 函數(shù),此函數(shù)時是在串口讀超時后要執(zhí)行的任務(wù)。設(shè)時間片為1 ms,串口數(shù)據(jù)流中斷10 ms 即認(rèn)為超時,其判斷代碼如下:
在上述代碼中TimerID 變量有兩個作用,一是記錄定時器ID,二是用來判斷串口數(shù)據(jù)流的起始字節(jié)。如果是起始字節(jié),開啟一個軟件定時器,再次讀串口時關(guān)閉上一次開啟的軟件定時器,開啟一個軟件定時器重新開始計時。
本軟件定時器靈活使用,會把復(fù)雜設(shè)計變得簡單,在工控領(lǐng)域,經(jīng)過用到不等長周期性定時用于測試設(shè)備。設(shè)時間片為1 ms,利用本軟件定時器實現(xiàn)工作1 s停3 s 這樣的不等長周期性定時的代碼如下:
TaskStart 函數(shù)開啟任務(wù)后,開啟一個軟件定時器,定時1 s 后回調(diào)TaskSop 函數(shù),TaskSop 函數(shù)關(guān)閉任務(wù),開啟一個軟件定時器,定時3 s 后調(diào)TaskStart 函數(shù)。如此循環(huán)嵌套實現(xiàn)所需功能。
將實時操作系統(tǒng)中的定時器軟件管理思想引入單片機前后臺軟件架構(gòu)中,設(shè)計并實現(xiàn)了一個軟件定時器模塊,本模塊邏輯清楚,分層設(shè)計,并針對單片機進(jìn)行了特殊優(yōu)化;采用動態(tài)激活的方式使用,軟件定時器用完即回收,便于重復(fù)使用。誤差分析和性能測試表明本軟件定時器實用高效。利用本軟件定時器開發(fā)多任務(wù)系統(tǒng),不僅可以節(jié)約硬件定時器資源,而且可以大大加快單片機系統(tǒng)的開發(fā)進(jìn)程。
[1] Labrosse J. Inside Real-Time Kernels[C]//Conference Proceedings of Embedded Systems Conference East. 1997:205-214.
[2] Labrosse J J. Microc/OS-II[M]. R & D Books,1998.
[3] Krishna C M. Real ‐ Time Systems[M]. John Wiley & Sons,Inc.,1999.
[4] Pont M J. Patterns for time-triggered embedded systems[J]. New York:Person Edueation,2001.
[5] Dick R P,Lakshminarayana G,Raghunathan A,et al. Analysis of power dissipation in embedded systems using real-time operating systems[J]. Computer-Aided Design of Integrated Circuits and Systems,IEEE Transactions on,2003,22(5):615-627.
[6] 李小群,趙慧斌,葉以民,等. RFRTOS:基于Linux 的實時操作系統(tǒng)[J].軟件學(xué)報,2003,14(7):203-1212.
[7] Love R,Are S H W,Linus A C,et al. Linux Kernel Development Second Edition[M]. 2004.
[8] 李 凡,盧社階,邱 鵬,等. 在嵌入式應(yīng)用中增強Linux 實時性的方法研究[J]. 華中科技大學(xué)學(xué)報:自然科學(xué)版,2005,33(2):82-85.
[9] 嚴(yán)蔚敏,吳偉民. 數(shù)據(jù)結(jié)構(gòu)[M]. 北京:清華大學(xué)出版社,1992.
[10] Shaffer C A. Solutions Manual:A Practical Introduction to Data Structures and Algorithm Analysis[M]. N. J.:Prentice Hall,1997.
[11] 趙 霞,郭 耀,雷志勇,等. 基于模擬器的嵌入式操作系統(tǒng)能耗估算與分析[J]. 電子學(xué)報,2008,36(2):209-215.
[12] 周 博,王石記,邱衛(wèi)東,等. SHUM-UCOS:基于統(tǒng)一多任務(wù)模型可重構(gòu)系統(tǒng)的實時操作系統(tǒng)[J]. 計算機學(xué)報,2006,29(2):208-218.
[13] 徐久強,劉 輝,朱 劍,等. 一種基于時間片的搶占控制模型[J]. 東北大學(xué)學(xué)報(自然科學(xué)版),2009,11:1570-1573.
[14] 陳 俐,殷承良. 基于混合定時調(diào)度的車輛AMT 控制系統(tǒng)的實時性分析[J]. 上海交通大學(xué)學(xué)報,2008,41(2):256-261.
[15] 郭占社,孟永鋼,蘇才鈞. 基于Windows 的精確定時技術(shù)及其在工程中的應(yīng)用[J]. 哈爾濱工業(yè)大學(xué)學(xué)報,2005,37(12):1717-1720.
[16] Holenderski M,van den Heuvel M,Bril R J,et al. Grasp:Tracing,visualizing and measuring the behavior of real-time systems[C]//International Workshop on Analysis Tools and Methodologies for Embedded and Real-time Systems (WATERS). 2010:37-42.