CMSIS标准

CMSIS

什么是CMSIS

CMSIS全称是 Cortex Microcontroller Software Interface Standard,由ARM公司推出,是专门为ARM Cortex-MCortex-ACortex-R 微控制器系列设计的一套软件接口标准

CMSIS 是 ARM Cortex 系列 MCU 软件开发的标准基石,让软件更易移植、更高效、更易用。

我们使用的各种MCU:STM32、GD32、NXP等 Cortex-M 芯片,实际工程中总会用到 CMSIS 的头文件、API 或库。

核心作用

  • 标准化底层驱动和外设访问接口
    让不同芯片厂家(ST、NXP、GD、兆易创新等)的底层驱动代码更加统一,便于移植和复用。

  • 提供统一的外设寄存器定义和访问方式
    通过结构体/宏定义等方式描述 Cortex-M 内核外设寄存器,让开发者用标准方式操作硬件,无需查找手册每个寄存器地址。

  • 支持RTOS和DSP库接口标准化
    包含CMSIS-RTOS(RTOS抽象标准)、CMSIS-DSP(数字信号处理库)、CMSIS-NN(神经网络库)等。

主要内容

  • CMSIS-Core
    Cortex 系列内核寄存器、启动文件、系统初始化等的标准定义。
  • CMSIS-Driver
    标准化外设驱动接口(如I2C、SPI、USART等),方便中间件/库与硬件的解耦。
  • CMSIS-RTOS
    标准化实时操作系统(RTOS)API接口(V1、V2),方便应用/中间件跨RTOS运行。
  • CMSIS-DSP
    数字信号处理库,包含常用滤波、FFT、矩阵运算等优化算法。
  • CMSIS-NN
    针对 Cortex-M 优化的神经网络推理库。
  • CMSIS-Pack
    软件包描述标准,便于芯片厂商和IDE自动管理和集成驱动/库。

CMSIS-RTOS

什么是CMSIS-RTOS

CMSIS-RTOS(Cortex Microcontroller Software Interface Standard - Real-Time Operating System)是由ARM公司主导制定的、针对嵌入式微控制器的RTOS(实时操作系统)抽象标准接口。

它是CMSIS标准的一部分,旨在为各种 RTOS 提供统一的API,使得中间件、应用代码能够脱离对具体RTOS的依赖,方便移植和复用。

核心作用

  • 标准化接口

    • 各种RTOS(如FreeRTOS、uC/OS、ThreadX等)原生API不同,代码移植很麻烦。所以提供一套统一的、跨RTOS的API(任务(线程)管理、信号量、消息队列、定时器等),让应用代码、库代码都只依赖这套标准API,而不直接依赖某个具体RTOS。
    • 换RTOS时,只需替换CMSIS-RTOS的底层适配实现,上层应用代码基本不用动
  • 增强中间件和组件移植性

    • 像LVGL、网络协议栈、USB堆栈等通用软件包,只要适配CMSIS-RTOS接口,就可以跑在任何支持CMSIS-RTOS的系统上。
    • ST、ARM等芯片厂商的中间件通常都支持CMSIS-RTOS接口,这样库代码可以在多种RTOS之间通用。
  • 便于软件生态兼容:很多第三方库、协议栈、图形库(如 LVGL)都会优先支持 CMSIS-RTOS 接口,方便在不同平台快速集成。

主要内容

CMSIS-RTOS 主要包含以下方面的 API:

  • 线程(Task)管理
  • 信号量(Semaphore)、互斥量(Mutex)
  • 消息队列(Message Queue)
  • 事件标志组(Event Flags)
  • 定时器(Timer)
  • 内存池(Memory Pool)
  • 系统定时与调度

版本

  • CMSIS-RTOS V1:最早的标准,接口较为简单,兼容性好。
  • CMSIS-RTOS V2:支持更多高级功能(如线程属性、内存池、事件标志等),API更现代化,是推荐使用的新标准。

举例

以创建任务的接口函数为例

osThreadNewxTaskCreate 都是用于创建任务(线程)的函数,但它们属于不同的接口和框架。

  • xTaskCreate: 是 FreeRTOS 的原生 API 直接用于创建任务,属于 FreeRTOS 的核心函数。这是一个更低级的接口,直接与 FreeRTOS 的调度器交互。

  • osThreadNew: 是根据 CMSIS-RTOS API 规范定义的接口,目的是提供一个更高层次的、硬件无关的 RTOS 接口。CMSIS-RTOS API 可以被视为在 FreeRTOS原生API 之上提供了一层抽象,使得代码更具可移植性。

什么是抽象?

  • 抽象就是对复杂事物做简化,把共性提取出来,隐藏细节,类似于封装功能,然后暴露接口

  • 在软件开发中,抽象常表现为接口(API),比如函数声明、类、协议等。

比如:

  • 硬件抽象层(HAL):STM32的HAL库就是对寄存器操作的抽象,上层不直接操作寄存器。
  • RTOS抽象层(CMSIS-RTOS):对RTOS的任务、信号量等API做统一标准化,上层不直接调用FreeRTOS/RTX等原生API。
  • 驱动抽象层:比如I2C、SPI等接口的标准驱动,不管底层硬件怎么实现。