国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于STM32的多任務(wù)系統(tǒng)的設(shè)計與實現(xiàn)

2021-09-08 00:55趙宇科高紅亮胡惠敏李小玲
關(guān)鍵詞:開發(fā)板多任務(wù)按鍵

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

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

0 引言

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

1 系統(tǒng)設(shè)計

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

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

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

μC/OS-II操作系統(tǒng)占用空間小,但性能強大。基于這樣的系統(tǒng),開發(fā)人員將屏蔽硬件底層代碼,用高級程序設(shè)計語言編寫代碼,從而提高開發(fā)效率。μC/OS-II可按某種策略合理地切換各個任務(wù),使CPU在執(zhí)行多個任務(wù)時效率更高。μC/OS-II根據(jù)用戶編寫的程序?qū)θ蝿?wù)進行調(diào)度,改變?nèi)蝿?wù)的狀態(tài)。多任務(wù)的任務(wù)狀態(tài)轉(zhuǎn)換圖如圖1所示。

圖1 任務(wù)狀態(tài)轉(zhuǎn)換圖

2 實例系統(tǒng)實現(xiàn)

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

2.1 建立項目工程

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

Delay_Init ();

RCC_Configuration();

程序運行時,主函數(shù)執(zhí)行Delay_Init函數(shù)。在移植了μC/OS-II的前提下,該函數(shù)會初始化μC/OS-II的時鐘節(jié)拍,一般設(shè)置為系統(tǒng)時鐘的1/8.RCC_Configuration函數(shù)初始化系統(tǒng)時鐘。

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

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

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

圖2 新建組的邏輯層面文件結(jié)構(gòu)

2.3 設(shè)計多任務(wù)程序

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

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

OSTaskCreate(start_task, (void *)0,

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

START_TASK_PRIO);

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

圖3 主函數(shù)程序流程圖

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

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

OSTaskSuspend(LED1_TASK_PRIO); }

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

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

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

OSTaskResume(LED1_TASK_PRIO); }

若在本系統(tǒng)中刪除一個任務(wù),則需要該任務(wù)自己刪除自己。OSTaskDelReq和OSTaskDel函數(shù)均可刪除一個任務(wù),但二者有很大區(qū)別。例如,若按下刪除鍵刪除LED2任務(wù),即利用key_task函數(shù)直接調(diào)用OSTaskDel函數(shù)來刪除LED2任務(wù),則LED2任務(wù)所占用的資源將不會被釋放。這會使內(nèi)存使用率下降,浪費系統(tǒng)的資源。解決這一問題的合理方法是,在按下刪除鍵后,key_task函數(shù)調(diào)用OSTaskDelReq函數(shù)來請求LED2任務(wù)刪除它自己。當CPU執(zhí)行到LED2任務(wù)時,程序?qū)⑴袛嗍欠翊嬖谝粋€OSTaskDelReq請求。若存在該請求,則調(diào)用OSTaskDel函數(shù)來徹底刪除自己,并釋放已占用的資源和內(nèi)存。若不存在該請求,則LED2任務(wù)正常執(zhí)行。LED2任務(wù)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任務(wù)代碼塊

}

}

2.4 運行程序和驗證

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

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

3 結(jié)語

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

猜你喜歡
開發(fā)板多任務(wù)按鍵
數(shù)字時代的注意困境:媒體多任務(wù)的視角*
結(jié)合自監(jiān)督學習的多任務(wù)文本語義匹配方法
基于有限狀態(tài)機的按鍵檢測程序設(shè)計
面向多任務(wù)的無人系統(tǒng)通信及控制系統(tǒng)設(shè)計與實現(xiàn)
基于STM32H7的FDCAN通信系統(tǒng)設(shè)計與實現(xiàn)?
多按鍵情況下,單片機端口不足的解決方法
按鍵消抖在單片機和FPGA實驗教學中的應(yīng)用
淺析單片機開發(fā)板的設(shè)計與制作
基于Reworks操作系統(tǒng)的信息交互軟件設(shè)計
一種多方向?qū)Ч獍存I結(jié)構(gòu)設(shè)計