最近有朋友在后台中私信我,说现在做项目的时候有时候总是会考虑要不要用RTOS,或者怎么考量什么时候该用RTOS比较好、
关于这个问题,我个人也是深有感触的,做开发这么久了,大大小小的产品都做过不少了。有用RTOS开发的也有纯裸机开发的,并不是说用RTOS就一定比用裸机要好,应该要看实际的硬件资源和产品逻辑的需求。做嵌入式开发的朋友都知道,尤其是单片机开发的,现在的单片机五花八门,各式各样,层出不穷。有些性能高,有些性能就一般,做项目的时候可能还因为出于成本考量,即使产品逻辑较复杂,但是单片机性能也会被替换为性能更低,但价格更低的。我们都知道 RTOS 能高效管理多任务,如多任务方式处理按键、显示屏显示、通信等,能极大提升单片机的运行效率和稳定性。但是呢,并非所有的单片机(MCU)都能顺畅运行 RTOS 系统的。如何快速判断一款单片机(MCU) 能否跑RTOS是我们这篇文章要分析的问题,就以我的个人观点简单分析一下。一、RTOS 对 MCU 的基本要求要想知道一款单片机(MCU)能否跑的动RTOS,我觉得应该首先从 内存、主频、内核支持情况、以及是否有相关的移植案例等先考量一下。(1)看单片机的内存 (RAM、ROM) 情况任何一款单片机,我们在选型它时候都不可忽略内存的大小情况,它直接取决能否支撑我们产品开发的内存分配是否足够。内存是 MCU 运行 RTOS 的关键资源。一般单片机内存主要指随机存取存储器(RAM),和掉电可保持存储器(ROM)。RAM一般用于运行时数据存放和动态内存分配等;ROM一般存储代码文本和掉电保持的数据。ROMRTOS本身涉及的任务管理和各种中间件就会比逻辑代码要多得多,不同的RTOS还是不一样的,代码量就会有所不同,所以要支持RTOS的话,单片机的ROM就不能太少。一般要求 ROM ≥ 32KB 以上。但是注意需要注意的一点:并不是ROM够大的就可以,要区分ROM的类型。比如常见的ROM还分为:OTP型Flash:这类flash一般单次写入,不支持反复擦写。 可编程型Flash:这类flash可支持反复擦写,常见的擦写寿命可达几万到几十万次不等。一般用于跑RTOS的都是选择可编程型的FLASH单片机。RAMRTOS 涉及任务调度和管理,任务数量越多越复杂度,对 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)其他厂商自研内核:这类一般是厂商自研的内核,可能用于某些特定用途,相对来说使用范围较小。还有一种确认方法:当你打算在 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价格,以及外围电路设计的成本,物料价格等等的因素。