当前位置: 首页 > article >正文

怎么快速判断一款MCU能否跑RTOS系统

最近有朋友在后台中私信我,说现在做项目的时候有时候总是会考虑要不要用RTOS,或者怎么考量什么时候该用RTOS比较好、

关于这个问题,我个人也是深有感触的,做开发这么久了,大大小小的产品都做过不少了。有用RTOS开发的也有纯裸机开发的,并不是说用RTOS就一定比用裸机要好,应该要看实际的硬件资源和产品逻辑的需求。

做嵌入式开发的朋友都知道,尤其是单片机开发的,现在的单片机五花八门,各式各样,层出不穷。有些性能高,有些性能就一般,做项目的时候可能还因为出于成本考量,即使产品逻辑较复杂,但是单片机性能也会被替换为性能更低,但价格更低的。

我们都知道 RTOS 能高效管理多任务,如多任务方式处理按键、显示屏显示、通信等,能极大提升单片机的运行效率和稳定性。

但是呢,并非所有的单片机(MCU)都能顺畅运行 RTOS 系统的。

如何快速判断一款单片机(MCU) 能否跑RTOS是我们这篇文章要分析的问题,就以我的个人观点简单分析一下。

一、RTOS 对 MCU 的基本要求

要想知道一款单片机(MCU)能否跑的动RTOS,我觉得应该首先从 内存、主频、内核支持情况、以及是否有相关的移植案例等先考量一下。

(1)看单片机的内存 (RAM、ROM) 情况

任何一款单片机,我们在选型它时候都不可忽略内存的大小情况,它直接取决能否支撑我们产品开发的内存分配是否足够。

内存是 MCU 运行 RTOS 的关键资源。

一般单片机内存主要指随机存取存储器(RAM),和掉电可保持存储器(ROM)。

RAM一般用于运行时数据存放和动态内存分配等;ROM一般存储代码文本和掉电保持的数据。

ROM

RTOS本身涉及的任务管理和各种中间件就会比逻辑代码要多得多,不同的RTOS还是不一样的,代码量就会有所不同,所以要支持RTOS的话,单片机的ROM就不能太少。一般要求 ROM ≥ 32KB 以上。

但是注意需要注意的一点:并不是ROM够大的就可以,要区分ROM的类型。比如常见的ROM还分为:

OTP型Flash:这类flash一般单次写入,不支持反复擦写。
可编程型Flash:这类flash可支持反复擦写,常见的擦写寿命可达几万到几十万次不等。

一般用于跑RTOS的都是选择可编程型的FLASH单片机。

RAM

RTOS 涉及任务调度和管理,任务数量越多越复杂度,对 RAM 的需求就越大。

一般来说,单片机能够运行多任务的最低 RAM 要求为 RAM ≥ 16KB,想要运行更复杂的系统和更多任务数量,那需要的 RAM 容量就要更大了。

由于RTOS系统运行时,不管是创建的可运行任务还是其他像邮箱、信号量、互斥锁、队列、事件标志组等都是需要申请内存空间的。一般来说会用动态申请的方式,所以想要能正常运行起来,必须有足够的RAM。

特别是涉及大量数据处理和多任务数量的情况下,甚至可能需要几百 KB 甚至几 MB 的 RAM。

(2)主频

单片机的主频代表了 MCU 的运算速度和处理能力。高的主频能让 MCU 更快地处理各种指令,能更好地满足 RTOS 对实时性的要求。

本来我们考虑使用RTOS就是对实时性有要求的,过低的主频即使运行了RTOS,但是实时性不满足的话,也不是我们所需要的。

所以,通常建议 MCU 的主频 ≥48MHz 及以上,像常用到的 STM32F103X系列,主频就可高达 72MHz,能较好地支持 RTOS 运行。

但是呢,主频也并非越高就越好,还需综合考虑功耗、散热、成本、体积等因素。

(3)内核是否支持跑RTOS

不同的 RTOS 对 MCU 内核有特定要求。

很多的 MCU 在设计之初的定位就是明确的了,有些是为了低端场景下使用,要求不高,往往用于裸机即可;而有些是为了中高端场景下使用,对MCU要求很高,设计的时候就会考虑到RTOS兼容的问题。

目前,市场上主流的 MCU 内核常见见的有几个:

1)ARM 的 cortex-M系列:低端:Cortex-M0、M0+、M1、M23中端:Cortex-M3、M4高端:Cortex-M7、M33、M35P、M55 等等的。2)RISC-V:一种开源指令集架构,近年来是备受关注了的。
3)8位内核:传统的8位内核如今在市场上需求量依然很大,特别是在一些对成本敏感的应用领域。
4)其他厂商自研内核:这类一般是厂商自研的内核,可能用于某些特定用途,相对来说使用范围较小。

而 ARM 的 Cortex 系列也是目前应用最广泛的。

其中,Cortex-M0/M0+ 的内核MCU,也能适配一些RTOS,能运行轻量级 RTOS,就是任务数量会受到一定限制,毕竟内存资源本身就有限。

而 Cortex-M3/M4/M7 等内核性能强劲,可流畅运行大多数 RTOS,如 FreeRTOS、ucos、RTX、rt-thread等等的,能满足复杂应用场景的需求。

还有一种确认方法:

当你打算在 MCU 上移植某个RTOS的时候,建议你可以先去找找你打算移植的RTOS是否有应用的案例。比如可以看官方提供的源码中是否有支持你用的MCU的内核适配文件,或者看看官方提供的配置工具中是否有相应的配置工具,这种方式都可以比较快速的确认是否支持某些RTOS。

比如,freeRTOS的源码中,有一个目录中就放着针对某些内核的适配文件,如下:

(4)单片机外设资源是否支持

用过RTOS的朋友应该都清楚,RTOS 在运行过程中需要使用定时器、中断等外设资源。

定时器用于提供给RTOS作为心跳节拍,中断能否管理涉及到RTOS的实时性。

因此,在选择 MCU 时,要确保这些外设没有被其他功能完全占用,否则可能导致资源冲突,影响 RTOS 的正常运行。

二、判断的方式总结

(1)确认芯片内核

第一步肯定是要确定 MCU 的内核是否支持运行相应 RTOS 的条件。

判断的方式一般是通过查阅MCU芯片数据手册或相关技术资料、应用文档等。

有些MCU在官方提供的资料中可能会有相关的RTOS应用案例或者移植好的demo例程,这种资料当然是一手的参考好资料。

(2)检查 Flash 和 RAM 大小

依据数据手册,仔细核对 Flash 和 RAM 的容量是否满足运行 RTOS 的基本要求,即: Flash≥32KB;

RAM≥16KB。

若不满足,需考虑更换 MCU 或选择对资源要求更低的 RTOS。

(3)确认主频大小

MCU的主频太低的话,运行速度太慢,就算能跑得动RTOS,但是实时性太差也很难满足我们的的应用需求,实际意义并不大。

(4)查看RTOS源码对MCU内核的支持情况

很多RTOS提供的原始代码中往往都会有官方针对一些内核做的移植适配,从官方提供的例子里面就能很快的判断该RTOS是否支持某些内核。

并且,移植时很可能还是需要从官方提供的适配文件去裁剪修改来适配自己的芯片平台的。所以参考官方的案例是非常重要的步骤,总比自己瞎摸索要快得多。

三、要不要用RTOS?

前面简单讨论了一下怎么判断一款单片机能不能用RTOS,那其实还存在一个问题:要不要用RTOS的问题。

能不能用RTOS 和 要不要用 RTOS 是两个层面的问题了。

关于要不要用 RTOS 的问题,从我个人做项目经验出发分享一点微薄的经验:

(1)看项目的复杂程度

在项目开发前期,你应该对自己要做的项目有一个把握。

如果你即将开发的项目本身并不复杂,只是采集几个ADC数据,然后简单处理一下采集数据,最后通过串口发送出去,那这样的压根没必要用RTOS,直接裸机开发更加方便。

如果你即将开发的项目有一定的复杂度了,比如要涉及到网络数据的管理、显示屏显示、外部多按键输入,协议解析,超时管理等的功能,那就建议要上RTOS了。使用RTOS的任务管理以及多种同步手段,能更加方便你的代码模块化和保证实时性能。

(2)看项目需求

如果项目中对时间的要求很严格,比如航空航天、工业控制、测量领域等,可能会要求任务必须在规定时间内运行或者完成,不能有很长的延迟,这种情况就需要考虑用RTOS来保证任务的及时执行和响应。

但是像一些诸如电子消费品之类的,本身对时间要求也不是那么的严格,有一些延迟也能接受的,那就是可用可不用了。

(3)看项目成本

做产品的成本向来都是第一考虑的要素。一个产品如果开发以后得成本太高,即使做的再完美,由于颇高的价格都难以被市场接受,那这个产品的市场价值就完全失去了。

如果开发的项目对成本把控严格,即使功能复杂可能也不会用RTOS开发。

这点需要综合考虑软件、硬件成本。

软件方面主要是用到的软件是否需要授权收费,比如用到的某些库是否收费?用到的RTOS是否免费?

硬件方面要考虑用到的MCU价格,以及外围电路设计的成本,物料价格等等的因素。

相关文章:

怎么快速判断一款MCU能否跑RTOS系统

最近有朋友在后台中私信我,说现在做项目的时候有时候总是会考虑要不要用RTOS,或者怎么考量什么时候该用RTOS比较好、 关于这个问题,我个人也是深有感触的,做开发这么久了,大大小小的产品都做过不少了。有用RTOS开发的…...

使用原生前端技术封装一个组件

封装导航栏 navbar-template.html <header><nav><ul><li><a href"index.html"><i class"fas fa-home"></i> 主页</a></li><li><a href"#"><i class"fas fa-theate…...

lesson04-简单回归案例实战(理论+代码)

理解线性回归及梯度下降优化 引言 在机器学习的基础课程中&#xff0c;我们经常遇到的一个重要概念就是线性回归。今天&#xff0c;我们将深入探讨这一主题&#xff0c;并通过具体的例子来了解如何利用梯度下降方法对模型进行优化。 线性回归简介 线性回归是一种统计方法&a…...

Java 面试中的数据库设计深度解析

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Java 面试中的数据库设计深度解析一、数据库…...

国内首发!具有GPU算力的AI扫描仪

奥普思凯重磅推出的具有GPU算力的扫描仪&#xff0c;是一款真正意义上的AI扫描仪&#xff0c;奥普思凯将嵌有OCR发票识别核心的高性能NPU算力棒与高速扫描仪相结合&#xff0c;实现软件硬件相结合&#xff0c;采用一体化外观设计&#xff0c;实现高速扫描、快速识别表单&#x…...

【开发技巧指北】IDEA修改默认绑定Maven的仓库地址

【开发技巧指北】IDEA修改默认绑定Maven的仓库地址 Microsoft Windows 11 家庭中文版 IIntelliJ IDEA 2025.1.1.1 默认的IDEA是有自己捆绑的Maven的&#xff08;这是修改完毕的截图&#xff09; 修改默认的Maven配置&#xff0c;路径是IDEA安装路径下的plugins D:\Softwares\I…...

数据存储与运算

计算机中的数据存储与运算 输出地址后看不懂格式&#xff0c;为什么&#xff1f; 第一节&#xff1a;进制转换基础 ✅ 常见进制&#xff1a; 十进制&#xff08;Decimal&#xff09;&#xff1a;日常使用的 0~9二进制&#xff08;Binary&#xff09;&#xff1a;计算机底层使…...

【2025最新】Java图书借阅管理系统:从课程作业到实战应用的完整解决方案

【2025最新】Java图书借阅管理系统&#xff1a;从课程作业到实战应用的完整解决方案 目录 【2025最新】Java图书借阅管理系统&#xff1a;从课程作业到实战应用的完整解决方案**系统概述** **核心功能模块详解****1. 系统登录与权限控制****2. 借阅管理模块****3. 用户角色管理…...

springcloud openfeign 请求报错 java.net.UnknownHostException:

现象 背景 项目内部服务之间使用openfeign通过eureka注册中心进行服务间调用&#xff0c;与外部通过http直接调用。外部调用某个业务方提供的接口需要证书校验&#xff0c;因对方未提供证书故设置了忽略证书校验代码如下 Configuration public class IgnoreHttpsSSLClient {B…...

【harbor】--配置https

使用自建的 CA 证书来自签署和启用 HTTPS 通信。 &#xff08;1&#xff09;生成 CA认证 使用 OpenSSL 生成一个 2048位的私钥这是 自建 CA&#xff08;证书颁发机构&#xff09; 的私钥&#xff0c;后续会用它来签发证书。 # 1创建CA认证 cd 到harbor [rootlocalhost harbo…...

Oracle 临时表空间详解

Oracle 临时表空间详解 一 临时表空间概述 临时表空间(Temporary Tablespace)是Oracle数据库中用于存储临时数据的专用空间&#xff0c;主要用于&#xff1a; 排序操作(ORDER BY, GROUP BY等)哈希连接(HASH JOIN)临时表数据某些类型的索引创建临时LOB对象存储 二 临时表空间…...

深入理解享元模式:用Java实现高效对象共享

享元模式&#xff08;Flyweight&#xff09;的核心思想是对象复用&#xff0c;通过共享技术减少内存占用&#xff0c;就像"共享单车"一样让多个调用者共享同一组细粒度对象。 什么是享元模式&#xff1f; 享元模式是一种结构型设计模式&#xff0c;它通过共享技术有…...

OptiStruct实例:消声器前盖ERP分析(2)RADSND基础理论

13.2 Radiated Sound Output Analysis( RADSND ) RADSND 方法通过瑞利积分来求解结构对外的辐射噪声。其基本思路是分为两个阶段&#xff0c;如图 13-12 所示。 图13-12 结构辐射噪声计算示意图 第一阶段采用有限元方法&#xff0c;通过频响分析(模态叠加法、直接法)工况计算结…...

barker-OFDM模糊函数原理及仿真

文章目录 前言一、巴克码序列二、barker-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、barker-OFDM 模糊函数②、barker-OFDM 距离分辨率③、barker-OFDM 速度分辨率④、barker-OFDM 等高线图 四、资源自取 前言 本文进行 …...

Linux.docker.k8s基础概念

1.Linux基本命令 cat 查看文件内容。 cd 进入目标目录。 ll 查询当前路劲下文件的详细信息。 ls 查询当前路劲下的文件。 touch 建立一个文件。 mkdir 建立一个文件夹。 rm 删除文件或者目录。 mv 移动目录和重新命名文件。 unzip 解压。 top 查看当前线程的信息。 find …...

GIT命令行的一些常规操作

放弃修改 git checkout . 修改commit信息 git commit --amend 撤销上次本地commit 1、通过git log查看上次提交的哈希值 2、git reset --soft 哈希值 分支 1.创建本地分支 git branch 分支名 2.切换本地分支 git checkout mybranch&#xff1b; 3.创建一个新分支并…...

近期知识库开发过程中遇到的一些问题

我们正在使用Rust开发一个知识库系统&#xff0c;遇到了一些问题&#xff0c;在此记录备忘。 错误&#xff1a;Unable to make method calls because underlying connection is closed 场景&#xff1a;在docker中调用headless_chrome时出错 原因&#xff1a;为减小镜像大小&am…...

3.RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加&#xff1a;就是在一张图片上放上自己想要的图片&#xff0c;如LOGO&#xff0c;时间等。有点像之前提到的OSD原理一样。例如&#xff1a;下图一张图片&#xff0c;在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…...

使用 HTML + JavaScript 实现一个日历任务管理系统

在现代快节奏的生活中&#xff0c;有效的时间管理变得越来越重要。本项目是一个基于 HTML 和 JavaScript 开发的日历任务管理系统&#xff0c;旨在为用户提供一个直观、便捷的时间管理工具。系统不仅能够清晰地展示当月日期&#xff0c;还支持事件的添加、编辑和删除操作&#…...

车载诊断架构SOVD --- 车辆发现与建连

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

Notepad++找回自动暂存的文件

场景&#xff1a; 当你没有保存就退出Notepad&#xff0c;下次进来Notepad会自动把你上次编辑的内容显示出来&#xff0c;以便你继续编辑。除非你手动关掉当前页面&#xff0c;这样Notepad就会删除掉自动保存的内容。 问题&#xff1a; Notepad会将自动保存的文件地址,打开Note…...

DL00924-基于深度学习YOLOv11的工程车辆目标检测含数据集

文末有代码完整出处 &#x1f697; 基于深度学习YOLOv11的工程车辆目标检测——引领智能识别新潮流&#xff01; &#x1f680; 随着人工智能技术的飞速发展&#xff0c; 目标检测 已经在各个领域取得了显著突破&#xff0c;尤其是在 工程车辆识别 这一关键技术上。今天&#…...

Axure RP11安装、激活、汉化

一:注册码 Axure RP11.0.0.4122在2025-5-29日亲测有效: 49bb9513c40444b9bcc3ce49a7a022f9...

【PhysUnits】15.6 引入P1后的左移运算(shl.rs)

一、源码 代码实现了Rust的类型级二进制数的左移运算(<<)&#xff0c;使用类型系统在编译期进行计算。 use super::basic::{Z0, P1, N1, B0, B1, NonZero, NonOne, Unsigned}; use super::sub1::Sub1; use core::ops::Shl;// 左移运算&#xff08;<<&#xff09…...

自编码器Auto-encoder(李宏毅)

目录 编码器的概念&#xff1a; 为什么需要编码器&#xff1f; 编码器什么原理&#xff1f; 去噪自编码器: 自编码器的应用&#xff1a; 特征解耦 离散隐表征 编码器的概念&#xff1a; 重构&#xff1a;输入一张图片&#xff0c;通过编码器转化成向量&#xff0c;要求再…...

数据结构之堆(topk问题、堆排序)

一、堆的初步认识 堆虽然是用数组存储数据的数据结构&#xff0c;但是它的底层却是另一种表现形式。 堆分为大堆和小堆&#xff0c;大堆是所有父亲大于孩子&#xff0c;小堆是所有孩子大于父亲。 通过分析我们能得出父子关系的计算公式&#xff0c;parent(child-1)/2&#xff…...

SpringBoot使用ffmpeg实现视频压缩

ffmpeg简介 FFmpeg 是一个开源的跨平台多媒体处理工具集&#xff0c;用于录制、转换、编辑和流式传输音频和视频。它功能强大&#xff0c;支持几乎所有常见的音视频格式&#xff0c;是多媒体处理领域的核心工具之一。 官方文档&#xff1a;https://ffmpeg.org/documentation.h…...

【Elasticsearch】exists` 查询用于判断文档中是否存在某个指定字段。它检查字段是否存在于文档中,并且字段的值不为 `null`

在 Elasticsearch 中&#xff0c;exists 查询用于判断文档中是否存在某个指定字段。它检查字段是否存在于文档中&#xff0c;并且字段的值不为 null。如果字段存在且有值&#xff08;即使是空字符串或空数组&#xff09;&#xff0c;则 exists 查询会匹配该文档&#xff1b;如果…...

2025-05-31 Python深度学习9——网络模型的加载与保存

文章目录 1 使用现有网络2 修改网络结构2.1 添加新层2.2 替换现有层 3 保存网络模型3.1 完整保存3.2 参数保存&#xff08;推荐&#xff09; 4 加载网络模型4.1 加载完整模型文件4.2 加载参数文件 5 Checkpoint5.1 保存 Checkpoint5.2 加载 Checkpoint 本文环境&#xff1a; Py…...

长安链起链调用合约时docker ps没有容器的原因

在调用这个命令的时候&#xff0c;发现并没有出现官方预期的合约容器&#xff0c;这是因为我们在起链的时候没有选择用docker的虚拟环境&#xff0c;实际上这不影响后续的调用&#xff0c;如果想要达到官方的效果那么你只需要在起链的时候输入yes即可&#xff0c;如图三所示...