0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是FreeRTOS?什么是CMSIS?

冬至子 来源:ITRelief 作者:Sachefgh Xu 2023-07-25 15:01 次阅读

一、理解CMSIS-RTOS

现在网上很多资料和文章实际上都没有讲清楚CMSIS-RTOS这个东西,但理解它的原理构成太重要了,所以我按自己的理解把RTOS这部分的架构整理了一下,如有问题欢迎指正。

1.什么是FreeRTOS?

**目前CubeMX支持的CMSIS-RTOS使用的第三方内核就是FreeRTOS **

FreeRTOS是一个开源的轻量级实时操作系统,目前在我国嵌入式市场占有很大份额。与μC/OS-2/3、embOS等商业系统相比,在进行产品级应用时更加便捷自由。如果你先前接触过乐鑫的esp模块的话现在对FreeRTOS一定有比较深入的了解。

2.什么是CMSIS?

CMSIS(Common Microcontroller Software Interface Standard)是ARM提出的一种 Cortex-M /A处理器系列的与供应商无关的硬件抽象层和软件接口层。

CMSIS的主要组件包含两个:

  • CMSIS-CORE:提供与 Cortex-M0、Cortex-M3、Cortex-M4、SC000 和 SC300 处理器与外围寄存器之间的接口
  • CMSIS-RTOS API:用于线程控制、资源和时间管理的实时操作系统的标准化编程接口
    图片

STM32的CMSIS-RTOS来说,架构图中的Real Time Kernel 就是FreeRTOS(抽象层); CMSIS-CORE提供了硬件层的映射关系,与芯片型号有对应关系。

图片

而CMSIS-RTOS API则实现了第三方实时内核API的再封装,与第三方实时内核有对应关系

综上,STM32CubeMX的 Middleware虽然使用了FreeRTOS,但部分函数其实已经经过封装了),※使用的是CMSIS API 及 FreeRTOS的原生API。

CMSIS-RTOS在用户的应用代码和第三方的RTOS Kernel直接架起一道桥梁,一个设计在不同的RTOS之间移植,或者在不同Cortex MCU直接移植的时候,如果两个RTOS都实现了CMSIS-RTOS,那么用户的应用程序代码完全可以不做修改。

二、项目文件解析

图片

其中 Drivers/CMSIS文件夹主要存放Cortex内核及设备文件、微控制器专用启动代码/系统文件,即CMSIS-RTOS Core部分的内容。

※而Middleware文件夹中则是FreeRTOS API和封装的CMSIS API的声明和定义。

三、启用FreeRTOS

① 使用CubeMX的情况下配置FreeRTOS非常简单,生成的代码相对也比较规整:

图片

界面选择CMSIS_V2,移植性更好

图片

系统时钟源会与RTOS冲突,需更改。

图片

②随后进入config param选项卡或者文件配置参数【保存在FreeRTOSConfig.h中】:

configUSE_PREEMPTION: 调度模式配置。配置为1时为抢占式调度,配置为0时为合作式调度。实时操纵系统为实现其功能,应当设置为1。

configCPU_CLOCK_HZ: CPU时钟,在Systick为时钟源情况下应取SystemCoreClock 。

configTICK_RATE_HZ: 每秒系统心跳数。用于osDelay()[CMSIS] 、vTaskDelay()[FreeRTOS] 等延时函数,默认最大值为1000。因此”线程“切换和延时函数分辨率为1ms。

configMAX_PRIORITIES:(※) 最大任务优先级;最高优先级为(该值-1)。

configMINIMAL_STACK_SIZE:最小堆栈值,单位[4 字节]

configTOTAL_HEAP_SIZE:总共堆栈大小

configMAX_TASK_NAME_LEN :最大TASK名称长度

configUSE_16_BIT_TICKS : 配置心跳计时器数据位长度。0时为32位;配置为1时为16位。

configUSE_MUTEXES:(※) 使用互斥锁功能(1开) 。 互斥锁的作用是实现多任务间共享资源的独占式处理,防止多线程同时访问操作同一资源发生错误。

configUSE_RECURSIVE_MUTEXES:(※) 使用递归互斥锁

configUSE_COUNTING_SEMAPHORES:使用信号计量功能。

对STM32硬件来说,中断优先级越高值越小。而对FreeRTOS,任务优先级越高值越大。

※中断屏蔽/分类管理

RTOS在cortex-M上的实现是通过软件方式实现的。拿CubeMX生成的代码来说,
main.c中执行完初始化代码后执行osKernelStart(),进入消息回环(Scheduler)。

因此,硬件中断仍然有效;虽然已经使用了RTOS,但对于一些特殊功能,例如运动急停、避障等还是必须依靠中断实现。这引来了两个问题;

首先是中断会影响任务执行。对此FreeRTOS提供了中断屏蔽的方法,采用类似蒙版的方式,利用BASEPRI寄存器对不同优先级的中断进行分类管理:

configPRIO_BITS: MCU使用的优先级位数 ,STM32有4位所以设置为4,对应0~15优先级;数值越小,优先级越高。不要修改

另外,系统默认使用组4的配置,即16个优先级均为抢占优先级。

configLIBRARY_LOWEST_INTERRUPT_PRIORITY: MCU的最低优先级, STM32为15。不要修改

configKERNEL_INTERRUPT_PRIORITY:*设置内核使用的中断优先级。默认设置为最低优先级(8位高位填补)。*无必要修改

configMAX_SYSCALL_INTERRUPT_PRIORITY* 优先级阈值转换,不要修改。*

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:*配置FreeRTOS系统可管理的最大优先级。*对于cortex-M3取值为 0-15。

本项的意义在于,当中断的优先性等于或低于此值时,这类中断将由RTOS系统托管。 具体包括可被RTOS屏蔽,可以通过经RTOS托管的入口(函数名称相同)访问等;此类被接管的中断可以使用RTOS的部分API(FromISR的安全函数)。

而高于设定值优先级的中断则会照常执行,即*裸金属层的硬件级中断。*此类中断不能使用RTOS的API( 与RTOS系统运行平级,执行时中断了RTOS的运行)

图片

一般使用RTOS时大部分中断都应由系统托管,使用RTOS不可控的硬件级中断容易导致执行错误和其他问题。CubeMX配置时也设置了限制。

CMSIS-RTOS控制中断开启关闭的函数为portDISABLE_INTERRUPTS()和portENABLE_INTERRUPTS(),两者定义在 portmacro.h中:

图片

实际上是通过了宏定义的方式调用了RTOS的vPortRaiseBASEPRI()和vPortSetBASEPRI(0).

※延时函数的使用

在裸金属编程的时候,我们习惯使用LL_mDelay()和自定义的相似原理函数;而这在引入RTOS后会产生问题:

图片

可以看到LL_mDelay()使用了SysTick计数器,调用时还会清零。而FreeRTOS用的时钟源就是SysTick。因此只要使用了CMSIS-RTOS,都不应使用利用Systick实现的延时函数。

当然 CMSIS和FreeRTOS也提供了相应的延时函数:

CMSIS API:

osStatus_t osDelay (uint32_t ticks);  //延时ticks个心跳;基于vTaskDelay();

osStatus_t osDelayUntil (uint32_t ticks);//延时至心跳计数为ticks; 基于vTaskDelayUntil();

FreeRTOS API:

void vTaskDelay( const TickType_t xTicksToDelay );//定时(相对心跳数),并阻塞task

TickType_t xTaskGetTickCount();//返回系统此时心跳数

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );
//定时(相对心跳数),并阻塞task.

vTaskDelay()和vTaskDelayUntil()效果不同,vTaskDelay()延时是相对延时,如果执行中发生中断将会导致执行周期的延长等问题。而vTaskDelayUntil是绝对延时,相对执行更严格。

当处于延时中时,任务会进入阻塞状态,延时执行完毕后转入准备状态,等待系统****跳转运行(高优先先行),所以任务优先级不高的话执行时序也不能被严格保证。

※有关线程状态:

图片

  • RUNNING: The thread that is currently running is in the RUNNING state. Only one thread at a time can be in this state.
  • READY: Threads which are ready to run are in the READY state. Once the RUNNING thread has terminated, or is BLOCKED , the next READY thread with the highest priority becomes the RUNNING thread.
  • BLOCKED: Threads that are blocked either delayed, waiting for an event to occur or suspended are in the BLOCKED state.
  • TERMINATED: When osThreadTerminate is called, threads are TERMINATED with resources not yet released (applies to joinable threads).
  • INACTIVE: Threads that are not created or have been terminated with all resources released are in the INACTIVE state.
    ※以上延时函数绝对不能用于中断,更不可以用于嵌套,否则会导致错误。

由此可见在使用RTOS的情况下,利用中断执行时序将变得非常复杂麻烦;中断延时一般只能通过__NOP__实现,严重影响系统效率,因此一般中断只用于改变标志位、状态位、硬件操作上,及时性的时序操作请利用中断联系信号机制实现。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19091

    浏览量

    228776
  • 寄存器
    +关注

    关注

    31

    文章

    5290

    浏览量

    119789
  • CMSIS
    +关注

    关注

    0

    文章

    39

    浏览量

    11855
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61906
  • 串口中断
    +关注

    关注

    0

    文章

    64

    浏览量

    13845
收藏 人收藏

    评论

    相关推荐

    求助,关于CMSIS-OS对FreeRTOS封装的问题求解

    最近在玩HAL库封装的freeRTOS,因为CMSIS-OS是ARM退出的统一RTOS接口,以便可以对第三方的RTOS进行统一无差别的访问。最近在玩第一个例子的时候,发现
    发表于 05-11 08:51

    3. CMSIS API 2 #硬声创作季 #FreeRTOS

    API编程语言FreeRTOS
    jf_06209345
    发布于 :2022年08月16日 20:45:15

    CMSIS RTOS任务间通信

    通信CMSIS
    橙群微电子
    发布于 :2023年09月28日 15:48:23

    CMSIS RTOS Timer

    CMSIS函数
    橙群微电子
    发布于 :2023年11月27日 16:06:03

    你们有没有谁用过freeRTOS

    你们有没有谁用过的freeRTOScmsis_os.c#define osThread(name)\&os_thread_def_##name 这是什么意思
    发表于 06-18 04:35

    CubeMX FreeRTOS(cmsis os)函数API一览

    以下所有资料来源于cmsis rtos官方说明文档,在keil5本地就有:Function Overview函数一览:Kernel Information and Control
    发表于 01-11 07:22

    STM32CubeIDE+FREERTOS的相关资料下载

    1. STM32Cube生成的FREERTOS系统是加了CMSIS_RTOS封装的,该封装下函数的调用要比FREERTOS简单一点,将中断调用和线程调用综合到了一起,但又不提示这个函数支不支持中断
    发表于 02-09 07:57

    FreeRTOS如何针对使用xTaskCreate创建的那些任务进行调度?

    我正在使用 FreeRTOS v10.2.1、CMSIS RTOS v1 main.c(由 CubeMX 生成)有:...osThreadDef(defaultTask
    发表于 01-10 06:20

    GD32_CMSIS_DAP

    GD32_CMSIS_DAP,有需要的下来看看
    发表于 07-29 17:08 99次下载

    使用与MQX CMSIS-DSP算法

    CMSIS DSP库与Freescale MQX RTOS的结合。还包括CMSISCMSIS DSP库介绍。应用程序注释基于CMSIS DSP库版本2.10,使用IAR ARM工作台
    发表于 09-07 17:33 5次下载
    使用与MQX <b class='flag-5'>CMSIS</b>-DSP算法

    MQX CMSIS-DSP算法应用

    MQX CMSIS-DSP算法应用
    发表于 09-29 16:47 20次下载
    MQX <b class='flag-5'>CMSIS</b>-DSP算法应用

    基于MQX CMSIS-DSP算法应用

    基于MQX CMSIS-DSP算法应用
    发表于 10-09 08:56 11次下载
    基于MQX <b class='flag-5'>CMSIS</b>-DSP算法应用

    FreeRTOS 队列 信号量 互斥量

    FreeRTOS的工程, 细心的同学可能发现, 已创建任务的函数为例, FreeRTOS官方是xTaskCreate(), 到之前CubeMX生成cmsis_os中的osThreadCreate, 再到最...
    发表于 12-09 09:51 0次下载
    <b class='flag-5'>FreeRTOS</b> 队列 信号量 互斥量

    CMSIS_V1和CMSIS_V2有什么区别呢,该怎选择呢?

    STM32CubeIDE在stm32开发者起着最基础的作用,在STM32CubeIDE中配置FreeRTOS中间层时需要选择interface,其中有三个选项:Disable、CMSIS_V1和CMSIS_V2
    的头像 发表于 09-06 09:26 2726次阅读

    CMSIS-RTOS是什么?

    我们在使用STM32CubeMX配置FreeRTOS时有一个CMSIS_V1和CMSIS_V2的选项,你知道CMSIS_V1和CMSIS_V
    的头像 发表于 04-11 10:53 1219次阅读