單片機(jī)多任務(wù)框架設(shè)計(jì)
單片機(jī)應(yīng)用廣泛,內(nèi)部資源搭配豐富。雖然豐儉由人,但是在單片機(jī)選型的時(shí)候,我們往往會(huì)選擇性價(jià)比相對(duì)較高的。選定了單片機(jī),程序設(shè)計(jì)工作量也不小。如何方便快捷的移植、開(kāi)發(fā)調(diào)試以及維護(hù),可以實(shí)現(xiàn)是程序設(shè)計(jì)人員追求的縮短設(shè)計(jì)周期的目標(biāo)。
本文引用地址:http://www.biyoush.com/article/202111/429669.htm1 框架分析
跑系統(tǒng)的單片機(jī)可以更有效支持多任務(wù),完成更加復(fù)雜的任務(wù),但需要更大的存儲(chǔ)空間用于系統(tǒng)程序和用戶程序;裸跑的單片機(jī)只能進(jìn)行單任務(wù),對(duì)存儲(chǔ)空間需求較低。在這里主要研究一種多任務(wù)程序框架設(shè)計(jì),讓裸奔的單片機(jī)跑出操作系統(tǒng)的感覺(jué),單片機(jī)雖然是裸機(jī)奔跑,但是往往現(xiàn)實(shí)的需要決定了我們必須跑出操作系統(tǒng)的姿態(tài)——多任務(wù)程序。
系統(tǒng)實(shí)現(xiàn)多任務(wù),最重要的特點(diǎn)是分時(shí)和消息傳遞與處理。引用一個(gè)網(wǎng)友的總結(jié):stateMachine +timerTick + queue。
queue,在設(shè)計(jì)框架時(shí)需要設(shè)計(jì)一個(gè)消息隊(duì)列貫穿整個(gè)系統(tǒng),把這個(gè)隊(duì)列機(jī)制做成通用模塊,在不同的程序執(zhí)行模塊中調(diào)用。消息隊(duì)列用于緩沖事件,事件不知道什么時(shí)候會(huì)到來(lái),也不能保證來(lái)了就能迅速得到處理,使用消息隊(duì)列,可以保證每個(gè)事件都能處理到。消息通常分為兩種類型:①外部事件收集,然后存儲(chǔ)到隊(duì)列,如按鍵、IO 中斷、時(shí)鐘任務(wù)等硬件發(fā)出;②在任務(wù)處理過(guò)程中,一個(gè)任務(wù)觸發(fā)新的任務(wù),例如在藍(lán)牙遙控器中,接收解析串口數(shù)據(jù)的任務(wù)中發(fā)出按鍵消息。timerTick,系統(tǒng)的時(shí)鐘基準(zhǔn)。用一個(gè)定時(shí)器來(lái)建立通用定時(shí)器任務(wù),管理不同任務(wù)相關(guān)的多個(gè)定時(shí)器,在定時(shí)到達(dá)時(shí),由定時(shí)器任務(wù)發(fā)出消息。
stateMachine,任務(wù)收到消息后,根據(jù)當(dāng)前狀態(tài)決定如何處理消息。
2 框架設(shè)計(jì)
我們以包含按鍵開(kāi)關(guān)一個(gè)定時(shí)1 s 的LED 燈閃爍為例,示例包含框架的全部?jī)?nèi)容。
圖1是程序流程圖。
圖1 程序流程
首先是消息隊(duì)列、時(shí)鐘任務(wù)、消息的定義:
其次是從頂層主程序設(shè)計(jì)開(kāi)始,再到各功能模塊的設(shè)計(jì):
1)頂層主程序設(shè)計(jì),系統(tǒng)開(kāi)始進(jìn)行硬件初始化、任務(wù)初始化、時(shí)鐘初始化;然后在1 個(gè)循環(huán)中不停地進(jìn)行循環(huán)事件收集、時(shí)間事件收集和處理、消息隊(duì)列時(shí)間處理。
2)在時(shí)鐘基準(zhǔn)的設(shè)置上,建立1 個(gè)1 ms 的定時(shí)器,在定時(shí)器中斷里判斷開(kāi)啟的定時(shí)任務(wù)是否發(fā)生,滿足條件設(shè)置定時(shí)標(biāo)志,同時(shí)關(guān)閉此項(xiàng)定時(shí)任務(wù)。
3)循環(huán)事件收集:在循環(huán)中判斷是否有按鍵按下,如有按鍵按下,發(fā)送按鍵消息。
4)時(shí)間事件收集:判斷定時(shí)服務(wù)里設(shè)置的定時(shí)標(biāo)志做相關(guān)的時(shí)間事件處理。
5)消息隊(duì)列處理:判斷消息隊(duì)列是否為空,當(dāng)不為空時(shí)進(jìn)行消息處理。
3 任務(wù)添加
如何根據(jù)實(shí)際應(yīng)用的需要在主體結(jié)構(gòu)中加入新的任務(wù),如下以串口通信為例。
1)添加消息定義:在消息定義enumEventList 里面加入串口功能定義。
2)添加消息收集程序:在串口中斷里接收數(shù)據(jù),并把數(shù)據(jù)寫到串口數(shù)據(jù)緩沖器,在循環(huán)事件收集里面進(jìn)行串口數(shù)據(jù)分析,根據(jù)收到的數(shù)據(jù)完整性和協(xié)議分析,發(fā)出串口功能的消息到消息隊(duì)列。
3)添加消息處理程序:在消息隊(duì)列處理里面加入串口功能對(duì)應(yīng)的處理功能。
4 結(jié)束語(yǔ)
整體看來(lái)我們的程序框架就成了通用的模板了,根據(jù)自己選定的MCU,選個(gè)定時(shí)器,再添加自己的事件收集、事件處理以及時(shí)間任務(wù)即可,非常靈活方便實(shí)用。
參考文獻(xiàn):
[1] 李寧.基于MDK的STM32處理器開(kāi)發(fā)應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2008.
[2] LABROSSE J J.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II[M].邵貝貝,等,譯.北京:北京航空航天大學(xué)出版社,2003.
[3] 孫涵芳,徐愛(ài)卿.MCS-51/96系列單片機(jī)原理與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,1988.
[4] 郭天祥.新概念51單片機(jī)C語(yǔ)言教程:入門、提高、開(kāi)發(fā)、拓展全攻略.北京:電子工業(yè)出版社,2009.
[5] 徐愛(ài)鈞.Keil C51單片機(jī)高級(jí)語(yǔ)言應(yīng)用編程技術(shù).北京:電子工業(yè)出版社,2015.
(本文來(lái)源于《電子產(chǎn)品世界》雜志2021年10月期)
評(píng)論