RTOS为什么出现

📖 精选 ✍️ Jack | 📅 2024-09-21 | 👍 0 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/RTOS #技术/裸机 #质量/精华

原帖 | Jack | 2024-09-21 22:34 | 👍0 | 阅读约1

老师,RTOS为什么会出现?

很早之前,在单片机开发工作中,其实并没有什么操作系统,因为我们单片机的项目并不复杂,小项目通过几个常规的任务不停去查询,然后配合一些中断(异常)来响应突发事件就够了。

但是随着系统应用(功能)的不断迭代和增加、修改,会发现,裸机的任何一个模块的代码的修改都很容易对其他模块产生干扰,模块彼此之间的干涉很严重。修改需要非常小心,尤其当需要配置的中断/异常越来越多的时候,就会发现非常难改,难度几何级上升。

所以这时候,裸机的开发工程师们,想出了一些类似于protothreads这类的事件驱动型的框架。但是在真实的项目中,可能有很多常规任务(轮询)和需要及时处理的事件,一旦有改动,干涉的代码就会非常多。

所以出现了RTOS这种兼容常规任务轮询和异常事件及响应兼顾的框架。本身RTOS中的各种IPC(消息队列,信号量,邮箱。。。)本质上都是全局变量(互斥锁与信号量的语义差别见 FreeRTOS中互斥锁和信号),但是RTOS提供了这些API,同时提供了经过高手优化的临界区保护等手段,确保了这些API的安全。程序员使用这些API,可以大大简化程序员的操作,降低了大家开发复杂系统的难度。

另外,RTOS拥有的这一切好处并不是凭空得来的,代价是损失了CPU的计算资源,因为CPU需要再任务之间不停地切换(出栈入栈,上下文保存),这些都是浪费时间的,所以RTOS有个很重要的评价指标,就是RTOS自身任务切换会用掉CPU多少个指令时间。

再者,RTOS对使用者也有要求,比如说tick用多少合适,如果时间太短,那很大部分时间都用在栈切换上了,时间太长,任务轮询的时间刻度就变大了,无法得到及时响应。

总之,在裸机和RTOS之间,没有绝对的谁好谁坏。如果一个人裸机做的很厉害,能够有效规避任务修改对其他任务执行/响应产生的干涉,那肯定没问题。这就好比你跟用C++的人说,我用C结构体也能做出C++类的效果一样,以前用汇编的老前辈大拿也会说C语言没有汇编高效,都是一个道理,只能说各有各的好。

但是,从整个项目生命周期的角度来看,老板肯定不同意用汇编来做项目,这让后面的人根本没法维护;同样,如果用了RTOS,那后面项目在后期维护时,可以招会RTOS的人来快速上手维护。


相关笔记