【教程】STM32 FreeRTOS實時系統(tǒng)移植系列7:FreeRTOS 事件標(biāo)志組

1.寫在前面:
本文章為《STM32MP157開發(fā)教程之FreeRTOS操作系統(tǒng)篇》系列中的一篇,筆者使用的開發(fā)平臺為華清遠(yuǎn)見FS-MP1A開發(fā)板(STM32MP157開發(fā)板)。stm32mp157是ARM雙核,2個A7核,1個M4核,A7核上可以跑Linux操作系統(tǒng),M4核上可以跑FreeRTOS、RT-Thread等實時操作系統(tǒng),STM32MP157開發(fā)板所以既可以學(xué)嵌入式linux,也可以學(xué)stm32單片機。
針對FS-MP1A開發(fā)板,除了FreeRTOS操作系統(tǒng)篇外,還包括其他多系列教程,包括Cortex-A7開發(fā)篇、Cortex-M4開發(fā)篇、擴展板驅(qū)動移植篇、Linux應(yīng)用開發(fā)篇、Linux系統(tǒng)移植篇、Linux驅(qū)動開發(fā)篇、硬件設(shè)計篇、人工智能機器視覺篇、Qt應(yīng)用編程篇、Qt綜合項目實戰(zhàn)篇等。歡迎關(guān)注,更多stm32mp157開發(fā)教程及視頻,可加技術(shù)交流Q群459754978,感謝關(guān)注。
FS-MP1A開發(fā)板詳情介紹:https://item.taobao.com/item.htm?id=622457259672
2.FreeRTOS事件標(biāo)志組
2.1事件標(biāo)志組簡介
從前幾章中我們知道可以用信號量實現(xiàn)同步,但信號量只能實現(xiàn)與單個任務(wù)或中斷之間的同步,當(dāng)某個任務(wù)需要與多個任務(wù)或事件進行同步時,這時候我們可以使用事件標(biāo)志組。
講到事件標(biāo)志組,首先要提到事件位,事件位用來表明某個事件是否發(fā)生,通常用作事件標(biāo)志。比如:從中斷中接收指令需要處理時將某個位(標(biāo)志)置1,當(dāng)處理結(jié)束以后就講這個位(標(biāo)志)置0。
一個事件組就是一組的事件位,事件組中的事件位通過位編號來訪問。
2.2事件標(biāo)志組函數(shù)
2.2.1 創(chuàng)建事件標(biāo)志組
創(chuàng)建事件標(biāo)志組的函數(shù)有兩個,分別如下:
xEventGroupCreate(),此函數(shù)用于動態(tài)創(chuàng)建事件標(biāo)志組,所需要的內(nèi)存通過動態(tài)內(nèi)存管理方法分配,事件標(biāo)志組可用的bits數(shù)取決于宏configUSE_16_BIT_TICKS,當(dāng)此宏為1時,事件標(biāo)志組有8個可用位,當(dāng)為0時有24個可用位。其函數(shù)原型如下:
EventGroupHandle_t xEventGroupCreate( void )
參數(shù):無
返回值:
NULL:事件標(biāo)志組創(chuàng)建失敗。
其他值:創(chuàng)建成功的事件標(biāo)志組句柄。
xEventGroupCreateStatic(),此函數(shù)也用于創(chuàng)建事件標(biāo)志組,所需要的內(nèi)存通過用戶自行分配,其函數(shù)原型如下:
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer )
參數(shù):
pxEventGroupBuffer: 指向一個StaticEventGroup_t類型的變量,用來保存件標(biāo)志組結(jié)構(gòu)體。
返回值:
NULL:事件標(biāo)志組創(chuàng)建失敗。
其他值:創(chuàng)建成功的事件標(biāo)志組句柄。
2.2.2 設(shè)置事件位
設(shè)置事件位包括置1與清零操作,F(xiàn)reeRTOS提供了四個函數(shù)可以設(shè)置事件標(biāo)志組的事件位,分別如下:
在任務(wù)級中將指定事件位清零函數(shù)xEventGroupClearBits(),其函數(shù)原型如下:
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
Const EventBits_t uxBitsToClear)
參數(shù):
xEventGroup: 要操作的事件標(biāo)志組句柄。
uxBitsToClear: 要清除的事件位。
返回值:
任何值: 將指定事件位清零之前的事件組值。
中斷級清零函數(shù)
xEventGroupClearBitsFromISR(),此函數(shù)為xEventGroupClearBits()的中斷版本,只能用于中斷服務(wù)函數(shù)中,其函數(shù)原型如下:
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet )
參數(shù):
xEventGroup: 要操作的事件標(biāo)志組句柄。
uxBitsToSet: 要清除的事件位。
返回值:
pdPASS: 事件位清零成功。
pdFAISE: 事件位清零失敗。
置1函數(shù)xEventGroupSetBits(),此函數(shù)可在任務(wù)級中將指定事件位置1,其函數(shù)原型如下:
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,
Const EventBits_t uxBitsToSet)
參數(shù):
xEventGroup: 要操作的事件標(biāo)志組句柄。
uxBitsToSet: 指定要置1的事件位。
返回值:
任何值: 將指定事件位置1后的事件組值。
中斷xEventGroupSetBitsFromISR(),此函數(shù)為xEventGroupSetBits()的中斷版本,只能用于中斷服務(wù)函數(shù)中,其函數(shù)原型如下:
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet
BaseType_t* pxHigherPriorityTaskWoken)
參數(shù):
xEventGroup: 要操作的事件標(biāo)志組句柄。
uxBitsToSet: 指定要置1的事件位。
pxHigherPriorityTaskWoken: 標(biāo)記退出此函數(shù)以后是否進行任務(wù)切換
返回值:
pdPASS: 事件位置1成功。
pdFAISE: 事件位置1失敗。
2.2.3 獲取事件標(biāo)志組值
FreeRTOS中提供了可以查詢事件標(biāo)志組值的API函數(shù),分別如下:
xEventGroupGetBits(),此函數(shù)用于任務(wù)中獲取當(dāng)前事件標(biāo)志組的值,即各個事件位的值,此函數(shù)是個宏,其函數(shù)原型如下:
EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )
參數(shù):
xEventGroup: 要獲取的事件標(biāo)志組的句柄。
返回值:
任何值: 當(dāng)前事件標(biāo)志組的值。
xEventGroupGetBitsFromISR(),此函數(shù)用于在中斷服務(wù)函數(shù)中獲取當(dāng)前事件標(biāo)志組的值,為函數(shù)xEventGroupGetBits()的中斷版本,此函數(shù)也是個宏,其函數(shù)原型如下:
BaseType_t xEventGroupGetBitsFromISR ( EventGroupHandle_t xEventGroup);
參數(shù):
xEventGroup: 要獲取的事件標(biāo)志組的句柄。
返回值:
任何值: 當(dāng)前事件標(biāo)志組的值。
2.2.4 等待指定是事件位
當(dāng)某個任務(wù)需要與多個事件進行同步時,那么它就需要等待并判斷多個事件位,此時可以調(diào)用函數(shù)xEventGroupWaitBits()完成功能。調(diào)用此函數(shù)以后如果等待的事件位還沒有準(zhǔn)備好的話進入阻塞狀態(tài),直到等待的事件位準(zhǔn)備好或者阻塞時間到達,其函數(shù)原型如下
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFord,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
const TickType_t xTicksToWait )
參數(shù):
xEventGroup: 指定要等待的事件標(biāo)志組。
uxBitsToWaitFord: 指定要等待的事件位。
xClearOnExit: 此參數(shù)要是為pdTRUE的話,那么在退出此函數(shù)之前由參數(shù)
uxBitsToWaitFor所設(shè)置的這些事件位就會清零。如果設(shè)置位pdFALSE
的話這些事件位就不會改變。
xWaitForAllBits: 此參數(shù)如果設(shè)置為 pdTRUE 的話,當(dāng) uxBitsToWaitFord 所設(shè)置的
這些事件位都置 1,或者指定的阻塞時間到的時候函數(shù)
xEventGroupWaitBits()才會返回。當(dāng)此函數(shù)為 pdFALSE 的話,只要
uxBitsToWaitFor 所設(shè)置的這些事件位其中的任意一個置1,或者指
定 的 阻 塞 時 間到 的 話 函 數(shù)xEventGroupWaitBits()就會返回。
返回值:
任何值: 返回當(dāng)所等待的事件位置 1 以后的事件標(biāo)志組的值,或者阻塞時間到。根
據(jù)這個值我們就知道哪些事件位置 1 了。如果函數(shù)因為阻塞時間到而返回的
話這個返回值就不代表任何的含義。
2.3操作實驗
2.3.1實驗設(shè)計
本次設(shè)計通過檢測三個按鍵狀態(tài),設(shè)置事件組中不同事件位,當(dāng)全設(shè)置1之后,所有事件位清零,翻轉(zhuǎn)LED電平。
可參考12.3.2章節(jié)進行導(dǎo)入已有工程,工程存放路徑【華清遠(yuǎn)見-FS-MP1A開發(fā)資料\02-程序源碼\ARM體系結(jié)構(gòu)與接口技術(shù)\FreeRTOS\5_MP1A-FreeRTOS-EVENT】
任務(wù)及其功能如下:
StartTask02(): 等待事件組的所有事件位,若不全為1,則進入阻塞狀態(tài),當(dāng)全設(shè)置為1時,通過翻轉(zhuǎn)LED1電平表示。
StartDefaultTask(): 檢測按鍵狀態(tài),當(dāng)不同按鍵按下時,設(shè)置事件組對應(yīng)事件位。
2.3.2實驗過程與分析
首先,根據(jù)之前幾章內(nèi)容配置好CubeMX,按照上一節(jié)配置“FREERTOS”,完成后生成代碼。 在StartDefaultTask() 與StartTask02()中添加代碼如下。


另外,首先在主函數(shù)中調(diào)用xEventGroupCreate()函數(shù)創(chuàng)建事件標(biāo)志組,獲得事件標(biāo)志組句柄。
當(dāng)KEY1、KEY2、KEY3分別按下時,調(diào)用xEventGroupSetBits()函數(shù)分別將事件標(biāo)志組的bit0、bit1、bit2置1,函數(shù)xEventGroupWaitBits()同時等待標(biāo)志組的bit0、bit1、bit2,當(dāng)這三個事件位都置為1時,才會執(zhí)行任務(wù)中的其他程序。另外調(diào)用函數(shù)xEventGroupGetBits()可以查詢標(biāo)志組EventGroupHandler的值變化,結(jié)果如下所示。

零基礎(chǔ)玩轉(zhuǎn)stm32mp157:ARM Cortex-M4裸機開發(fā)篇(連載中)
硬件平臺:華清遠(yuǎn)見FS-MP1A開發(fā)板(STM32MP157)
部分開發(fā)教程下載:加QQ群459754978,群文件里有。
淘寶購買鏈接:https://item.taobao.com/item.htm?id=622457259672
手機淘寶分享碼:復(fù)制本行文字打開手淘?T4FPXn3YYJ2?