秦玉蒙, 王婭男, 邱春玲
(吉林大學(xué) 儀器科學(xué)與電氣工程學(xué)院,吉林 長(zhǎng)春130026)
在單片機(jī)開發(fā)系統(tǒng)中,經(jīng)常用到定時(shí)控制,比如延遲控制、超時(shí)控制和計(jì)時(shí)控制等。尤其是多任務(wù)處理中,對(duì)定時(shí)的需求很大。為了獲得所需要的定時(shí),需求準(zhǔn)確而穩(wěn)定的時(shí)間基準(zhǔn),產(chǎn)生這種時(shí)間準(zhǔn)確通常有兩種方法:硬件定時(shí)器和軟件定時(shí)器。
單片機(jī)都含有硬件定時(shí)器,它通過對(duì)時(shí)鐘脈沖的計(jì)數(shù)實(shí)現(xiàn)定時(shí),定時(shí)準(zhǔn)確,使用方便,但是單片機(jī)內(nèi)部的硬件定時(shí)器數(shù)量有限,軟件定時(shí)器應(yīng)運(yùn)而生,它以硬件定時(shí)器的定時(shí)中斷為基礎(chǔ),利用軟件方法來實(shí)現(xiàn),定時(shí)更長(zhǎng),使用更靈活。
在應(yīng)用單片機(jī)進(jìn)行多任務(wù)系統(tǒng)開發(fā)時(shí),定時(shí)器工作方式復(fù)雜,受限于單片機(jī)內(nèi)部資源數(shù)量,實(shí)時(shí)操作系統(tǒng)中的軟件定時(shí)器無法直接套用;多人開發(fā)時(shí),代碼風(fēng)格因人而異,定時(shí)器的管理無法統(tǒng)一,給多人協(xié)作開發(fā)和后期維護(hù)帶來了不便。因此,設(shè)計(jì)并實(shí)現(xiàn)一種軟件定時(shí)器,在單個(gè)硬件定時(shí)器上實(shí)現(xiàn)了多個(gè)軟件定時(shí)器,代碼經(jīng)過封裝標(biāo)準(zhǔn)化,并根據(jù)單片機(jī)的特性進(jìn)行了優(yōu)化,可作為一個(gè)獨(dú)立模塊嵌入到單片機(jī)軟件系統(tǒng)中;所有代碼都符合ANSI-C 標(biāo)準(zhǔn),易讀易用,在多任務(wù)系統(tǒng)開發(fā)中可以大大簡(jiǎn)化軟件設(shè)計(jì)復(fù)雜性,方便多人協(xié)作開發(fā)和后期維護(hù)。
在實(shí)時(shí)操作系統(tǒng)中,硬件定時(shí)器以固定的頻率運(yùn)行,形成周期性的中斷,稱之為“時(shí)鐘節(jié)拍”[1-7]。本軟件定時(shí)器以時(shí)鐘節(jié)拍為定時(shí)基準(zhǔn)源,通過軟件計(jì)數(shù)的方式實(shí)現(xiàn)對(duì)時(shí)鐘節(jié)拍的累計(jì),當(dāng)達(dá)到預(yù)設(shè)值時(shí),執(zhí)行預(yù)設(shè)任務(wù)。
本軟件定時(shí)器模塊由函數(shù)、數(shù)據(jù)結(jié)構(gòu)和宏組成,可作為一個(gè)獨(dú)立模塊嵌入到單片機(jī)軟件架構(gòu)中,如圖1所示。硬件定時(shí)器驅(qū)動(dòng)層為軟件定時(shí)器提供穩(wěn)定的時(shí)鐘節(jié)拍,驅(qū)動(dòng)處理算法有序運(yùn)行。由于單片機(jī)的RAM容量有限,動(dòng)態(tài)鏈表作數(shù)據(jù)結(jié)構(gòu)顯然很不適合,選用數(shù)組、輔助變量和宏定義配合的方式作為數(shù)據(jù)結(jié)構(gòu),既滿足了軟件定時(shí)器數(shù)量可控,又滿足了動(dòng)態(tài)使用需求。接口函數(shù)統(tǒng)一管理所有軟件定時(shí)器,方便使用。此外,考慮到數(shù)據(jù)臨界態(tài)和用戶輸入的不確定性,添加了加鎖保護(hù)和輸入校驗(yàn),提高了軟件的魯棒性[8-10]。
圖1 軟件定時(shí)器模塊架構(gòu)
由于軟件定時(shí)器數(shù)量較多,所以為軟件定時(shí)器設(shè)計(jì)了一個(gè)核心數(shù)據(jù)結(jié)構(gòu)SoftwareTimer,其定義如下:
每個(gè)SoftwareTimer 結(jié)構(gòu)的實(shí)例定義了一個(gè)軟件定時(shí)器。其中:Count 用于設(shè)置時(shí)鐘節(jié)拍計(jì)數(shù)值;CallBackFuction 是計(jì)時(shí)時(shí)間到后執(zhí)行的回調(diào)函數(shù)指針,其類型為函數(shù)指針類型,對(duì)function 的定義如下:
typedef void (* function )(void );
本軟件定時(shí)器數(shù)量缺省配置為8,通過數(shù)組進(jìn)行管理,其定義如下:
struct SoftwareTimer Block[Sum];
define Sum 8 //軟件定時(shí)器數(shù)量
雖然軟件定時(shí)器從存儲(chǔ)結(jié)構(gòu)上是靜態(tài)的,但是在設(shè)計(jì)時(shí)考慮到動(dòng)態(tài)使用的需求,將軟件定時(shí)器設(shè)計(jì)為先激活后使用,用完即回收。因此,定義了一個(gè)就緒表變量,用來標(biāo)記8 個(gè)定時(shí)器的ID 號(hào)和工作狀態(tài),其定義如下:
uchar State = 0;
軟件定時(shí)器的處理算法在時(shí)鐘節(jié)拍內(nèi)執(zhí)行,其軟件流程圖如圖2 所示,在時(shí)鐘節(jié)拍中,對(duì)已開啟的軟件定時(shí)器的時(shí)鐘節(jié)拍計(jì)數(shù)值減1,并判斷時(shí)鐘節(jié)拍計(jì)數(shù)值是否溢出,如果溢出,表明定時(shí)時(shí)間到,立即執(zhí)行回調(diào)函數(shù),并更新就緒表,在操作就緒表時(shí),不允許有更高級(jí)的中斷進(jìn)入操作軟件定時(shí)器,所以在處理過程中需要加鎖保護(hù)。本軟件定時(shí)器的處理算法通過函數(shù)TimerTickTask 實(shí)現(xiàn),通過此函數(shù)對(duì)已開啟的軟件定時(shí)器進(jìn)行上述處理,其代碼定義如下:
圖2 軟件定時(shí)器處理算法流程圖
本軟件定時(shí)器提供了標(biāo)準(zhǔn)的接口函數(shù),軟件定時(shí)器接口函數(shù)包括軟件定時(shí)器啟動(dòng)函數(shù)SoftwareTimerStart 和軟件定時(shí)器關(guān)閉函數(shù)SoftwareTimerStop。SoftwareTimerStart 函數(shù)流程如圖3所示,通過該函數(shù)可以開啟一個(gè)軟件定時(shí)器,如果無可用軟件定時(shí)器,即開啟失敗,返回錯(cuò)誤碼。如果開啟成功,進(jìn)行時(shí)鐘節(jié)拍計(jì)數(shù)值和回調(diào)函數(shù)初始化,并把該軟件定時(shí)器在就緒表中的位置作為ID 號(hào)返回。
圖3 啟動(dòng)流程圖
通過SoftwareTimerStop 函數(shù)可以對(duì)該軟件定時(shí)器進(jìn)行關(guān)閉操作,并返回已計(jì)量的時(shí)鐘節(jié)拍數(shù),其執(zhí)行流程如圖4 所示。
圖4 關(guān)閉流程圖
注意,軟件定時(shí)器受時(shí)鐘節(jié)拍驅(qū)動(dòng),節(jié)拍精度直接影響軟件定時(shí)器的精度?;卣{(diào)函數(shù)直接在時(shí)鐘節(jié)拍中運(yùn)行,如果回調(diào)函數(shù)執(zhí)行時(shí)間超過時(shí)鐘節(jié)拍間隔時(shí)長(zhǎng),就會(huì)造成后續(xù)節(jié)拍的滯后,不僅影響定時(shí)精度,而且影響系統(tǒng)正常運(yùn)行。所以回調(diào)函數(shù)的執(zhí)行時(shí)間不能超過時(shí)鐘節(jié)拍間隔時(shí)長(zhǎng),如果回調(diào)函數(shù)需要較長(zhǎng)時(shí)間運(yùn)行,可以在回調(diào)函數(shù)中置位一個(gè)標(biāo)志位,在大循環(huán)中掃描該標(biāo)志位執(zhí)行所需任務(wù)。
軟件定時(shí)器開啟和關(guān)閉的理想時(shí)間段為時(shí)鐘節(jié)拍所用硬件定時(shí)器的中斷處理函數(shù)執(zhí)行期間[11-12]。但實(shí)際上軟件定時(shí)器的開啟和關(guān)閉時(shí)刻是隨機(jī)的,在操作某個(gè)軟件定時(shí)器時(shí),由于開啟時(shí)刻和關(guān)閉時(shí)刻與時(shí)鐘節(jié)拍沒有對(duì)準(zhǔn),會(huì)存在誤差,且其值可能是一個(gè)時(shí)鐘節(jié)拍內(nèi)的任意值,該誤差稱為啟動(dòng)誤差和關(guān)閉誤差。如圖5 所示,時(shí)刻1 和時(shí)刻3 為時(shí)鐘節(jié)拍所用硬件定時(shí)器的中斷處理起始時(shí)刻。如果在時(shí)刻2 開啟了一個(gè)軟件定時(shí)器,其啟動(dòng)誤差即為時(shí)刻1 與時(shí)刻2 之間的時(shí)間差值。如果在時(shí)刻4 停止了該軟件定時(shí)器,其關(guān)閉誤差即為時(shí)刻3 與時(shí)刻4 之間的時(shí)間差值。
圖5 誤差分析
啟動(dòng)誤差和關(guān)閉誤差無法完全消除,可以采用更快的時(shí)鐘節(jié)拍來減小誤差,但是這樣會(huì)導(dǎo)致CPU 頻繁進(jìn)出中斷,CPU 利用率不高,應(yīng)根據(jù)實(shí)際應(yīng)用的需要,選擇合適的時(shí)鐘節(jié)拍,將這兩種誤差控制在可接受的范圍內(nèi)。
在基于時(shí)鐘節(jié)拍的前后臺(tái)軟件架構(gòu)中,兩個(gè)時(shí)鐘節(jié)拍之間的時(shí)間間隔稱為“時(shí)間片”[13],為了分析軟件定時(shí)器的算法效率,以“時(shí)間片占用率”來進(jìn)行衡量??梢愿鶕?jù)時(shí)間片占用率及應(yīng)用需求設(shè)定合適的時(shí)鐘節(jié)拍,獲取更高的定時(shí)精度[14-16]。
時(shí)間片占用率 = TimerTickTask 函數(shù)運(yùn)行時(shí)間/時(shí)間片。
測(cè)試環(huán)境:Keil C51 V4.11,芯片類型AT89C55,時(shí)鐘頻率設(shè)置為24 MHz。
測(cè)試方法:時(shí)間片設(shè)置為5 ms。在開啟時(shí)鐘節(jié)拍所用硬件定時(shí)器之前,開啟軟件定時(shí)器,定時(shí)時(shí)間設(shè)置為5 ms,回調(diào)函數(shù)為空函數(shù)。時(shí)鐘節(jié)拍中只有TimerTickTask 函數(shù)。使用KEIL 軟件仿真得到測(cè)試結(jié)果如表1 所示。
由測(cè)試結(jié)果可知,每增加一個(gè)軟件定時(shí)器,TimerTickTask 函數(shù)運(yùn)行時(shí)間增加約為45 μs,時(shí)間片占用率增加約為0.9%;AT89C55 在24 MHz 時(shí)鐘下的指令處理速度為2 MIPS,性能有限,在8 個(gè)軟件定時(shí)器全部開啟的極端情況下,時(shí)間片占用率不到8%,可見該軟件定時(shí)器算法具有較高的執(zhí)行效率。在更高級(jí)的單片機(jī)中可將時(shí)間片進(jìn)一步縮小,保證性能的同時(shí)可獲得更高的定時(shí)精度。
表1 性能測(cè)試
本軟件定時(shí)器使用靈活,應(yīng)用場(chǎng)合廣泛,例如,按鍵音、串口讀超時(shí)判斷和界面顯示超時(shí)判斷等。如果兩個(gè)軟件定時(shí)器嵌套使用,還可實(shí)現(xiàn)不等長(zhǎng)度的周期性定時(shí)。
在單片機(jī)開發(fā)系統(tǒng),尤其是51 內(nèi)核單片機(jī),在串口開發(fā)中,需要一個(gè)硬件定時(shí)器提供波特率,還需要一個(gè)硬件定時(shí)器用于串口讀超時(shí)判斷,造成硬件定時(shí)器資源緊張,本軟件定時(shí)器可以很好解決這個(gè)問題,首先根據(jù)需要編寫ReadTimerOut 函數(shù),此函數(shù)時(shí)是在串口讀超時(shí)后要執(zhí)行的任務(wù)。設(shè)時(shí)間片為1 ms,串口數(shù)據(jù)流中斷10 ms 即認(rèn)為超時(shí),其判斷代碼如下:
在上述代碼中TimerID 變量有兩個(gè)作用,一是記錄定時(shí)器ID,二是用來判斷串口數(shù)據(jù)流的起始字節(jié)。如果是起始字節(jié),開啟一個(gè)軟件定時(shí)器,再次讀串口時(shí)關(guān)閉上一次開啟的軟件定時(shí)器,開啟一個(gè)軟件定時(shí)器重新開始計(jì)時(shí)。
本軟件定時(shí)器靈活使用,會(huì)把復(fù)雜設(shè)計(jì)變得簡(jiǎn)單,在工控領(lǐng)域,經(jīng)過用到不等長(zhǎng)周期性定時(shí)用于測(cè)試設(shè)備。設(shè)時(shí)間片為1 ms,利用本軟件定時(shí)器實(shí)現(xiàn)工作1 s停3 s 這樣的不等長(zhǎng)周期性定時(shí)的代碼如下:
TaskStart 函數(shù)開啟任務(wù)后,開啟一個(gè)軟件定時(shí)器,定時(shí)1 s 后回調(diào)TaskSop 函數(shù),TaskSop 函數(shù)關(guān)閉任務(wù),開啟一個(gè)軟件定時(shí)器,定時(shí)3 s 后調(diào)TaskStart 函數(shù)。如此循環(huán)嵌套實(shí)現(xiàn)所需功能。
將實(shí)時(shí)操作系統(tǒng)中的定時(shí)器軟件管理思想引入單片機(jī)前后臺(tái)軟件架構(gòu)中,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)軟件定時(shí)器模塊,本模塊邏輯清楚,分層設(shè)計(jì),并針對(duì)單片機(jī)進(jìn)行了特殊優(yōu)化;采用動(dòng)態(tài)激活的方式使用,軟件定時(shí)器用完即回收,便于重復(fù)使用。誤差分析和性能測(cè)試表明本軟件定時(shí)器實(shí)用高效。利用本軟件定時(shí)器開發(fā)多任務(wù)系統(tǒng),不僅可以節(jié)約硬件定時(shí)器資源,而且可以大大加快單片機(jī)系統(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 的實(shí)時(shí)操作系統(tǒng)[J].軟件學(xué)報(bào),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)用中增強(qiáng)Linux 實(shí)時(shí)性的方法研究[J]. 華中科技大學(xué)學(xué)報(bào):自然科學(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é)報(bào),2008,36(2):209-215.
[12] 周 博,王石記,邱衛(wèi)東,等. SHUM-UCOS:基于統(tǒng)一多任務(wù)模型可重構(gòu)系統(tǒng)的實(shí)時(shí)操作系統(tǒng)[J]. 計(jì)算機(jī)學(xué)報(bào),2006,29(2):208-218.
[13] 徐久強(qiáng),劉 輝,朱 劍,等. 一種基于時(shí)間片的搶占控制模型[J]. 東北大學(xué)學(xué)報(bào)(自然科學(xué)版),2009,11:1570-1573.
[14] 陳 俐,殷承良. 基于混合定時(shí)調(diào)度的車輛AMT 控制系統(tǒng)的實(shí)時(shí)性分析[J]. 上海交通大學(xué)學(xué)報(bào),2008,41(2):256-261.
[15] 郭占社,孟永鋼,蘇才鈞. 基于Windows 的精確定時(shí)技術(shù)及其在工程中的應(yīng)用[J]. 哈爾濱工業(yè)大學(xué)學(xué)報(bào),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.