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