STM32CubeIDE在stm32開發者起著最基礎的作用,在STM32CubeIDE中配置FreeRTOS中間層時需要選擇interface,其中有三個選項:Disable、CMSIS_V1和CMSIS_V2
CMSIS定義了通用工具接口,并提供一致的設備支持,那么CMSIS_V1和CMSIS_V2有什么區別呢,該怎選擇呢?
微控制器軟件接口標準CMSIS
CMSIS ARM官方定義如下:
Cortex微控制器軟件接口標準(CMSIS)是獨立于供應商的硬件抽象層,用于基于Arm Cortex處理器的微控制器,并且CMSIS提供了到處理器和外圍設備,實時操作系統以及中間件組件的接口,可以說非常實用。
CMSIS軟件接口簡化了軟件重用,減少了開發周期,而且也不受限操作系統的類型,去耦。
不同之處
RTOS v1使得軟件能夠在不同的實時操作系統下運行(屏蔽不同RTOS提供的API的差別)
而RTOS v2則是拓展了RTOS v1,兼容更多的CPU架構和實時操作系統。
RTOS v1創建任務函數如下:
/***********************ThreadManagement*****************************/ /** *@briefCreateathreadandaddittoActiveThreadsandsetittostateREADY. *@paramthread_defthreaddefinitionreferencedwith efosThread. *@paramargumentpointerthatispassedtothethreadfunctionasstartargument. *@retvalthreadIDforreferencebyotherfunctionsorNULLincaseoferror. *@noteMUSTREMAINUNCHANGED:osThreadCreateshallbeconsistentineveryCMSIS-RTOS. */ osThreadIdosThreadCreate(constosThreadDef_t*thread_def,void*argument) { TaskHandle_thandle; #if(configSUPPORT_STATIC_ALLOCATION==1)&&(configSUPPORT_DYNAMIC_ALLOCATION==1) if((thread_def->buffer!=NULL)&&(thread_def->controlblock!=NULL)){ handle=xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(constportCHAR*)thread_def->name, thread_def->stacksize,argument,makeFreeRtosPriority(thread_def->tpriority), thread_def->buffer,thread_def->controlblock); } else{ if(xTaskCreate((TaskFunction_t)thread_def->pthread,(constportCHAR*)thread_def->name, thread_def->stacksize,argument,makeFreeRtosPriority(thread_def->tpriority), &handle)!=pdPASS){ returnNULL; } } #elif(configSUPPORT_STATIC_ALLOCATION==1) handle=xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(constportCHAR*)thread_def->name, thread_def->stacksize,argument,makeFreeRtosPriority(thread_def->tpriority), thread_def->buffer,thread_def->controlblock); #else if(xTaskCreate((TaskFunction_t)thread_def->pthread,(constportCHAR*)thread_def->name, thread_def->stacksize,argument,makeFreeRtosPriority(thread_def->tpriority), &handle)!=pdPASS){ returnNULL; } #endif returnhandle; }
RTOS v2創建任務函數如下:
osThreadId_tosThreadNew(osThreadFunc_tfunc,void*argument,constosThreadAttr_t*attr){ constchar*name; uint32_tstack; TaskHandle_thTask; UBaseType_tprio; int32_tmem; hTask=NULL; if(!IS_IRQ()&&(func!=NULL)){ stack=configMINIMAL_STACK_SIZE; prio=(UBaseType_t)osPriorityNormal; name=NULL; mem=-1; if(attr!=NULL){ if(attr->name!=NULL){ name=attr->name; } if(attr->priority!=osPriorityNone){ prio=(UBaseType_t)attr->priority; } if((prioosPriorityISR)||((attr->attr_bits&osThreadJoinable)==osThreadJoinable)){ return(NULL); } if(attr->stack_size>0U){ /*InFreeRTOSstackisnotinbytes,butinsizeof(StackType_t)whichis4onARMports.*/ /*Stacksizeshouldbetherefore4bytealignedinordertoavoiddivisioncausedsideeffects*/ stack=attr->stack_size/sizeof(StackType_t); } if((attr->cb_mem!=NULL)&&(attr->cb_size>=sizeof(StaticTask_t))&& (attr->stack_mem!=NULL)&&(attr->stack_size>0U)){ mem=1; } else{ if((attr->cb_mem==NULL)&&(attr->cb_size==0U)&&(attr->stack_mem==NULL)){ mem=0; } } } else{ mem=0; } if(mem==1){ #if(configSUPPORT_STATIC_ALLOCATION==1) hTask=xTaskCreateStatic((TaskFunction_t)func,name,stack,argument,prio,(StackType_t*)attr->stack_mem, (StaticTask_t*)attr->cb_mem); #endif } else{ if(mem==0){ #if(configSUPPORT_DYNAMIC_ALLOCATION==1) if(xTaskCreate((TaskFunction_t)func,name,(uint16_t)stack,argument,prio,&hTask)!=pdPASS){ hTask=NULL; } #endif } } } return((osThreadId_t)hTask); }
正常V1夠用了,普通功能選V1,高級功能選擇V2:
我分別選擇CMSIS_V1和CMSIS_V2編譯了兩次進行對比,CMSIS_V2都要大一些。
審核編輯:劉清
-
微控制器
+關注
關注
48文章
7668瀏覽量
152232 -
處理器
+關注
關注
68文章
19455瀏覽量
231376 -
CMSIS
+關注
關注
0文章
40瀏覽量
11954 -
stm32cubemx
+關注
關注
5文章
284瀏覽量
15106
發布評論請先 登錄
相關推薦
想選一個10或12bit的ADC,有哪些ADC可以選擇呢?SPS該如何計算呢?
MAX44290ANT+T和MAX44290ANT+TG7有什么區別呢?
域名、IP 地址、網址分別是什么?有什么區別呢?
![域名、IP 地址、網址分別是什么?<b class='flag-5'>有</b><b class='flag-5'>什么區別</b><b class='flag-5'>呢</b>?](https://file1.elecfans.com/web2/M00/06/B9/wKgZombqQ9OAav1FAAElWjHcO-A799.png)
移植CMSIS-NN v6.0.0版本到VisionBoard
![移植<b class='flag-5'>CMSIS</b>-NN <b class='flag-5'>v</b>6.0.0版本到VisionBoard](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
PDR_ON復位和NRST引腳復位,對STM32F407IG的影響有什么區別呢?
請問CMSIS-RTOS怎么調試?
MSC_Application只要在任務中調用就會報錯,怎么處理?
CMSIS-RTOS V1與V2的區別是什么?
CMSIS的DSP數字信號處理函數庫應用
![<b class='flag-5'>CMSIS</b>的DSP數字信號處理函數庫應用](https://file1.elecfans.com/web2/M00/C6/89/wKgaomYA57SAWp1AAABXjOBcrGk842.png)
英偉達AI服務器NVLink版與PCIe版有何區別?又如何選擇呢?
![英偉達AI服務器NVLink版與PCIe版<b class='flag-5'>有</b>何<b class='flag-5'>區別</b>?又如何<b class='flag-5'>選擇</b><b class='flag-5'>呢</b>?](https://file1.elecfans.com/web2/M00/C4/F1/wKgZomX5BQCAAGCPAAaUZ9psNS4086.jpg)
評論