新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機多任務(wù)框架設(shè)計

單片機多任務(wù)框架設(shè)計

作者:高林,黃敏,羅江(江西方興科技有限公司,南昌 330025) 時間:2021-11-15 來源:電子產(chǎn)品世界 收藏
編者按:單片機將各功能部件集成在一塊芯片上,集成度高,體積小,可以滿足控制和運行的需要。單片機有豐富的輸入輸出管腳,很容易構(gòu)成各種規(guī)模的計算機應(yīng)用系統(tǒng)。鑒于單片機的特點,單片機廣泛應(yīng)用,種類繁多。對應(yīng)不同的單片機系列,簡單可靠的嵌入式程序框架便于開發(fā)、移植以及維護,縮短產(chǎn)品的程序開發(fā)周期。

應(yīng)用廣泛,內(nèi)部資源搭配豐富。雖然豐儉由人,但是在選型的時候,我們往往會選擇性價比相對較高的。選定了,程序設(shè)計工作量也不小。如何方便快捷的移植、開發(fā)調(diào)試以及維護,可以實現(xiàn)是程序設(shè)計人員追求的縮短設(shè)計周期的目標(biāo)。

本文引用地址:http://www.butianyuan.cn/article/202111/429669.htm

1   框架分析

跑系統(tǒng)的單片機可以更有效支持多任務(wù),完成更加復(fù)雜的任務(wù),但需要更大的存儲空間用于系統(tǒng)程序和用戶程序;裸跑的單片機只能進行單任務(wù),對存儲空間需求較低。在這里主要研究一種多任務(wù)程序框架設(shè)計,讓裸奔的單片機跑出操作系統(tǒng)的感覺,單片機雖然是裸機奔跑,但是往往現(xiàn)實的需要決定了我們必須跑出操作系統(tǒng)的姿態(tài)——多任務(wù)程序。

系統(tǒng)實現(xiàn)多任務(wù),最重要的特點是分時和消息傳遞與處理。引用一個網(wǎng)友的總結(jié):stateMachine +timerTick + queue。

queue,在設(shè)計框架時需要設(shè)計一個消息隊列貫穿整個系統(tǒng),把這個隊列機制做成通用模塊,在不同的程序執(zhí)行模塊中調(diào)用。消息隊列用于緩沖事件,事件不知道什么時候會到來,也不能保證來了就能迅速得到處理,使用消息隊列,可以保證每個事件都能處理到。消息通常分為兩種類型:①外部事件收集,然后存儲到隊列,如按鍵、IO 中斷、時鐘任務(wù)等硬件發(fā)出;②在任務(wù)處理過程中,一個任務(wù)觸發(fā)新的任務(wù),例如在藍牙遙控器中,接收解析串口數(shù)據(jù)的任務(wù)中發(fā)出按鍵消息。timerTick,系統(tǒng)的時鐘基準(zhǔn)。用一個定時器來建立通用定時器任務(wù),管理不同任務(wù)相關(guān)的多個定時器,在定時到達時,由定時器任務(wù)發(fā)出消息。

stateMachine,任務(wù)收到消息后,根據(jù)當(dāng)前狀態(tài)決定如何處理消息。

2   框架設(shè)計

我們以包含按鍵開關(guān)一個定時1 s 的LED 燈閃爍為例,示例包含框架的全部內(nèi)容。

圖1是程序流程圖。

image.pngimage.png

圖1 程序流程

首先是消息隊列、時鐘任務(wù)、消息的定義:

image.png

其次是從頂層主程序設(shè)計開始,再到各功能模塊的設(shè)計:

image.png

1)頂層主程序設(shè)計,系統(tǒng)開始進行硬件初始化、任務(wù)初始化、時鐘初始化;然后在1 個循環(huán)中不停地進行循環(huán)事件收集、時間事件收集和處理、消息隊列時間處理。

image.png

2)在時鐘基準(zhǔn)的設(shè)置上,建立1 個1 ms 的定時器,在定時器中斷里判斷開啟的定時任務(wù)是否發(fā)生,滿足條件設(shè)置定時標(biāo)志,同時關(guān)閉此項定時任務(wù)。

image.png

3)循環(huán)事件收集:在循環(huán)中判斷是否有按鍵按下,如有按鍵按下,發(fā)送按鍵消息。

image.png

4)時間事件收集:判斷定時服務(wù)里設(shè)置的定時標(biāo)志做相關(guān)的時間事件處理。

image.png

5)消息隊列處理:判斷消息隊列是否為空,當(dāng)不為空時進行消息處理。

image.png

image.png

image.png

3   任務(wù)添加

如何根據(jù)實際應(yīng)用的需要在主體結(jié)構(gòu)中加入新的任務(wù),如下以串口通信為例。

1)添加消息定義:在消息定義enumEventList 里面加入串口功能定義。

2)添加消息收集程序:在串口中斷里接收數(shù)據(jù),并把數(shù)據(jù)寫到串口數(shù)據(jù)緩沖器,在循環(huán)事件收集里面進行串口數(shù)據(jù)分析,根據(jù)收到的數(shù)據(jù)完整性和協(xié)議分析,發(fā)出串口功能的消息到消息隊列。

3)添加消息處理程序:在消息隊列處理里面加入串口功能對應(yīng)的處理功能。

4   結(jié)束語

整體看來我們的程序框架就成了通用的模板了,根據(jù)自己選定的MCU,選個定時器,再添加自己的事件收集、事件處理以及時間任務(wù)即可,非常靈活方便實用。

參考文獻:

[1] 李寧.基于MDK的STM32處理器開發(fā)應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2008.

[2] LABROSSE J J.嵌入式實時操作系統(tǒng)μC/OS-II[M].邵貝貝,等,譯.北京:北京航空航天大學(xué)出版社,2003.

[3] 孫涵芳,徐愛卿.MCS-51/96系列單片機原理與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,1988.

[4] 郭天祥.新概念51單片機C語言教程:入門、提高、開發(fā)、拓展全攻略.北京:電子工業(yè)出版社,2009.

[5] 徐愛鈞.Keil C51單片機高級語言應(yīng)用編程技術(shù).北京:電子工業(yè)出版社,2015.

(本文來源于《電子產(chǎn)品世界》雜志2021年10月期)



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉