【教程】STM32 FreeRTOS實時系統(tǒng)移植系列3:FreeRTOS 計數(shù)型信號量

寫在前面:
?
本文章為《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單片機(jī)。
針對FS-MP1A開發(fā)板,除了FreeRTOS操作系統(tǒng)篇外,還包括其他多系列教程,包括Cortex-A7開發(fā)篇、Cortex-M4開發(fā)篇、擴(kuò)展板驅(qū)動移植篇、Linux應(yīng)用開發(fā)篇、Linux系統(tǒng)移植篇、Linux驅(qū)動開發(fā)篇、硬件設(shè)計篇、人工智能機(jī)器視覺篇、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計數(shù)型信號量
2.1.計數(shù)型信號量簡介
計數(shù)型信號量也叫做數(shù)值信號量,相當(dāng)于數(shù)值大于1的隊列,用戶不需要關(guān)心其中存儲了什么數(shù)據(jù),只需要關(guān)心是否為空即可,其主要用于事件計數(shù)和資源管理。
2.1.1事件計數(shù)
在這個場合中,每次事件發(fā)生的時候就在事件處理函數(shù)中釋放信號量(增加信號量的計數(shù)
值),其他任務(wù)會獲取信號量(信號量計數(shù)值減一,信號量值就是隊列結(jié)構(gòu)體成員變量
uxMessagesWaiting)來處理事件。在這種場合中創(chuàng)建的計數(shù)型信號量初始計數(shù)值為 0。
2.1.2資源管理
在這個場合中,信號量值代表當(dāng)前資源的可用數(shù)量,比如房間內(nèi)當(dāng)前剩余的座位數(shù)量。
一個任務(wù)要想獲得資源的使用權(quán),首先必須獲取信號量,信號量獲取成功以后信號量值就會減一。當(dāng)信號量值為 0 的時候說明沒有資源了。當(dāng)一個任務(wù)使用完資源以后一定要釋放信號量,釋放信號量以后信號量值會加一。在這個場合中創(chuàng)建的計數(shù)型信號量初始值應(yīng)該是資源的數(shù)量,比如房間內(nèi)一共有 50 個座位,那么創(chuàng)建信號量的時候信號量值就應(yīng)該初始化為 50。
2.2.計數(shù)型信號量函數(shù)
2.2.1 創(chuàng)建信號量
同二值信號量一樣,若想使用,必須先要創(chuàng)建信號量,在新版FreeRTOS中,一般使用xSemaphoreCreateCounting()函數(shù)動態(tài)創(chuàng)建計數(shù)型信號量。此函數(shù)是個宏,其函數(shù)原型如下:
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount,
UBaseType_t uxInitialCount)
參數(shù):
uxMaxCount:信號量最大計數(shù)值,當(dāng)信號量值等于此值時釋放信號量就會失敗
uxInitialCount:計數(shù)信號量初始值
返回值:
NULL:計數(shù)型信號量創(chuàng)建失敗
其他值:創(chuàng)建成功的計數(shù)型信號量的句柄
2.2.2 釋放信號量
釋放信號量的函數(shù)與二值信號量相同,具體請參考FreeRTOS二值信號量章節(jié)。
2.2.3獲取信號量
獲取信號量的函數(shù)與二值信號量相同,具體請參考FreeRTOS二值信號量章節(jié)。
2.3.操作實驗
2.3.1實驗設(shè)計
計數(shù)型信號量一般用于事件計數(shù)與資源管理,在本節(jié)實驗中,通過掃描按鍵,當(dāng)按鍵按下時實現(xiàn)信號量的釋放與獲取,可以通過串口來顯示信號量的數(shù)值。
任務(wù)及其功能如下:
StartTask02():掃描KEY1鍵,當(dāng)按鍵按下時,進(jìn)行信號量釋放,順便獲取信號量數(shù)值,通過串口輸出顯示。
StartDefaultTask():掃描KEY2鍵,當(dāng)按鍵按下時,進(jìn)行獲取信號量,順便獲取信號量數(shù)值,同樣通過串口輸出顯示。
正常情況下,每釋放一次信號量,信號量數(shù)值加1,當(dāng)獲取到以后,數(shù)值減1。
2.3.2實驗過程與分析
首先,根據(jù)之前幾章內(nèi)容配置好KEY、UART4,其中將KEY設(shè)置為GPIO_input,按照上一節(jié)配置“FREERTOS”,完成后生成代碼。 在StartDefaultTask() 與StartTask02()中添加代碼如下。
可參考12.3.2章節(jié)進(jìn)行導(dǎo)入已有工程,工程存放路徑【華清遠(yuǎn)見-FS-MP1A開發(fā)資料\02-程序源碼\ARM體系結(jié)構(gòu)與接口技術(shù)\FreeRTOS\2_MP1A-FreeRTOS-COUNT】


實驗結(jié)果如圖所示

當(dāng)按下KEY1鍵時,信號量釋放,信號量會加1,此時按下KEY2鍵時,獲取到信號量以后,信號量的數(shù)量減1。
硬件平臺:華清遠(yuǎn)見FS-MP1A開發(fā)板(STM32MP157)
部分開發(fā)教程下載:加QQ群459754978,群文件里有。
部分視頻課程收看:https://space.bilibili.com/670826565/channel/detail?cid=145472
淘寶購買鏈接:https://item.taobao.com/item.htm?id=622457259672
手機(jī)淘寶分享碼:復(fù)制本行文字打開手淘?T4FPXn3YYJ2?