【教程】STM32 FreeRTOS實時系統(tǒng)移植系列2:FreeRTOS 互斥信號量

1.寫在前面:
?
本文章為《STM32MP157開發(fā)教程之FreeRTOS操作系統(tǒng)篇》系列中的一篇,筆者使用的開發(fā)平臺為華清遠見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互斥信號量
2.1 互斥信號量簡介
互斥信號量可以作為一種特殊的二值信號量,優(yōu)先級繼承機制,保護臨界資源。
互斥信號量適合用于那些需要互斥訪問的應(yīng)用中。在互斥訪問中互斥信號量相當(dāng)于一個鑰匙,當(dāng)任務(wù)想要使用資源的時候就必須先獲得這個鑰匙,當(dāng)使用完資源以后就必須歸還這個鑰匙,這樣其他的任務(wù)就可以拿著這個鑰匙去使用資源。
互斥信號量使用和二值信號量相同的 API 操作函數(shù),所以互斥信號量也可以設(shè)置阻塞時間,不同于二值信號量的是互斥信號量具有優(yōu)先級繼承的特性。當(dāng)一個互斥信號量正在被一個低優(yōu)先級的任務(wù)使用,而此時有個高優(yōu)先級的任務(wù)也嘗試獲取這個互斥信號量的話就會被阻塞。不過這個高優(yōu)先級的任務(wù)會將低優(yōu)先級任務(wù)的優(yōu)先級提升到與自己相同的優(yōu)先級,這個過程就是優(yōu)先級繼承。優(yōu)先級繼承盡可能的降低了高優(yōu)先級任務(wù)處于阻塞態(tài)的時間,并且將已經(jīng)出現(xiàn)的“優(yōu)先級翻轉(zhuǎn)”的影響降到最低。
2.2 互斥信號量函數(shù)
2.2.1 創(chuàng)建信號量
在新版FreeRTOS中,一般使用xSemaphoreCreateMutex()函數(shù)動態(tài)創(chuàng)建互斥信號量,其所需要的內(nèi)存通過動態(tài)內(nèi)存管理方法分配。此函數(shù)是個宏,具體創(chuàng)建工程是由函數(shù)xQueueCreateMutex()完成。此函數(shù)原型如下:
SemaphoreHandle_t xSemaphoreCreateMutex(void)
參數(shù): 無
返回值:
NULL:互斥信號量創(chuàng)建失敗
其他值:創(chuàng)建成功的互斥信號量的句柄
2.2.2 釋放信號量
釋放信號量的函數(shù)與二值信號量相同,具體請參考FreeRTOS二值信號量章節(jié)。
2.2.3獲取信號量
獲取信號量的函數(shù)也有兩個,分別如下:
任務(wù)級信號量獲取函數(shù)xSemaphoreTake(),此函數(shù)也是個宏,可以獲取二值信號量、計數(shù)型信號量和互斥信號量,其函數(shù)原型如下:
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,
TickType_t xBlockTime)
參數(shù):
xSemaphore:要獲取的信號量句柄
xBlockTime:阻塞時間
返回值:
pdTRUE:獲取信號量成功
pdFALSE:超時,獲取信號量失敗
中斷級信號量獲取函數(shù) xSemaphoreTakeFromISR(),此函數(shù)也是個宏,只能獲取二值信號量和計數(shù)型信號量,其函數(shù)原型如下:
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,
BaseType_t* pxHigherPriorityTaskWoken)
參數(shù):
xSemaphore:要獲取的信號量句柄
pxHigherPriorityTaskWoken:標(biāo)記退出此函數(shù)以后是否進行任務(wù)切換
返回值:
PdPASS:獲取信號量成功
pdFALSE:獲取信號量失敗
2.3操作實驗
2.3.1實驗設(shè)計
互斥信號量其實就是一個擁有優(yōu)先級繼承的二值信號量,互斥信號量適合用于那些需要互斥訪問的應(yīng)用中。在本節(jié)實驗中,分別控制LED1和LED2燈的亮滅來表示。
任務(wù)及其功能如下:
StartTask02(): 控制LED2熄滅,LED1點亮,延時2秒鐘。
StartDefaultTask(): 控制LED1熄滅,LED2點亮,延時1秒鐘。
2.3.2實驗過程與分析
首先,根據(jù)之前幾章內(nèi)容配置好CubeMX,按照上一節(jié)配置“FREERTOS”,完成后生成代碼。 在主函數(shù)中調(diào)用xSemaphoreCreateMutex()創(chuàng)建互斥信號量,在StartDefaultTask() 與StartTask02()中添加代碼如下。
可參考12.3.2章節(jié)進行導(dǎo)入已有工程,工程存放路徑【華清遠見-FS-MP1A開發(fā)資料\02-程序源碼\ARM體系結(jié)構(gòu)與接口技術(shù)\FreeRTOS\3_MP1A-FreeRTOS-Mutex】

此時會發(fā)現(xiàn),LED1點亮、LED2熄滅狀態(tài)下保持2秒,LED2點亮、LED1熄滅狀態(tài)下保持1秒,進行交替閃爍。
華清遠見教育科技有限公司
開發(fā)板、核心板、資源擴展板及配套海量資料
淘寶直銷店:https://shop273057902.taobao.com/
淘寶企業(yè)店:https://shop533757171.taobao.com/
微信公眾號:華清遠見IT開放實驗室
bilibili:https://space.bilibili.com/670826565
華清遠見官網(wǎng):http://www.fsdev.com.cn/
技術(shù)交流QQ群:459754978(免費提供下載資料)