目錄
一、STM32CubeIDE使用內(nèi)置的FreeRTOS
二、創(chuàng)建使用FreeRTOS系統(tǒng)的STM32CubeIDE工程
三、使用FreeRTOS功能
四、編譯及測試
一、STM32CubeIDE使用內(nèi)置的FreeRTOS
??????? 不同于STM32CubeIDE使用像RTThread這些第三方物聯(lián)網(wǎng)系統(tǒng),STM32CubeIDE在安裝時就已經(jīng)在MiddleWare中間件一欄直接支持了FreeRTOS操作系統(tǒng)。
??????? 既然STM32CubeIDE已經(jīng)把FreeRTOS深度整合到了自家的系統(tǒng)中,所以移植及使用FreeRTOS變得非常方便。STM32CubeMX圖形配置界面的MiddleWare一欄,可以設(shè)置FreeRTOS是否開啟來使用該實時系統(tǒng)。
二、創(chuàng)建使用FreeRTOS系統(tǒng)的STM32CubeIDE工程
??????? 本文是基于STM32L496VGT3的MCU芯片創(chuàng)建一個新的STM32工程“stm32L496VGT3_CMSIS_OS_V1”,并使用FreeRTOS系統(tǒng)前,已經(jīng)開啟了lpusart串口通信及三個LED的GPIO_OUTPUT接口,及實現(xiàn)了串口lpusart及LED燈驅(qū)動(關(guān)于這邊部分設(shè)置及實現(xiàn)就略過,讀者可以參考本專欄的其他博文)。
??????? 現(xiàn)雙擊(.ioc)文件進入cubeMX圖像配置界面,開啟使用FreeRTOS系統(tǒng)。在MiddleWare中間件一欄,選擇FreeRTOS,在右邊Interface下來框,會出現(xiàn)Disable、CMSIS_V1和CMSIS_V2三個選項。本文選擇CMSIS_V1進行測試。
???????? 關(guān)于CMSIS_V1和CMSIS_V2的不同,詳見CMSIS ARM官方關(guān)于微控制器軟件接口標準CMSIS定義(如下圖)。Cortex微控制器軟件接口標準(CMSIS)是獨立于供應商的硬件抽象層,用于基于Arm Cortex處理器的微控制器,并且CMSIS提供了到處理器和外圍設(shè)備,實時操作系統(tǒng)以及中間件組件的接口。不同之處簡單來說,v1使得軟件能夠在不同的實時操作系統(tǒng)下運行(屏蔽不同RTOS提供的API的差別),而v2則是拓展了RTOS v1,兼容更多的CPU架構(gòu)和實時操作系統(tǒng),說白話就是,CMSIS_V2是在CMSIS_V1上,兼容CMSIS_V1的,具有更多功能及支持更多硬件型號。
???????? 點擊保存或生成代碼按鈕,會彈出下面對話框:
???????? 這是關(guān)于freertos暴露給用戶的API接口并不是原生的freertos接口,是經(jīng)過cmsis-rtos進行一次包裝之后的,在使用timebase源是有所沖突,編譯器會建議你把timebase源切換到非systick。這是因為freertos的調(diào)度時鐘是強制性使用systick的并且systick的中斷優(yōu)先級被設(shè)置為最低。
??????? 而hal 庫需要使用到的tick計數(shù)源,HAL標準庫有很多有超時功能的函數(shù)接口都用到這個hal timebase。所以編輯器在生成代碼時候就強烈建議hal timebase和freertos 使用的systick不要共用。systick已經(jīng)被強制為最低優(yōu)先級,hal timebase用的話就可能產(chǎn)生計數(shù)不準的情況。
??????? 至于systick已經(jīng)被強制為最低優(yōu)先級,是因為freertos是一個嵌入式實時操作系統(tǒng),要確保中斷能夠立馬得到響應,就要把調(diào)度器的時鐘優(yōu)先級設(shè)置為最低就不會影響其他外設(shè)中斷的及時響應。在一旦在stm32cubemx中勾選了freertos后,systick的優(yōu)先級自動被設(shè)置為最低。
??????? freertos還有個配置優(yōu)先級選項:configMAX_SYSCALL_INTERRUPT_PRIORITY高于該配置的優(yōu)先級中斷中都不能調(diào)用freertos的任何API,但是同時他也不會受freertos的內(nèi)核影響而可以得到最實時的響應。如果在中斷服務函數(shù)中需要使用freertos的API接口函數(shù)的話就要把該中斷的優(yōu)先級配置為小于或等于 configMAX_SYSCALL_INTERRUPT_PRIORITY。
????????在stm32L0系列單片機的優(yōu)先級一共有四個等級:0-3,0為最高優(yōu)先級3為最低。使用freertos以后sytick就在該等級。把 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 配置為2,這樣特別實時的中斷優(yōu)先級就可以配置為0或者1,而正常需要調(diào)用freertos API的中斷就可以配置為2或者3優(yōu)先級。
??????? 現(xiàn)在按編輯器建議,去修改開啟USE_NEWLIB_REENTRANT
?????????同時調(diào)整HAL TimeBase設(shè)置更換TimeBase源。
???????? 再次點擊保存,編輯器就無告警彈出,生成代碼后,關(guān)于FreeRTOS生成代碼如下:
???????? 并在main,c主函數(shù)文件中,給出了關(guān)于FreeRTOS最簡要的調(diào)用代碼。
???????? 并能編譯通過。
三、使用FreeRTOS功能
??????? 現(xiàn)在再次回到cubeMX圖形編輯界面,進入FreeRTOS配置的任務與隊列配置頁面,添加一個LedTask(閃燈任務),修改任務名為LEDTask,修改Function名為LEDTaskFunc,注意任務名和Function名不能一樣,其他保持默認。
???????? 關(guān)于NewTask幾個屬性欄:
- ????????Task Name: 設(shè)置任務的名稱,它會基于此名字建立一個指向任務的句柄
- ????????Priority: 設(shè)置任務的優(yōu)先級,高優(yōu)先級的任務會搶占低優(yōu)先級的任務
- ????????Stack Size: 設(shè)置任務棧的大小,用于儲存任務相關(guān)的變量,關(guān)于堆棧詳細內(nèi)容請參考
- ????????Entry Function:設(shè)置任務的入口函數(shù),這個函數(shù)便是開發(fā)者實現(xiàn)任務功能的地方
- ????????Code Generation Option: IDE自動生產(chǎn)初始代碼的選項,這里選擇默認設(shè)置
- ????????Parameter: 傳遞給任務的參數(shù)
- ????????Allocation: 選擇動態(tài)的話是生成在堆中,選擇靜態(tài)的話則生成在靜態(tài)區(qū)
- ????????Buffer Name和ControlBlock Name:在Allocation選擇靜態(tài)時生效。
??????? 配置好這個LedTask后,保存生成輸出代碼,去FreeRTOS的用戶可編譯源文件freertos.c中,找到LEDTaskFunc函數(shù),這就是我們在cubeMX圖形界面配置的任務入口,可以在這里修改實現(xiàn)自己任務內(nèi)容。
???????? 例如本文在源碼文件引入"../../ICore/led/led.h"驅(qū)動頭文件,該LEDTaskFunc函數(shù)循環(huán)體內(nèi)加上閃燈功能Toggle_led0()。
???????? 關(guān)于LEDTaskFunc函數(shù)調(diào)用,在主函數(shù)中初始化先調(diào)用FreeRTOS初始化API:“MX_FREERTOS_Init()”,然后在調(diào)用osKernelStart()啟用。MX_FREERTOS_Init函數(shù)是圖形配置生成的,在freertos.c文件中。另外為了防止主函數(shù)循環(huán)一直占用資源,調(diào)用一個延時HLA_Delay(100),防止LEDTaskFunc函數(shù)循環(huán)搶不到資源。
四、編譯及測試
??????? 【1】進入項目屬性設(shè)置頁面,配置工程輸出文件格式支持。
???????? 【2】配置程序運行按鈕下來列表,點擊“運行配置”,新建一個配置選項,默認配置即可,選擇串口支持格式?;蛘卟捎闷渌麩龑懝ぞ邔崿F(xiàn)。
???????? 本文開發(fā)板支持ST-Link加載。
???????? 【3】點擊運行按鈕,完成編譯下載
???????? 【4】觀察效果,只有LED0在閃爍,而代碼實現(xiàn)中只有在LEDTaskFunc函數(shù)循環(huán)中調(diào)用了Toggle_led0(),說明FreeRTOS系統(tǒng)已經(jīng)被正確使用:
CubeIDE調(diào)用FreeRTOS實現(xiàn)閃燈任務-CSDN直播
?補充,不好意思,忘了自己等級不夠,放不了視頻,給出圖片效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-651246.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-651246.html
到了這里,關(guān)于STM32CubeIDE開發(fā)(二十九), 如何結(jié)合FreeRTOS開發(fā)STM32程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!