999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2021-09-08 00:55:18趙宇科高紅亮胡惠敏李小玲
關(guān)鍵詞:程序系統(tǒng)設(shè)計

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

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

0 引言

當(dāng)今的單片機種類繁多,發(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是當(dāng)今主流的微控制器之一,其運行效率高且能耗較低,故本系統(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)建、掛起、刪除和恢復(fù)[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]。在物理層面導(dǎo)入μ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ù)的堆??臻g。在設(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ā)板上的按鍵分別為復(fù)位鍵、刪除鍵、掛起鍵和恢復(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ù)。這里要注意,當(dāng)LED1任務(wù)被掛起時,只有其他任務(wù)才可以喚醒LED1任務(wù)。

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

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ù)刪除它自己。當(dāng)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ā)板上的復(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保持同步閃爍。按下恢復(fù)鍵,LED1任務(wù)恢復(fù),并可以獲取CPU的執(zhí)行權(quán)。此時1號LED雖恢復(fù)閃爍,但與其余兩個不同步。按下刪除鍵,2號LED熄滅,這表示LED2任務(wù)刪除了它自己并釋放了已占用的資源和內(nèi)存。按下恢復(fù)鍵,LED2開始閃爍,此時3個LED的閃爍均不同步。而這種不同步現(xiàn)象發(fā)生的原因是,此前在每個LED任務(wù)中均設(shè)計了延遲時間為1秒的延遲函數(shù),當(dāng)某個LED任務(wù)被中斷后又再次被CPU執(zhí)行時,LED會發(fā)生閃爍不同步的現(xiàn)象。

上述實例的系統(tǒng)文件完整,所有代碼在編譯時未出現(xiàn)警告或異常。程序在STM32開發(fā)板上可正常運行,每個LED在按鍵控制下均可以按預(yù)期正常工作,實現(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)更加靈活,更具可移植性、可擴展性。

猜你喜歡
程序系統(tǒng)設(shè)計
Smartflower POP 一體式光伏系統(tǒng)
WJ-700無人機系統(tǒng)
ZC系列無人機遙感系統(tǒng)
北京測繪(2020年12期)2020-12-29 01:33:58
試論我國未決羈押程序的立法完善
瞞天過?!律O(shè)計萌到家
“程序猿”的生活什么樣
連通與提升系統(tǒng)的最后一塊拼圖 Audiolab 傲立 M-DAC mini
設(shè)計秀
海峽姐妹(2017年7期)2017-07-31 19:08:17
有種設(shè)計叫而專
Coco薇(2017年5期)2017-06-05 08:53:16
英國與歐盟正式啟動“離婚”程序程序
主站蜘蛛池模板: 91丝袜美腿高跟国产极品老师| 亚洲国产天堂在线观看| 一级毛片不卡片免费观看| 日本中文字幕久久网站| 美女黄网十八禁免费看| 免费人成网站在线观看欧美| 韩日免费小视频| 性网站在线观看| 自拍偷拍一区| 在线观看视频99| 在线五月婷婷| 国产欧美日韩资源在线观看| 亚洲天天更新| 国产精品55夜色66夜色| 日本a级免费| 日本一区二区不卡视频| 99精品免费在线| 青青草原国产免费av观看| 中文字幕无码制服中字| 久久婷婷六月| 亚洲精品第五页| 日本欧美精品| 亚洲天堂久久| 国产特级毛片| 制服丝袜 91视频| 久久国产黑丝袜视频| 免费观看国产小粉嫩喷水 | 国产剧情国内精品原创| 久久影院一区二区h| 亚洲天堂日韩av电影| 国产欧美精品一区二区| 亚洲欧洲日韩综合| 波多野衣结在线精品二区| 午夜精品久久久久久久无码软件| 热这里只有精品国产热门精品| 欧美日韩成人在线观看| 国产欧美日韩综合一区在线播放| 无码国产偷倩在线播放老年人| 国产偷国产偷在线高清| 亚洲一级毛片免费看| 日韩在线欧美在线| 亚洲视频一区| 在线色国产| 中文字幕不卡免费高清视频| 日韩一二三区视频精品| 欧美亚洲欧美区| 亚洲欧美日韩精品专区| 成人福利在线视频| 国产福利不卡视频| 亚洲国产高清精品线久久| 国产精品中文免费福利| 青青草原国产一区二区| 欧美精品成人| 高潮毛片免费观看| 伊人天堂网| 凹凸精品免费精品视频| 国产精品无码影视久久久久久久| 另类综合视频| 丝袜高跟美脚国产1区| 国产精品亚洲专区一区| 91精品国产自产在线老师啪l| 激情网址在线观看| 国产视频自拍一区| 欧美无专区| 欧美一级夜夜爽www| 亚洲无码高清一区二区| 天天婬欲婬香婬色婬视频播放| 色男人的天堂久久综合| 狠狠做深爱婷婷综合一区| 国产欧美视频综合二区| 九九久久精品免费观看| 免费欧美一级| 久久毛片基地| 日韩在线永久免费播放| 亚洲精品老司机| 扒开粉嫩的小缝隙喷白浆视频| 免费看a级毛片| 国产精品久久久久久久久kt| 欧美三級片黃色三級片黃色1| 国产精品自拍合集| 久久久久亚洲精品无码网站| 日韩无码视频专区|