RTOS的ABC讨论
学习和应用 RTOS 好多年了。对RTOS的发展和应用有一些粗浅的想法。尤其认识了RAW OS(一款新的RTOS)的作者后,就更多的想法。就写在这里,让大家拍砖吧。
我心里一直对这几个问题耿耿于怀。
1、什么行业在什么情况下应用RTOS?
2、RTOS能解决什么样的问题?解决不了什么样的问题?
RTOS,稍微知道点技术的人都知道是Real-Time Operating System,意为实时操作系统,但“实时”这两个字却并不好理解。有硬实时和软实时之分。硬实时,可以理解为一个计算过程不仅仅依赖于计算结果的正确性,还依赖于结果的返回时间。操作系统可以保证这个时间的正确性。软实时,这个时间就不怎么太保证,偶尔的会超出,仅仅有统计上的意义。不严谨的说是这个意思。
因为要实时,所以调度算法不能使用普通的调度算法,调度算法有很多种;RTOS使用单调速率调度算法(RMS, Rate-Monotonic Scheduling)。当然,调度算法还有其他的种类,比如说最早截止时间优先算法(EDF)和最短空闲时间优先算法(LLF),不过这些算法都是实验室里的算法。现在是这样,恐怕以后也是这样。还是RMS独领RTOS。RMS有一些假设,在这个假设的前提下,任务的执行时间不能超过70%,否则处理器调度不过来这些任务。但是这个假设比较的严格,适当的放宽后可以达到80%甚至85%。有兴趣的朋友可以读读相关的论文。
[1] Scheduling Algorithms for Multiprogramming in a Hard-Real-Time Environment, C.L.Liu
[2] Scheduling hard real-time systems: a review, A. Burns
[3] The Rate Monotonic Scheduling Algorithm: Exact Characterization And Average Case Behavior, John Lehoczky, Lui Sha, Ye Ding
看了之后,不禁佩服这些先哲,早已把这些问题看得这么透。我们只需要应用就好了。
市面上有许多RTOS操作系统,threadx, freeRtos, uC/OS-II, rtems, QNX, LynxOS, VxWorks, raw OS, ecos, NuttX……太多了。我们用了实时操作系统以为自己的应用就装进了保险箱,可是,Liu早就在1973年告诉我们,RMS算法是个静态的调度算法,也就是说,在应用运行之前,必须对应用做合理的分析。使得RMS可以调度该任务集,这样才能保证是实时的。换句话说,就是要分析一下,咱写的任务能不能让CPU调度过来,还要合理分配优先级。RTOS只是为我们提供好一个基石,而我们在这个基石上要构建我们的应用,还需要进一步的详尽的设计来保证RMS的正常工作。
什么行业什么情况下应用rtos呢?这个问题困扰了我很久,我之所以进入Rtos这个领域,完全是因为rtos操作系统经常与嵌入式三个字挂着钩。工作就与MCU打交道,久了自然就与rtos熟悉了。环顾四周,一般都是做一些单片机应用的公司用rtos。因为rtos已经移植好了,选了它,可以不用费心去写驱动,不用花力气去搞编译脚本,不用去费力气去调试底层。应用随便往上一放就好,可以说不费吹灰之力。 我身边大多数的公司都是这样,他们应用了rtos,甚至不知道硬实时和软实时的区别,甚至不知道硬实时对任务集调度时间有要求(不能超过70%)。 这类应用就是图方便,实惠,免费。
再有就是军事部门用的系统,我有朋友在中科院做高速并行计算平台,用VxWorks。通过分析,大多数时候,这种应用要得仅仅是性能,而不是实时。因为足够的快就行了。如何足够的快,首先要微内核,在然后就是内核可剥夺。可以说,RMS算法的副产品性能恐怕才是他们真正需要的。
我们的嫦娥,神9上天了,听说里面用得rtems只剩下“芯”了。我一个从事这方面的朋友对我说,因为你不熟悉,上天的东西没你想的那么先进。其实东西很老旧的,都是40MHz、50MHz的星载处理器(其实就是咱们用的powerpc和sparc等cpu防辐射加强版)。要得就是可靠性。我一想是啊,上了天了,坏了不能再发个飞船去修啊。那还不如重新搞个新的上天呢。rtos的可靠性,稳定性;由于硬实时的一个最大的好处,就是行为可预测,加上RTOS的实现的简洁,大量的测试。rtos的可靠性和稳定性是非linux和windows这样的桌面级操作系统能比的。(Ps, linux新内核也在弄rtos的部分,可以关注啊)
和Raw OS的作者聊起,他说 RTOS 做通用的控制。加上我的一点点行业经验,RTOS的应用领域包括部分的工业控制和一些医疗、航空航天电子,极小部分的消费类电子。绝大部分需要实时性的项目,其实里面真正需要实时的任务也不过就那么几个(一般不超过3个)。并不是每个任务都需要实时,那是不切实际的。