从一个操作体系到另一个操作体系运用程序的移植即便在最好的情况下也常常是一个艰巨的使命。把一个实时的嵌入式运用程序移植到一个新的操作体系上可以说是一项最困难的使命。
为了协助开发人员计划在不久的将来转移到嵌入式Linux上,或许考虑将现有的运用程序运转在嵌入式Linux上这种出资的必要性,Jim 解说了这一转化的进程,评价了涉及到的困难和应战,而且论述了知道这种转化的好处。
越来越多的公司正在转向嵌入式Linux,把它作为他们下一代产品的操作体系。可是他们曾经都是运用实时操作体系作为他们的嵌入式体系。事实上,VDC的陈述显现了嵌入式Linux可以占到32位和64位范畴规划的三分之一,是其他一切嵌入式体系的两倍。
很明显,关于从旧式RTOS产品的运用程序移植到Linux的可行性的问题有必要得到答复,由此这种移植才可以被有用的用于工程办理。
一个典型的根据RTOS的运用程序依赖于许多要素,其间最重要的是编程/内存模型、API、功能、特别是实时呼应的才能。别的一个重要的考虑是软件开发环境,但那是软件环境文章值得评论的论题。
编程模型
简直一切运用的RTOS有一个简略的编程模型,它由多线程的履行(一般称为使命)构成,包含在单一的地址空间中。举例来说,一个c言语的程序有一个单一的主函数,它创立一切其他的线程。每一个线程顺次被界说为总程序中的一个c函数。典型的,不管是RTOS还对错维护内存中的运用程序,他们的物理地址和逻辑地址都是相同的。或许会有一些超级用户形式下的操作运用约束了在用户形式下的运用程序宣布一些指令。基本上,一切的内存关于运用程序来说是虚拟的。
在曩昔,大大都嵌入式处理器没有内存办理单元,因而RTOS单地址空间形式是有必要的。可是今日大大都的中高端处理器装备了MMU,因而假如需要的话,MMU可以办理内存。
该体系结构的描绘提出了一个移植RTOS代码到Linux上的简略架构。
RTOS的悉数运用代码移植到一个Linux单进程
RTOS的使命转化成Linux线程
RTOS的物理地址空间映射到Linux的虚拟地址空间
比如VME机架的多板或多处理器架构,移植到一个多进程的Linux运用。
构架上的考虑:进程和线程的创立
是否运用遵从API的VXWORKS和PSOS等RTOS仿真软件包,开发人员终究有必要决议是否将线程或是进程作为履行RTOS的使命。在这点上,Linux内核对待不管是线程仍是进程都是平等的,都是以调度为意图。可是不同的API创立和办理每个实体的类型、功能、资源的本钱和好处都是相关的。
一般来说,进程比线程大一点,由于他们传送着更多的上下文信息。一个Linux线程的上下文如同RTOS的一个使命,首要由cpu寄存器、仓库、当时的程序指针以及一些内核数据结构的进口组成。一个进程加上一个完好的虚拟地址空间。这样,至少内核有必要创立和盯梢进程的页转化、一切代码的类型、上下文、数据等。关于重量级进程上下文的首要影响有两点:创立的时刻和彼此的上下文切换时刻。
只需或许,RTOS的代码都会争夺要轻量级的履行。相同的,当许多RTOS供给了动态的使命创立API,其他以静态使命界说页表为特征,一切RTOS的商家不鼓舞运用频频的使命创立以节省时刻和空间。Linux进程的创立不是故意那么费事;Linux进程是重量级的,由于他们供给了更多的维护性和依赖性。
这个了解地旧式的架构,由于简略,所以十分简单遭受损坏。正在运转的使命可以掩盖运用程序的代码和数据,别的还会写入到外围设备的寄存器、损坏内核的数据结构、掩盖内核代码。使命的仓库可以很简单的溢出,而且一个接一个被掩盖掉或许经过操控内存来损坏堆的顶部、其他数据或许邻近的代码。
更高的层次来说,这种非正式有组织的,高度非讳饰的架构提出了关于代码质量的两个首要应战:本身的失利时机以及和首要事情再次失利的结合。
当单个使命或许其他软件组件失利了,它失利的原因简直不或许被定位。甚至当检测到失利而且测验康复时分会以整个体系的失利而完毕。监督代码不行以常常安全地重启使命,RTOS不行以康复由失利使命动态定位的资源。成果便是复位一般是经过强制运用看门狗定时器来完结的,看门狗定时器重新启动整个体系或许软件引起的体系过错。
一般当一个程序跑飞了,它没有任何预兆。一个过错的使命可以损坏在RTOS体系中任何地方的数据和代码。走运的是,虽然这些损坏的影响瞬间发生,可是如同损坏的影响会在几秒、几小时、几个月今后才会呈现。
当反常的预兆呈现了,去联想料想不到的运用程序行为是及其困难的,这些行为由于原始的原因或许是很细小的,或许是损坏性的。
Linux编程模型的内部编译的可靠性
Linux作为一个unix兼容的操作体系代表着一个愈加强壮的运用和体系编程模型。运用程序履行在他们受维护的地址空间,由于它们之间的地址彼此是不行见的,而且它们经过硬件的MMU来防备掩盖掉他们自己的代码,MMU呈现在大都现代化的32位64位的处理器中。
当他们同享Linux内核的虚拟地址空间时,他们不行以掩盖内核代码或数据。已然进程不行以彼此看到,他们就不行以彼此损坏数据或代码
API和实时库
在开源规范曾经,RTOS的制作者界说了他们自己的体系调用或API,这关于每个RTOS的制作者来说都是绝无仅有的。接口函数是为盛行的编程言语而供给的,比如c、c++,这使得API函数关于运用高档言语的程序员是适宜的。
在曩昔的十年中,虽然只要POSIX规范的一部分和嵌入式运用程序相关,大大都的RTOS制作者仍是给规范的POSIX供给了兼容库。许多客户运用他们自己的API集使本地RTOS接口分层以取得独立性和快捷性,而不是想被确定成为一个私有的特别版权的接口。
开发人员运用规范的API树立运用程序来取得两单个的的意图:答应代码被移植成像Linux那样的规范操作体系以及答应今后相同的代码在这样的一个环境下比运用私有的API愈加简单移植。
许多包含规范调用的商业RTOS以POSIX或许BSD来设定,可是那些API常常只存在于windows下。特别是一个内核私有的API是最常被运用的,便是这些API确定了项目到一个特别的渠道或许解决方案。
假如开发人员正在移植规范的代码或许考虑哪个API运用到新的代码中,那么了解在Linux和其他操作体系中运用的最遍及的规范对错常重要的。