为什么要用CMSIS RTOS

CMSIS-RTOS为ARM官方推出的RTOS API, 具备集成便捷、资源占用少、组件丰富等特点。它支持一键添加到Keil并适用于多种MCU, 提供高效的仿真工具, 是mbedOS的基础之一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMSIS RTOS是ARM官方推出的RTOS API,很多人认为它就是RTX,实际上它只是封装了RTX,以后还可能封装freeRTOS,uc/os等等第三方OS。

这里写图片描述

它有哪些优势呢?下面是我开始研究它的原因:

  • 集成在keil中,没有所谓移植概念。针对任何MCU都可以一键添加(试想一下,如果你将来用的不是STM32,那么移植OS是不是还是那么容易);
  • 占用资源极小。大约5kB,而且针对cortex系列ARM官方优化,效率不言自明;
  • 组件丰富。常用中间件USB/network/GUI/文件系统等,ARM官方已经准备好,只需要在keil中一键添加,同样没有移植概念;
  • 仿真非常方便。在keil的debug模式中,轻松查看任务的CPU、内存占用,还有各任务的运行时间、运行状态,各任务之间如何抢占,非常直观,不需要像其他RTOS那样调用专用的查看函数;
  • 杀手锏来了。CMSIS RTOS是ARM现在热推的物联网操作系统mbedOS的基础,搞懂这个RTOS API,mbedOS更容易上手,物联网是大势所趋,ARM的在这个浪潮中的地位众所周知(软银收购ARM的核心原因),物联网以后估计会产生大量的相关工作机会;
  • 使用极简单。再次提醒,CMSIS RTOS只是一套API,有兴趣的可以去研究它封装OS源码,没兴趣的,看看API拿来就用;
  • 免费!这点和freeRTOS一样,比uc/oS更有潜力,不过freeRTOS是个人开源项目,后续升级维护缺乏商业模式,而ARM刚从软银那里搞来大笔钱,估计后续发展推广更为强劲,话说回来,如果freeRTOS真的非常优秀,ARM也可以对它进行封装。
  • 兴趣。不拒绝接受新鲜事物。

链接:ARM官方CMSIS-RTOS介绍

### CMSIS-RTOS 使用指南 CMSIS-RTOS 是一种标准化的实时操作系统接口,旨在简化基于 ARM Cortex-M 的微控制器的应用程序开发。它提供了统一的 API 接口,使得应用程序可以在不同的 RTOS 实现之间轻松迁移。 #### CMSIS-RTOS 版本概述 CMSIS-RTOS 提供两个主要版本:CMSIS-RTOSCMSIS-RTOS2。CMSIS-RTOS 基于 Keil RTX4,而 CMSIS-RTOS2 则针对更现代的需求进行了改进并兼容更多 RTOS 实现[^3]。 为了迁移到 CMSIS-RTOS2,开发者需要在所有涉及 RTOS 功能调用的地方包含 `cmsis_os2.h` 文件[^4]: ```c #include "cmsis_os2.h" ``` #### 示例代码:创建线程和信号量 以下是一个简单的 CMSIS-RTOS2 应用程序示例,展示了如何创建线程以及使用信号量进行同步操作。 ##### 创建线程 下面的代码片段演示了如何定义和启动一个新的线程: ```c // 定义线程函数 void thread_function(void *argument) { while (1) { osDelay(500); // 线程休眠 500ms printf("Thread is running\n"); } } int main() { osThreadId_t thread_id; // 初始化 CMSIS-RTOS2 osKernelInitialize(); // 创建线程 thread_id = osThreadNew(thread_function, NULL, NULL); if (thread_id != NULL) { printf("Thread created successfully.\n"); } else { printf("Failed to create thread.\n"); } // 启动内核调度器 osKernelStart(); while (1); } ``` ##### 使用信号量 以下是另一个例子,展示如何使用二值信号量来保护共享资源: ```c osSemaphoreId_t semaphore; void producer_thread(void *argument) { while (1) { osSignalSet(semaphore, 1); // 发送信号给消费者 osDelay(1000); // 生产者每秒发送一次信号 } } void consumer_thread(void *argument) { while (1) { osSignalWait(semaphore, osWaitForever); // 等待生产者的信号 printf("Resource consumed by the consumer.\n"); } } int main() { osThreadId_t producer_id; osThreadId_t consumer_id; osKernelInitialize(); // 创建信号量 semaphore = osSemaphoreCreate(osSemaphore(NewSem), 1); // 创建生产者和消费者线程 producer_id = osThreadNew(producer_thread, NULL, NULL); consumer_id = osThreadNew(consumer_thread, NULL, NULL); osKernelStart(); while (1); } ``` 以上代码分别实现了线程的创建和信号量的使用[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值