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((prio< osPriorityIdle) || (prio >osPriorityISR)||((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文章
7489浏览量
151051 -
处理器
+关注
关注
68文章
19165浏览量
229130 -
CMSIS
+关注
关注
0文章
39浏览量
11874 -
stm32cubemx
+关注
关注
5文章
280浏览量
14756
发布评论请先 登录
相关推荐
评论