?

基于STM32的多任務系統的設計與實現

2021-09-08 00:55趙宇科高紅亮胡惠敏李小玲
關鍵詞:開發板多任務按鍵

趙宇科,高紅亮,胡惠敏,李小玲

(湖北師范大學 電氣工程與自動化學院,湖北 黃石 435002)

0 引言

當今的單片機種類繁多,發展頗為迅速。而傳統的單片機雖然功能完備,但效率偏低,不適用于多任務系統的研發。多任務系統較單任務系統而言,宏觀上可同時執行多個任務,但微觀上CPU在一段時間內只處理一個任務[1]。目前,多任務處理機制已經成為微控制器的一個基本功能需求。為研究多任務系統的設計,需要選用一款操作簡單、性能強大的微控制器。STM32是當今主流的微控制器之一,其運行效率高且能耗較低,故本系統基于STM32進行分析和設計[2]。多任務系統可以給用戶良好的體驗感,在一定程度上滿足用戶的需求,故基于STM32實現多任務機制有重要意義。

1 系統設計

在STM32上移植μC/OS-II操作系統后,用戶可以在STM32上進行多任務系統的設計開發。μC/OS-II作為應用軟件運行的平臺,用于調度各個任務和協調任務之間的通信[3]。本系統的設計過程主要包括建立項目工程模板、配置LED和按鍵的GPIO、移植μC/OS-II、編寫項目代碼。

本系統使用Keil μVision 5作為編程軟件建立工程模板。建立項目時需要注意一些細節。例如,計算機硬件的物理層面和Keil軟件的邏輯層面應同時建立對應的文件和正確的文件目錄;文件路徑的正確性;程序的簡潔性。

GPIO是最基本的一類I/O,其每個I/O端口可并行傳輸數據。STM32數據手冊中包含了每個I/O特性的詳細說明,據此,可使用Keil5將GPIO配置為多種功能模式。使用GPIO_Configuration函數可以配置GPIO,其中定義結構體變量用以描述GPIO的功能。

μC/OS-II操作系統占用空間小,但性能強大?;谶@樣的系統,開發人員將屏蔽硬件底層代碼,用高級程序設計語言編寫代碼,從而提高開發效率。μC/OS-II可按某種策略合理地切換各個任務,使CPU在執行多個任務時效率更高。μC/OS-II根據用戶編寫的程序對任務進行調度,改變任務的狀態。多任務的任務狀態轉換圖如圖1所示。

圖1 任務狀態轉換圖

2 實例系統實現

本系統由C語言程序編寫,設計3個LED任務,以3個LED的閃爍狀態來模擬多任務的管理。其中1號、2號LED用于系統的驗證,3號LED作為對照。系統設計的結果通過LED能直觀表現,即LED的狀態間接反映任務的狀態,包括任務的創建、掛起、刪除和恢復[4]。同時,設計KEY任務,使STM32開發板上的按鍵與這些狀態分別對應。

2.1 建立項目工程

STM庫函數功能齊全,內容豐富,需要在建立項目工程時引入庫函數文件。這些文件使程序的設計更加便捷,只需編寫USER文件夾中的main.c文件即可。其中,main.c的部分代碼如下:

Delay_Init ();

RCC_Configuration();

程序運行時,主函數執行Delay_Init函數。在移植了μC/OS-II的前提下,該函數會初始化μC/OS-II的時鐘節拍,一般設置為系統時鐘的1/8.RCC_Configuration函數初始化系統時鐘。

2.2 配置GPIO和移植μC/OS-II

在工程模板的基礎上直接編寫程序,配置GPIO.為了提高微處理器的執行效率,不在未使用的端口上配置時鐘。在庫文件中添加.c文件后,要在STM32的配置文件中聲明對應的.h文件。配置時要注意,在初始化GPIO時,先聲明GPIO結構體變量,再使能I/O端口時鐘,最后配置端口方向和時鐘頻率[5]。

μC/OS-II的系統文件要保證其正確性和完整性,成功移植μC/OS-II的關鍵在于項目文件[6,7]。在物理層面導入μC/OS-II的系統文件后,需要在工程項目中新加入三個組,分別為uCOS-II/CONFIG、uCOS-II/PORT、uCOS-II/CORE.每組加入指定的文件并設置文件路徑,最后加入中斷文件。Keil 5中項目新建組的邏輯層面文件結構如圖2所示。

圖2 新建組的邏輯層面文件結構

2.3 設計多任務程序

設計μC/OS-II多任務程序的三個關鍵操作包括:給定任務的優先級別、設置任務的堆棧大小和創建任務的堆??臻g。在設置任務優先級別和堆棧時,均使用#define定義一個標識符來表示常量。這樣定義的常量不會占用資源,它只是一個標識,用于標記優先級高低和堆棧大小。μC/OS-II可供使用的優先級別有62個,即優先級從高到低排序有0至61.

主函數的程序流程圖如圖3所示。其開始部分初始化延遲函數和系統時鐘,并配置LED和按鍵的GPIO.LED的GPIO函數聲明結構體變量,配置管腳和傳輸速度。按鍵的GPIO函數與之類似[8]。此外,定義LED的GPIO模式為推挽輸出,按鍵的GPIO模式為上拉輸入。OSInit函數初始化μC/OS-II,OSTaskCreate函數聲明指向任務代碼的指針和分配給任務堆棧的棧頂指針,隨后分配該任務的優先級。編程時,OSTaskCreate函數參數列表中的start_task用于創建三個LED任務和KEY任務。主函數在最后調用OSStart函數啟動操作系統。OSTaskCreate函數的參數列表如下:

OSTaskCreate(start_task, (void *)0,

(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],

START_TASK_PRIO);

start_task函數初始化統計任務,并標記任務進入臨界區。進入臨界區的任務只有在退出臨界區后才可以被中斷打斷。使用start_task函數創建KEY任務和每個LED任務時,與上文類似,也需要OSTaskCreate函數聲明任務代碼指針和任務堆棧的棧頂指針,并指定優先級別。這里假定任務的優先級均相同。start_task函數的程序流程圖如圖4所示。

圖3 主函數程序流程圖

定義STM32開發板上的按鍵分別為復位鍵、刪除鍵、掛起鍵和恢復鍵。新建一個表示按鍵的key.c文件,在文件中定義KEY任務函數key_task,其中對每個按鍵均編寫條件判斷語句。例如,若停止1號LED的閃爍,則要掛起LED1任務,執行的條件判斷代碼如下:

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET){

OSTaskSuspend(LED1_TASK_PRIO); }

OSTaskSuspend 函數將無條件掛起LED1任務,其參數列表為被掛起任務的優先級。LED1任務被掛起后,系統將重新對任務進行調度,CPU優先運行下一個優先級別最高的任務。這里要注意,當LED1任務被掛起時,只有其他任務才可以喚醒LED1任務。

OSTaskResume函數將喚醒已經被掛起的任務。若需要恢復LED1任務,則按下開發板上的恢復鍵。程序判斷恢復鍵所對應的條件語句為真時,由當前任務調用OSTaskResume(LED1_TASK_PRIO)以恢復LED1任務。此時1號LED開始閃爍,LED1任務恢復。條件判斷的代碼如下:

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==Bit_RESET){

OSTaskResume(LED1_TASK_PRIO); }

若在本系統中刪除一個任務,則需要該任務自己刪除自己。OSTaskDelReq和OSTaskDel函數均可刪除一個任務,但二者有很大區別。例如,若按下刪除鍵刪除LED2任務,即利用key_task函數直接調用OSTaskDel函數來刪除LED2任務,則LED2任務所占用的資源將不會被釋放。這會使內存使用率下降,浪費系統的資源。解決這一問題的合理方法是,在按下刪除鍵后,key_task函數調用OSTaskDelReq函數來請求LED2任務刪除它自己。當CPU執行到LED2任務時,程序將判斷是否存在一個OSTaskDelReq請求。若存在該請求,則調用OSTaskDel函數來徹底刪除自己,并釋放已占用的資源和內存。若不存在該請求,則LED2任務正常執行。LED2任務led2_task代碼如下:

void led2_task(void *pdata){

pdata=pdata;

while(1){

if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ){

OSTaskDel(OS_PRIO_SELF); }

//LED2任務代碼塊

}

}

2.4 運行程序和驗證

現運行本系統的程序并驗證上述實例。按下STM32開發板上的復位鍵,系統自動創建3個LED進程,3個LED均保持同步的閃爍,這代表系統已經初始化,可以開始驗證。驗證環節把3號LED作為參照,用按鍵對1、2號LED進行試驗。按下掛起鍵后,系統掛起LED1任務,此時開發板上的1號LED熄滅,其余兩個LED保持同步閃爍。按下恢復鍵,LED1任務恢復,并可以獲取CPU的執行權。此時1號LED雖恢復閃爍,但與其余兩個不同步。按下刪除鍵,2號LED熄滅,這表示LED2任務刪除了它自己并釋放了已占用的資源和內存。按下恢復鍵,LED2開始閃爍,此時3個LED的閃爍均不同步。而這種不同步現象發生的原因是,此前在每個LED任務中均設計了延遲時間為1秒的延遲函數,當某個LED任務被中斷后又再次被CPU執行時,LED會發生閃爍不同步的現象。

上述實例的系統文件完整,所有代碼在編譯時未出現警告或異常。程序在STM32開發板上可正常運行,每個LED在按鍵控制下均可以按預期正常工作,實現了多任務系統的分析和設計。

3 結語

基于STM32微處理器和μC/OS-II操作系統,本文分析了多任務系統的設計原理,研究了設計過程中的一些關鍵問題,實現了一個多任務程序系統。該系統使原本抽象的任務管理可以通過LED狀態的改變而直觀表現出來。系統文件結構清晰,程序使用C語言編寫,代碼簡潔,可讀性高,是分析多任務系統的良好實例。同時,可以設計其他類型的任務來替換這些LED任務,使系統更加靈活,更具可移植性、可擴展性。

猜你喜歡
開發板多任務按鍵
數字時代的注意困境:媒體多任務的視角*
結合自監督學習的多任務文本語義匹配方法
基于有限狀態機的按鍵檢測程序設計
面向多任務的無人系統通信及控制系統設計與實現
基于STM32H7的FDCAN通信系統設計與實現?
多按鍵情況下,單片機端口不足的解決方法
按鍵消抖在單片機和FPGA實驗教學中的應用
淺析單片機開發板的設計與制作
基于Reworks操作系統的信息交互軟件設計
一種多方向導光按鍵結構設計
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合