總網頁瀏覽量

2020年2月15日 星期六

【使用STM32CubeIDE進行STM32 MCU軟韌體開發】CMSIS-OS wrapping layer和FreeRTOS之thread優先權號碼之對應與互轉



  • 簡介:

當我們使用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的優先權號碼(-33),是對應到FreeRTOS06(configMAX_PRIORITIE-1,而在FreeRTOSConfig.h內的configMAX_PRIORITIES預設是7,所以號碼就是06)

關於這方面的互轉實作,可以參考cmsis_os.c makeFreeRtosPriority()makeCmsisPriority() 這兩隻函數即可看出來(前者的作用就是就是將CMSISthread優先權號碼轉為FreeRTOS的優先權號碼。而後者的作用就是與前者相反)

makeFreeRtosPriority和makeFreeRtosPriority API

這邊舉個實際例子例如CMSIS層的優先權3,在makeFreeRtosPriority函式裡面就會去減掉-3 (由程式碼裡面的priority - osPriorityIdle可得知,這邊的priority3,而osPriorityIdle從上面介紹過的cmsis_os.h中的宣告是-3),而3-3會得到6,可以簡單地從這些資訊判斷CMSIS層的優先權號碼3,其實是對應到FreeRTOS的優先權號碼6

再舉另一個例子如果CMSIS層的優先權號碼-3,就會對應到FreeRTOS的優先權號碼0,因為-3減-3會得到0。其餘號碼皆以此類推


而理所當然地,osThreadCreate()的內容中,會去呼叫到makeFreeRtosPriority(),以此完成CMSISthread優先權號碼與FreeRTOS thread優先權號碼的轉換對應


osThreadCreate API


所以總結一下,下表為CMSISFreeRTOS優先權號碼對照表






另外,最後也將osThreadDefosThread以及 os_thread_def struct貼出來供參考

osThreadDef




os_thread


 os_thread_def  struct


【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

沒有留言:

張貼留言