嵌入式軟件實現(xiàn)定時器的兩種方式
簡介
在一般的嵌入式產(chǎn)品設(shè)計中,介于成本、功耗等,所選型的MCU基本都是資源受限的,而里面的定時器的數(shù)量更是有限。在我們軟件設(shè)計中往往有多種定時需求,例如脈沖輸出、按鍵檢測、LCD切屏延時等等 ,我們不可能讓每一個定時業(yè)務(wù)都去開一個硬件定時器,一來硬件資源可能不足,二來會使軟件過度依賴于硬件平臺,從而導(dǎo)致較差的可移植性。
如果我們有一個軟件定時器,所有定時業(yè)務(wù)都依賴于軟件定時器,不僅節(jié)省硬件資源,以后在移植的時候也只需要將軟件定時器和硬件相關(guān)的部分修改就行了,其他部分都不用動。
軟件定時器實現(xiàn)方式:
一、用結(jié)構(gòu)體數(shù)組的方式實現(xiàn)軟件定時器
用結(jié)構(gòu)體數(shù)組的方式實現(xiàn)起來較簡單,也容易理解,除此之外與之后的鏈表實現(xiàn)方式比起來沒有其他優(yōu)點。
但還是介紹一下實現(xiàn)方法:在結(jié)構(gòu)體數(shù)組內(nèi)定義一個start標(biāo)志和定時時長duration,還有一個為計數(shù)值count,這3個變量為最基本的3個變量,其他的可以自己補充,比如運行模式、回調(diào)函數(shù)指針等。還有就是每一個結(jié)構(gòu)體數(shù)組就是一個定時器,需要我們提前定義好這個結(jié)構(gòu)體數(shù)組有多大。
定義好之后,在開啟定時器的時候我們將對應(yīng)的數(shù)組內(nèi)start標(biāo)志置位,在硬件tick中斷服務(wù)函數(shù)里面我們?nèi)ゲ樗薪Y(jié)構(gòu)體數(shù)組內(nèi)的start標(biāo)志是否置位,當(dāng)查到當(dāng)前start被置位時,將此數(shù)組內(nèi)的duration和count做比較,如果相等就說明此定時器定時時間到了,如果不等就將count++,然后接著查其他數(shù)組的start標(biāo)志,以此無限循環(huán)。
此種方式缺點非常明顯,那就是在硬件tick中斷服務(wù)函數(shù)內(nèi),我們得輪詢所有數(shù)組,如果我們軟件業(yè)務(wù)需求是20個定時任務(wù),那我們就得在軟件定時器的實現(xiàn)里定義20個數(shù)組,空間浪費倒是其次的,關(guān)鍵是硬件tick輪詢的數(shù)組越多,執(zhí)行到某個數(shù)組的時間就越長,若以后有50個、100個定時需求時,將會導(dǎo)致定時時間極不精準(zhǔn)。
二、用鏈表實現(xiàn)軟件定時器
介于以上用結(jié)構(gòu)體數(shù)組實現(xiàn)軟件定時器的種種缺點,我們提出改進方案。經(jīng)過分析,在大多數(shù)定時業(yè)務(wù)中,往往只需要在某個時間段定時一次,也就是說定時器會開啟定時和結(jié)束定時,當(dāng)然,用數(shù)組的實現(xiàn)的定時器也可以開啟定時和關(guān)閉定時,只需要用start標(biāo)志去決定就行了,但是用數(shù)組實現(xiàn)的方式中,即使你關(guān)閉了定時器,也就是去掉了start標(biāo)志,此定時器雖然不運行了,但是數(shù)組的空間不會減少,硬件 tick依然要輪詢所有數(shù)組。
所以我們需要用鏈表來實現(xiàn)軟件定時器,在硬件tick中輪詢所有節(jié)點,開啟一個定時器就加入一個節(jié)點,關(guān)閉定時器就刪除一個節(jié)點,可以保證在當(dāng)前時刻只輪詢需要定時的節(jié)點,可以極大的保證定時準(zhǔn)確性。
在加上可以讓用戶選擇定時時間到了直接在硬件tick內(nèi)執(zhí)行或者在硬件tick內(nèi)置標(biāo)志,然后在while循環(huán)內(nèi)排隊執(zhí)行,可以非常有效的解決關(guān)鍵業(yè)務(wù)定時不精準(zhǔn)的問題,比如脈沖輸出這種需要定時準(zhǔn)確的業(yè)務(wù)。
鏈表實現(xiàn)方式
H文件:
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??


C文件:
結(jié)構(gòu)體實現(xiàn)方式
最后在附上用結(jié)構(gòu)體數(shù)組實現(xiàn)的軟件定時器以作參考。
H文件:
C文件:
原文作者:一起學(xué)嵌入式
