- 簡介:
當我們使用STM32Cube IDE進行STM32 MCU的軟韌體開發時
若有透過STM32CubeMX工具勾選FreeRTOS
則STM32Cube IDE將會自動產生(長出)結合了ARM CMSIS介面層與third party RTOS(我們目前的狀況下就是FreeRTOS)的code出來,加入到我們的MCU開發專案檔中
本文將要介紹的code基本上都是由STM32Cube IDE所自動生成的code,將會追蹤一下這篇文章主題所要追蹤的一個小小部分的source code
而關於這方面的一些較詳細的部分,例如何謂CMSIS,與third party RTOS之間的關係為何? 未來應該會再另寫文章作介紹,若有興趣的讀者可先參考ST官方文件: UM1722 User manual- Developing applications on STM32Cube with RTOS 以及下方於此ST官方文件中的架構圖
CMSIS-RTOS Architecture(圖片來源: ST官方文件) |
而這篇文章的重點會放在有關於CMSIS-OS wrapping layer(以下簡稱CMSIS)和FreeRTOS的task優先權號碼之對應與互轉相關的部分
基本上內容簡單,所以適合在BLOG將追蹤過程大致寫出來(技術過程太複雜的文章不太適合用BLOG寫)
註: 本例是用CMSIS-RTOS V1來實驗的 (現在已經有V2了)
---------------------
- 本文重點:
當我們在屬於應用程式層的main.c裡面,要藉由CMSIS API創建thread(在FreeRTOS裡面稱作task)時,會需要指定優先權。例如osPriorityHigh或osPriorityNormal即為列舉(enum)內的常數元素項目的名稱(而此數這個常數就是優先權號碼)
osThreadDef 的第三個參數即為優先權號碼 |
而實際關於這部分的列舉型態宣告之內容如下圖:
osPriority enum declaration in cmsis_os.h |
也就是關於我們在STM32Cube with CMSIS & FreeRTOS環境下的CMSIS創建thread時所指定的 -3到3這樣的7個優先權號碼,是CMSIS_OS這層介面所宣告制定的
這時有或許有些接觸過FreeRTOS的人就會有疑問,FreeRTOS的優先權號碼,不是從0(the lowest priority)到configMAX_PRIORITIES - 1 嗎(the highest priority, 預設是6)嗎? 這之間如何對應呢?
FreeRTOSConfig.h |
實際上,CMSIS的優先權號碼(-3到3),是對應到FreeRTOS的0到6(configMAX_PRIORITIE-1,而在FreeRTOSConfig.h內的configMAX_PRIORITIES預設是7,所以號碼就是0到6)
關於這方面的互轉實作,可以參考cmsis_os.c 的makeFreeRtosPriority()和makeCmsisPriority() 這兩隻函數即可看出來(前者的作用就是就是將CMSIS的thread優先權號碼轉為FreeRTOS的優先權號碼。而後者的作用就是與前者相反)
makeFreeRtosPriority和makeFreeRtosPriority API |
這邊舉個實際例子: 例如CMSIS層的優先權3,在makeFreeRtosPriority函式裡面就會去減掉-3 (由程式碼裡面的priority - osPriorityIdle可得知,這邊的priority是3,而osPriorityIdle從上面介紹過的cmsis_os.h中的宣告是-3),而3減-3會得到6,可以簡單地從這些資訊判斷CMSIS層的優先權號碼3,其實是對應到FreeRTOS的優先權號碼6。
再舉另一個例子: 如果CMSIS層的優先權號碼-3,就會對應到FreeRTOS的優先權號碼0,因為-3減-3會得到0。其餘號碼皆以此類推
而理所當然地,osThreadCreate()的內容中,會去呼叫到makeFreeRtosPriority(),以此完成CMSIS的thread優先權號碼與FreeRTOS thread優先權號碼的轉換對應
osThreadCreate API |
osThreadDef os_thread |
os_thread_def struct |
【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章】
沒有留言:
張貼留言