本帖最后由 太白金星 于 2017-9-8 13:00 编辑
回想过去,用过或多少了解一点儿的操作系统确有一些。20世纪80年代,一个叫做VMS的操作系统风靡全球,是DEC公司小型机上用的,我国也引进了不少DEC计算机。VMS功能齐全、用户界面友好,比Unix好用很多,微机的DOS根本无法与之相比,1986年最先让我们接入因特网的便是VMS。然而曾几何时,VMS被Unix取代了,接着是Linux。VMS消失主要因为其不开源。后来世界公认最牛、想用却用不起的VxWorks实时操作系统(RTOS)也不得不开源了。那时苹果公司的Mac视窗操作系统比PC的Windows好用得多,在操作系统技术方面苹果至少领先Intel五年,也是由于不开放,Mac输给了PC。20世纪90年代以后,操作系统不再神秘,开源成为趋势。
在国外工作期间也接触过一些RTOS,例如OS-9、QNX等,都是不错的RTOS,还有Nuclus,多年前开发Motorola的68K时有所接触,感觉还不错,是最早开放源码的RTOS(如今如何就不了解了)。当年在欧洲,由于是客人,只能用主人选定的RTOS。然而,人家认为很好的未必适合你。曾经不得不用到一个欧洲很流行的RTOS,可文档和程序注解中,英语夹杂着法语,让我这个对法语一窍不通的人恨死那个操作系统了,尽管有法国朋友热情帮忙。Freescale曾经力推MQX,很多事情集成开发环境中都已经做好了,也有不少朋友推荐。读过其部分文档和代码后,就是感觉喜欢不起来。选择操作系统的过程中也走过一段弯路,尝试过将那个著名的非实时操作系统实时化成RTOS,结果事倍功半,只得放弃了。
目前可选用的操作系统的确很多,哪个好哪个不好,由于知识范围所限,实在不敢妄加评论。存在的就是合理的。一些生存多年、有业绩、口碑好、有团队支持的操作系统肯定都是可选用的。不同操作系统有各自不同的定位,选择时首先应考虑本行业认可的操作系统,比选择操作系统更重要的似乎是如何用好选定的操作系统。
嵌入式RTOS通常仅指系统内核(Kernel),内核是操作系统的核心,用于建立多任务运行环境,管理任务及系统的共享资源。操作系统间的差异主要体现在任务调度策略与算法上,不同操作系统以各自的任务管理方式提供必要的实时性保证,解决多任务环境下可能出现的竞争与死锁等问题,是嵌入式系统应用工程师开发嵌入式应用的有力工具。任务调度算法也有很多种,如时间片调度法、保证调度算法、最短任务优先、随机调度法(也称掷骰子)、多重队列法、二级调度法等。这些算法基本上可分为两大类:基于时间片的分时系统和基于优先级的实时系统。基于时间片的多为非实时系统,而嵌入式应用多使用基于优先级的RTOS。除内核外,操作系统通常还需提供与之配套的文件系统、图形界面、互联网协议栈、主从USB协议栈、CAN总线协议栈、系统调试工具等,供用户选配使用。嵌入式RTOS应满足可裁剪、可固化、可移植等基本要求。
行业认可并推荐的操作系统应该是首选。例如汽车行业,首选自然是符合OSEK标准的操作系统(OSEK-OS)。OSEK源自德国的汽车电子类开放系统和对应接口标准,除实时操作系统OSEK-OS外,还有通信子系统(OSEK-COM)和网络管理系统(OSEK-NM)。若开发手机应用软件,在我国自然首选以Java为编程语言的、基于Linux的Android操作系统。
需要自选操作系统的工程师,首先得对各种不同操作系统的内核调度策略有所了解,看看是否适合自己的项目应用。若这方面的知识不够,建议精读一两本关于操作系统的经典教材,以加深对操作系统原理的理解。对于准备使用Linux类型的、有复杂文件系统的、需要MMU硬件支持的非RTOS,建议首先认真读懂Andrew S. Tanenbaum所著的《操作系统设计与实现》一书。该书自1987年问世以来,至今已出到第3版,讲的是一个专门用于教学的、由Unix简化而来的Minix范例操作系统。正是这本书触发了LinusB. Torvalds的灵感,写成了Linux内核,从而被称作Linux之父。故该教材被公认为Linux原理的权威教材,非常值得细读。顺便提一句,Linux是当前最好的非实时开源操作系统,似乎没有之一。非要把它改成实时的所谓RT-Linux,我不认为是一个好的做法,不如直接选用那些本来就是为实时系统设计的RTOS。
邵老师推荐的就是这本图书
对于拟选用嵌入式RTOS的工程师,有必要精读一本Jean J. Labrosse 所著的《嵌入式实时操作系统μC/OS-II》或《嵌入式实时操作系统 μC/OS-III》,这两个操作系统都可以直接拿来使用。对于ARM Cortex-M单片机,如果使用Cortex-M3及以上,应使用μC/OS-III,而对于精简掉CLZ指令的Cortex-M0/M1/M0+等,则仍建议使用μC/OS-II。Cortex-M单片机中的CLZ指令就是专门为优先级算法提供的硬件指令,所用单片机是否带有专门为操作系统设计的硬件指令,也是选择操作系统时要考虑的。读书的同时,特别要注意阅读并欣赏一下书中所附源代码,至少是代码的核心部分。上述推荐读物中的源码写作风格经典规范,注释清晰易懂,非常漂亮,值得学习。操作系统要选好,更要用好。
JeanJ. Labrosse 所著、邵老师等人翻译的μC/OS图书 既然选了开源系统,就要读一读该操作系统的核心代码,弄清楚该操作系统的特点、大致结构,以判断任务调度算法是否符合自己的任务要求。读代码是对代码可读性、代码质量的最好检验。你或许会喜欢上这个操作系统的代码风格,或许对其感到厌恶而弃之。我的体会,个人感觉也很重要。
所选操作系统必须能和项目的硬件匹配。对于手机类应用,系统偶尔死机未必不可接受。但对于嵌入式应用,若系统死机可能造成难以预料的严重后果,那么选择操作系统和写开发及测试程序等就要格外小心了。这类系统被称作安全紧要系统(Safety Critical System),要确保系统安全,不死机或者有故障也能安全,是对这类系统的最低要求。理论上,计算机总是能被“搞死”的,如果操作系统能有什么措施,使系统被搞死的几率低于硬件损坏的几率,那就足够好了。但实践证明,单靠操作系统和应用软件并不能保证系统不死机。硬件的可靠性是需要硬件工程师来保证的。那些自称面向多核单片机的操作系统,在解决系统受到强电磁干扰而出错的问题上,显然不及两套独立供电的单核系统更为可靠。
如果采用C语言开发对系统安全性要求特别高的安全紧要系统,还要特别注意所选RTOS与MISRA-C编程规范的符合程度,该规范虽然是由汽车工业软件可靠性联合会制定的,但在国防、航空航天、电信、铁路、医疗等领域的用户远多于汽车领域。当然首先是嵌入式应用工程师本人开发的C程序,要经得起MISRA检验。
|