汽车实时操作系统_linux汽车操作系统导入开机动画 - CSDN
  • 什么是实时操作系统

    2013-10-23 23:37:11
    1. 首先说一下实时的定义及要求: ...中提出定义:实时系统系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。 http://www.faqs.org

    转自:http://club.topsage.com/thread-513248-1-1.html

    1. 首先说一下实时的定义及要求:


    参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。

    http://www.faqs.org/faqs/realtime-computing/faq/

    一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows在CPU空闲时可以提供非常短的典型中断响应,但是,当某些后台任务正在运行时,有时候响应会变得非常漫长,以至于某一个简单的读取文件的任务会长时间无响应,甚至直接挂死。这是一个基本的问题:并不是Windows不够快或效率不够高,而是因为它不能提供确定性所以,Windows不是一个实时操作系统


    根据实际应用,可以选择采用硬实时操作系统或软实时操作系统,硬实时当然比软实时好,但是,如果你的公司正在准备开发一款商用软件,那请你注意了,业界公认比较好的VxWorks(WindRiver开发),会花光你本来就很少的银子,而软实时的操作系统,如某些实时Linux,一般是开源免费的,我们公司本来的产品就是基于VxWorks的,现在业界都在CostReduction,为了响应号召,正在调研如何把平台换成免费的嵌入式实时Linux。同学们,如何选择,自己考虑吧:-)

    硬实时 - 代表产品 VxWorks
    举一个经常使用的实例,中高档汽车中使用的气囊。当报告车辆碰撞的传感器中断CPU后,操作系统应快速地分配展开气囊的任务,并且不允许任何其他非实时处理进行干扰,晚一秒钟展开气囊比没有气囊的情况更糟糕,这就是一个典型的必须使用硬实时的系统。

    硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足。


    软实时 - 代表产品 软实时Linux


    再举一个实例,IPTV数字电视机顶盒,需要实时的处理(解码)视频流,如果丢失了一个或几个视频帧,显然会造成视频的品质更差,但是只要做过简单的抖动处理的系统,丢失几个视频帧就不会对整个系统造成不可挽救的影响。

    软实时系统就是那些从统计的角度来说,一个任务能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误。

    ---------------------------------------------

    请注意:讲到这里,想花点墨水区分一下实时和嵌入式的概念,因为笔者也长时间把这两者混为一谈。实时操作系统的概念上文已经讲的很清楚了,主要就是要能确定性的满足时间要求。嵌入式系统很难下一个定义,有兴趣的可以百科一下“嵌入式系统”,一般可以认为是板子或芯片上软硬件的总和,嵌入式系统一定要对实时任务有很强的支持能力,所以一般嵌入式系统都会采用实时操作系统,根据不同应用,选择采用硬实时或软实时。
    ---------------------------------------------

    2. 如何衡量一个实时操作系统的实时性能?


    主要有以下两个重要指标:


    指标1、中断响应时间(可屏蔽中断)


    计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。对于抢先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。抢先式内核的中断响应时间由下式给出:

    中断响应时间=关中断的最长时间+保护CPU 内部寄存器的时间+进入中断服务函数的执行时间+开始执行中断服务例程(ISR)的第一条指令时间


    请注意:中断响应时间是系统在最坏情况下响应中断的时间,某系统100次中有99次在50ms之内响应中断,只有一次响应中断的时间是250ms,只能认为中断响应时间是250ms。 


    指标2、任务切换时间


    除为中断处理提供确定性外,实时处理也需要支持周期性间隔的任务调度。大量控制系统要求周期性采样与处理。某个特定任务必须按照固定的周期(p)执行,从而确保系统的稳定性。考虑一下汽车的防抱死系统(ABS)。控制系统对车辆的每个车轮的转速进行采样(每秒最多 20次)并控制每个制动器的压力(防止它锁死)。为了保持控制系统的正常工作,传感器的采样与控制必须按照一定的周期间隔。这意味着必须抢占其他处理,以便ABS 任务能按照期望的周期执行。

    当多任务内核决定运行另外的任务时,它把正在运行任务的当前状态(即CPU寄存器中的全部内容)保存到任务自己的栈区之中。然后把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。做任务切换所需要的时间取决于CPU 有多少寄存器要入栈。CPU的寄存器越多,额外负荷就越重。 

    系统实时性能重要指标的典型值
    -----------------------------------------------------
                      VxWorks    uC/OS-II        RT-Linux2.0  QNX6  
    硬件平台  MC68000  33MHz-486  60MHz-486   33MHz-486  
    任务切换  3.8us          < 9us            不详                12.57us  
    中断响应  < 3us          < 7.5us         25us                7.54us  
    -----------------------------------------------------


    参考文献:《4种实时操作系统实时性的分析对比》 - 百度一下可以搜到


    3. 实时操作系统的核心 - 任务调度(VxWorks)


    既然实时性对于实时操作系统如此重要,同学们,我们下面就来学习一下实现实时性的核心模块 -任务调度。笔者所在的公司花了大把银子购买风河的VxWorks,但是为了实现自己的可控性,除了任务调度模块以外全部重写,包括内存管理、文件管理等其他核心模块,但唯独任务调度模块除外,这可是人家的压箱底法宝:-)


    构成应用软件系统的程序集合中,独立的、相互作用的程序单元,在其执行时称之为任务,从系统的角度来看,任务是竞争系统资源的最小运行单元。单个CPU中,多任务机制制造了一个多个任务同时执行的假象。其实系统只是根据一个多任务调度算法,将内核插入到这些任务中执行。实时系统VxWorks的一个任务可有多种状态,但最基本的状态有以下四种:

    1) 就绪态(Ready):任务只等待系统分配CUP资源。
    2) 挂起态(Pend):任务需等待某些不可利用的资源而被阻塞。
    3) 休眠态(Sleep):如果系统不需要某一个任务工作,则这个任务处于休眠状态。
    4) 延迟态(Delay):任务被延迟时所处的状态。


    大家可以在网上搜一下VxWorks任务调度的相关文章,一般都会配状态机图。

    ----------------------------


    请注意:任务(task)、进程(process)、线程(thread)等概念相互联系又相互区别,因为不是本文的重点,这里不多解释,如果想详细了解推荐看一看“Windows Kernel Programming”。在VxWorks中,因为每个任务没有自己独立的虚拟内存空间,可以把任务理解为线程。 
    ----------------------------


    任务由系统内核调度运行一段固定长度的时间,称为时间片。调度是指为任务分配资源和时间,使系统满足特定的性能要求。调度算法的目的是在正常情况下,尽可能满足所有任务的时限:在峰值负载条件下,保证强实时任务满足时限。因为时限是区分实时系统和非实时系统的关键因素,因此调度算法是实时系统的基本问题。实时操作系统所具有的运行性能,如吞吐量的大小、周转时间的长短、相应的及时性和可预测性等在很大程度上都取决于实时调度。


    进程调度可采用下述两种方式:


    1. 非抢占方式。采用这种调度方式,一旦把处理机分配给某进程后,便让该进程一直执行,直到该进程完成或发生某事件而被阻塞,才再把处理机分配给其他进程,决不允许某进程抢占已经分配出去的处理机。显然它难于满足紧急任务的要求,实时系统中不宜采用这种调度方式。
    2. 抢占方式。允许调度程序根据某种原则,去停止某个正在执行的进程,将已分配给该进程的处理机,重新分配给另一进程。抢占的原则有:

    - 时间片原则。各进程按时间片运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。


    -优先权原则。当一个进程到来时,如果其优先级比正在执行的进程的优先级高,便停止正在执行的进程,将处理机分配给优先级高的进程,使之执行。实时系统中一般采用基于优先级的抢占式调度和轮转调度的进程调度和中程调度相结合的调度策略。因此既可具有较大的灵活性,又能获得极小的调度延迟。

    VxWorks的wind内核缺省调度机制为基于优先级的抢占式调度。采用这种机制时,系统把处理机分配给优先级最高的进程,使之执行。一旦出现了另一个优先级更高的进程时,进程调度程序剥夺当前任务的执行,将处理机分配给高优先级任务。而在相同优先级的多个任务之间,采用时间片轮转调度机制。采用这种机制时,当一个任务到达时,它被排在轮转队列的后面,等待分配给自己的时间片的到来,如果在时间片内没有结束,则再等待属于自己的时间片的到来,直到任务完成。

    - 优先级抢占式
        采用基于优先级的抢占式调度,系统中每个任务都有一个介于最高0到最低255之间的优先级。任一时刻,系统内核一旦发现一个优先级更
    高的任务转变为就绪态,内核就保存当前任务的上下文并把当前任务状态转换为阻塞态,同时切换到这个高优先级任务的上下文执行。


    - 轮转调度算法
        采用轮转调度算法,系统让处于就绪态的优先级相同的一组任务依次轮流执行预先确定长度的时间片。这是一种处理机平均分配的方法。如果不使用轮转调度算法,优先级相同的一组任务中第一个获得处理机的任务将不会被阻塞而独占处理机,如果没有阻塞或其他情况发生,它
    不会放弃处理机的使用权。
    - 抢占调度与轮转调度混合方式


        有时,基于优先级的抢占式调度可与轮转调度相结合。当优先级相同的一组任务依次轮流平均分配处理机时,若有高优先级的任务转变为
    就绪态则可抢占该组任务。直到再一次符合执行条件时,该组任务才可再次共享处理机。


        为了任务控制的灵活性,VxWorks内核还提供了动态优先级机制,任务的优先级在运行期间可动态地变化。同时,为了防止优先级反转,还具有优先级继承机制,通过使用互斥信号量可以防止高优先级的任务被迫等待一段不确定时间,直到一个低优先级任务完成。


    参考文献:《实时操作系统VxWorks的内核任务调度研究》 - 百度一下可以搜到


    4. Linux的任务调度


    通用Linux系统支持实时和非实时两种进程,实时进程相对于普通进程具有绝对的优先级。对应地,实时进程采用SCHED_FIFO或者SCHED_RR调度策略,普通的进程采用SCHED_OTHER调度策略。

    在调度算法的实现上,Linux中的每个任务有四个与调度相关的参数,它们是rt_priority、policy、priority(nice)、counter。调度程序根据这四个参数进行进程调度。

    在SCHED_OTHER调度策略中,调度器总是选择那个priority+counter值最大的进程来调度执行。从逻辑上分析SCHED_OTHER调度策略存在着调度周期(epoch),在每一个调度周期中,一个进程的priority和counter值的大小影响了当前时刻应该调度哪一个进程来执行,其中priority是一个固定不变的值,在进程创建时就已经确定,它代表了该进程的优先级,也代表这该进程在每一个调度周期中能够得到的时间片的多少;counter是一个动态变化的值,它反映了一个进程在当前的调度周期中还剩下的时间片。在每一个调度周期的开始,priority的值被赋给counter,然后每次该进程被调度执行时,counter值都减少。当counter值为零时,该进程用完自己在本调度周期中的时间片,不再参与本调度周期的进程调度。当所有进程的时间片都用完时,一个调度周期结束,然后周而复始。另外可以看出Linux系统中的调度周期不是静态的,它是一个动态变化的量,比如处于可运行状态的进程的多少和它们priority值都可以影响一个epoch的长短。值得注意的一点是,在2.4以上的内核中,priority被nice所取代,但二者作用类似。

    可见SCHED_OTHER调度策略本质上是一种比例共享的调度策略,它的这种设计方法能够保证进程调度时的公平性--一个低优先级的进程在每一个epoch中也会得到自己应得的那些CPU执行时间,另外它也提供了不同进程的优先级区分,具有高priority值的进程能够获得更多的执行时间。对于实时进程来说,它们使用的是基于实时优先级rt_priority的优先级调度策略,但根据不同的调度策略,同一实时优先级的进程之间的调度方法有所不同:

    -SCHED_FIFO:不同的进程根据静态优先级进行排队,然后在同一优先级的队列中,谁先准备好运行就先调度谁,并且正在运行的进程不会被终止直到以下情况发生:1.被有更高优先级的进程所强占CPU;2.自己因为资源请求而阻塞;3.自己主动放弃CPU(调用sched_yield); 


    - SCHED_RR:这种调度策略跟上面的SCHED_FIFO一模一样,除了它给每个进程分配一个时间片,时间片到了正在执行的进程就放弃执行;时间片的长度可以通过sched_rr_get_interval调用得到; 

    由于Linux系统本身是一个面向桌面的系统,所以将它应用于实时应用中时存在如下的一些问题:

    - Linux系统中的调度单位为10ms,所以它不能够提供精确的定时; 
    - 当一个进程调用系统调用进入内核态运行时,它是不可被抢占的; 
    - Linux内核实现中使用了大量的封中断操作会造成中断的丢失;


    - 由于使用虚拟内存技术,当发生页出错时,需要从硬盘中读取交换数据,但硬盘读写由于存储位置的随机性会导致随机的读写时间,这在某
    些情况下会影响一些实时任务的截止期限; 
    - 虽然Linux进程调度也支持实时优先级,但缺乏有效的实时任务的调度机制和调度算法;它的网络子系统的协议处理和其它设备的中断处理都没有与它对应的进程的调度关联起来,并且它们自身也没有明确的调度机制;


    参考文献:《基于Linux的实时系统》 - 百度一下可以搜到


    5. 实时Linux研究


    呼哧呼哧写了半天,终于到了重头戏,实时Linux研究。前文说过,风河的VxWorks虽然性能大大的好,但是要花很多银子,对于一般的软实时应用系统来说,还是用开源免费的实时Linux比较好。笔者所在的公司也正在研究将平台转为Linux。有许多种方法可以赋予普通Linux实时的能力:


    5.1 瘦内核(微内核)- Thin-Kernel


    瘦内核(或微内核)方法使用了第二个内核作为硬件与 Linux 内核间的抽象接口。非实时 Linux内核在后台运行,作为瘦内核的一项低优先级任务托管全部非实时任务。实时任务直接在瘦内核上运行。瘦内核主要用于(除了托管实时任务外)中断管理。瘦内核截取中断以确保非实时内核无法抢占瘦内核的运行。这允许瘦内核提供硬实时支持。






    虽然瘦内核方法有自己的优势(硬实时支持与标准 Linux 内核共存),但这种方法也有缺点。实时任务和非实时任务是独立的,这造成了调试困难。而且,非实时任务并未得到 Linux 平台的完全支持(瘦内核执行称为瘦 的一个原因)。



    使用这种方法的例子有 RTLinux (现在由 Wind River Systems 专有),实时应用程序接口(RTAI)和 Xenomai。


    5.2 超微内核

    这里瘦内核方法依赖于包含任务管理的最小内核,而超微内核法对内核进行更进一步的缩减。通过这种方式,它不像是一个内核而更像是一个硬件抽象层(HAL)。超微内核为运行于更高级别的多个操作系统提供了硬件资源共享。因为超微内核对硬件进行了抽象,因此它可为更高级别的操作系统提供优先权,从而支持实时性。






    注意,这种方法和运行多个操作系统的虚拟化方法有一些相似之处。使用这种方法的情况下,超微内核在实时和非实时内核中对硬件进行抽象。这与 hypervisor 从客户(guest)操作系统对裸机进行抽象的方式很相似。 

    关于超微内核的示例是操作系统的 Adaptive Domain Environment for Operating Systems(ADEOS)。ADEOS 支持多个并发操作系统同步运行。当发生硬件事件后,ADEOS对链中的每个操作系统进行查询以确定使用哪一个系统处理事件。 


    5.3 资源内核(Resource-kernel)

    另一个实时架构是资源内核法。这种方法为内核增加一个模块,为各种资源提供预留(reservation)。这种机制保证了对时分复用(time-multiplexed)系统资源的访问(CPU、网络或磁盘带宽)。这些资源拥有多个预留参数,如循环周期、需要的处理时间(也就是完成处理所需的时间),以及截止时间。










    资源内核提供了一组应用程序编程接口(API),允许任务请求这些预留资源。然后资源内核可以合并这些请求,使用任务定义的约束定义一个调度,从而提供确定的访问(如果无法提供确定性则返回错误)。通过调度算法,如 Earliest-Deadline-First(EDF),内核可以处理动态的调度负载。

    资源内核法实现的一个示例是 CMU 公司的 Linux/RK,它把可移植的资源内核集成到 Linux 中作为一个可加载模块。这种实现演化成商用的 TimeSys Linux/RT 产品。

    5.4 标准的Linux内核最新版本2.6中加入了实时功能

    目前探讨的这些方法在架构上都很有趣,但是它们都在内核的外围运行。然而,如果对标准 Linux 内核进行必要的修改使其支持实时性,结果会怎么样呢?


    今天,在 2.6 内核中,通过对内核进行简单配置使其完全可抢占,您就可以得到软实时功能。在标准 2.6 Linux内核中,当用户空间的进程执行内核调用时(通过系统调用),它便不能被抢占。这意味着如果低优先级进程进行了系统调用后,高优先级进程必须等到调用结束后才能访问 CPU。


    新的配置选项 CONFIG_PREEMPT 改变了这一内核行为,在高优先级任务可用的情况下(即使此进程正在进行系统调用),它允许进程被抢占。 






    但这种配置选项也是一种折衷。虽然此选项实现了软实时性能并且即使在负载条件下也可使操作系统顺利地运行,但这样做也付出了代价。代价就是略微减低了吞吐量以及内核性能,原因是 CONFIG_PREEMPT 选项增加了开销。这种选项对桌面和嵌入式系统而言是有用的,但并不是在任何场景下都有用(例如,服务器)。 

    在 2.6 内核中另一项有用的配置选项是高精度定时器。这个新选项允许定时器以 1μs 的精度运行(如果底层硬件支持的话),并通过红黑树实现对定时器的高效管理。通过红黑树,可以使用大量的定时器而不会对定时器子系统(O(log n))的性能造成影响。 


    只需要一点额外的工作,就可以通过 PREEMPT_RT 补丁实现硬实时。PREEMPT_RT补丁提供了多项修改,可实现硬实时支持。其中一些修改包括重新实现一些内核锁定原语,从而实现完全可抢占,实现内核互斥的优先级继承,并把中断处理程序转换为内核线程以实现线程可抢占。
    展开全文
  • RTOS新特征适应高档汽车应用■ 李梅改善对分布式系统和多核系统的支持,RTOS可以满足高档汽车应用的需求。 我们的街道和高速公路正在变成嵌入式网络流动的线路图,这些由许多嵌入式系统组成的网络装在车轮上,随处...

    RTOS新特征适应高档汽车应用


    ■ 李梅



    改善对分布式系统和多核系统的支持,RTOS可以满足高档汽车应用的需求。

    我们的街道和高速公路正在变成嵌入式网络流动的线路图,这些由许多嵌入式系统组成的网络装在车轮上,随处流动。现代汽车完全可以说是一个计算平台,它有超过50个嵌入式处理器,计算机软件代码超过百万行。由于汽车制造商的注意力已经集中在“在任何可能的地方使用非定制的软件”,所以汽车公司内部的汽车规格的软件开发部门未来的工作重点是将其实践经验和独特的创造力用于汽车软件的需求制定和标准化方面。

    嵌入式系统的许多基本问题都可以通过实时操作系统(RTOS)来解决。一个很好的例子就是欧洲汽车工业OSEK/VDX 组织已经为汽车分布的嵌入式控制单元定义一个标准的架构。OSEK/VDX 要求RTOS能够很好地满足汽车嵌入式控制单元在动力系统、底盘与悬梁、车身电子等方面的需求。OSEK/VDX正在成为当前国际汽车工业界占据主导地位的汽车电子开放式系统及其接口的软件规范体系

    显然,OSEK/VDX还不能满足未来汽车应用在高性能传导系统、信息娱乐、安全与生命等方面的需求。很多人认为实时操作系统(RTOS)相当于软件中的赛车,要求小、快、高度协调。除此之外,一个好的RTOS能使应用系统始终满足时限的要求,能对任何时间要求苛刻的事件做出响应,在正确的时间做一个正确的动作。

    为高端汽车应用的可供选择的大量RTOS正在日益完善,以适应这些需求。

    RTOS内核

    大多数的RTOS内核均支持任务调度的基于优先权抢先占有机制。在RTOS中,过程按优先级执行。时限紧迫的过程投入运行时,可以立即从低优先级的过程接管CPU。高优先级过程在结束前,能一直继续运行,除非它被一个更高优先级的过程所抢占。这种“抢占” 调度方式可以使对于时间要求严格的过程满足时限的要求。

    一些RTOS也提供一些已经实践检验的任务调度选择,如最终任务调度或者分区调度等。它也提供存储器分配调度,以管理大容量RAM存储空间,就像设备I/O管理程序管理和组织大量的不同的设备驱动程序一样。例如,一个设备I/O管理程序对于管理一系列通信设备驱动程序如汽车远程通信系统中经常出现的驱动程序等是非常有效的。驱动程序可以包括:控制区域网 CAN (Controller Area Network)、局部互联协议LIN (Local Interconnect Network)、IEEE1094、高速容错网络协议FlexRay和用于汽车多媒体和导航的媒体定向系统传输MOST (Media-Oriented Systems Transport)等。

    为了提高系统的可靠性,RTOS一方面要对存储器进行保护;另一方面是在分布式系统环境下,可以将应用的任务分派到多个CPU,即使一个CPU失效,也不会停止应用程序的工作。

    分布式应用有它自己要解决的问题,例如,对大多数的RTOS,一般需增加为应用服务的专用的网络程序,使接在网络上的CPU能相互“对话”,进行服务。此外对于大多数RTOS,驱动程序、协议和应用程序是与内核紧密相连的,要把它们从一个核搬移到另一个核,需要建立一个适合各个CPU的新内核的映像,并仔细地对它进行测试。

    微核RTOS从两方面来解决这个问题:首先,使应用程序、协议和驱动程序全都与操作系统脱离,从而使它们从一个CPU 搬移到另一个CPU时,可以不需要对内核重新配置;其次,在微核操作系统中应用程序间通信的典型情况是通过传递消息进行的,如果实现得好,可不需要专用的网络程序。例如,当应用A发送一个消息到应用B时,它不用去了解应用B是使用同一个CPU板,还是由网络连接的另一个CPU。结果任何CPU上的一个过程可以对任何其他机器上的任何资源进行显式的存取,这个网络就像单个计算机那样工作。

    设备I/O监控程序提供一个标准的通道,让应用软件任务可以操作各种驱动程序。未来RTOS内核解决的主要问题应该是内部任务的通信与同步。

    间接与直接的消息传递机制

    大多数的RTOS为内部任务的通信提供了多种形式的异步消息传递机制。异步消息传递机制是对数据传输从一个任务到另一个任务的一种简单和松散连接方式。一个任务给另一个任务传递一个消息时,并不用等到接受任务发回任何的确认信息。

    不同的RTOS实施异步通信机制的方式各不相同。不过最简单的概念型的方法被称为直接异步通信机制,就是一个任务直接对另一个任务发送消息,如图1所示。


    图1 内部任务通信的直接消息传递机制

    这是一种直截了当和最佳的软件设计模型。而在另一方面,采用间接异步消息传递机制,应用软件会受到任务发送和接受消息的消息队列的影响,如图2所示,这是一个吃力不讨好的软件设计模型。


    图2 内部任务通信的间接消息传递机制

    对于一些高复杂性应用,如汽车信息娱乐(Infotainment)系统和安全系统,通过采用内部任务直接消息传递机制可以很好地控制软件的复杂性。基于同样的原因,直接消息传递机制在多核、分布式多核处理器和容错汽车系统设计中也是首选的通信机制。

    对分布式和多核系统的支持

    通过一个可选的附加的被称为Link Handlers的RTOS部件,就可以支持分布式和多核系统。


    图3 Link Handlers提供的通过处理器边界的消息传递方式

    Link Handlers为运行在不同的处理器之间的应用提供一个异步消息传递方式,它是在传统的通信网络环境下一流的和普遍的选择。Link Handlers通过使用一样的异步直接消息传递模型,并将其扩展到了分布式和多核多处理器系统来完成这一工作。目前大多数的RTOS内核在同一处理器中的任务到任务的通信就采用了异步直接消息传递模型。它保证在系统里各种不同的处理器是完全对等的。

    Link Handlers并不需要应用软件理解分布式系统的结构。实际上,一个任务的通信助手所在的位置对应用软件是透明的:仅当消息在一个任务传向另一个任务时应用代码才会连接。Link Handlers为消息通过处理器边界提供逻辑通道,而消息通过处理器的方式对应用软件是透明的。

    当使用Link Handlers时,连接各种处理器的物理通道可选的范围很广,如网络、串行或总线连接,以及共享存储结构。这些连接基于Handlers的透明通信模型,使得在一个分布式汽车系统里采用异构处理器包括数字信号处理(DSP)成为可能。

    高安全性和高可用性支持

    除了完成消息传递以外,Link Handlers也必须与运行在其他处理器上的“监视”任务协同工作,而这些处理器的出席对一些应用是至关重要的。当一些关键任务失败或者变得难以实现时,在任何处理器上运行的其他的任务会很快得到出现问题的通报。这些支持“监视眼”机制的RTOS对设计高安全、高可用性和基于冗余的容错系统大有好处。RTOS的Link Handlers在容错系统探测和报告上有一定的开销,因此卸载很多与此相关的应用代码也很必要。

    下一代的RTOS也应该提供快速的应用软件现场在线更新工具,不需要应用系统停止工作,以重新上载、修订或者卸载软件。这一功能通常被成为热交换。监视眼和热插拔一起成为RTOS基层架构的主要内容,支持高安全性和高可用性系统的设计。

    内存保护

    内存保护是面向安全的RTOS的另一个重要因素。 RTOS应该好好利用存储器管理单元,这是一个大多数现代微处理器中都有的构成部件。以传统的“平铺”(flat)体系结构为例,大多数“成品的”或“自建的”RTOS仍在使用这种体系结构。它把所有的模块放在同一个地址空间中,作为操作系统的内核,没有任何存储器的保护。结果任何模块,不管它是多么无关紧要,也能通过内核对存储器进行重写,有可能导致整个系统的崩溃。

    有少数的RTOS针对这个问题,使应用程序运行在分离的有存储器保护的地址空间。RTOS与处理器硬件的MMU(内存管理单元)一起保护处理器内存免受非授权的存取访问。如果一个应用程序试图侵害存储器,MMU就会捕获这个错误,从而把这个问题隔离开来。但不幸的是,这些操作系统仍和驱动程序、协议、文件系统绑在一起,并且其他系统可对此内核服务,从而使得这些模块中的任何一个都能导致内核发生致命的错误。

    不过,一些RTOS 的微核体系结构则向前迈了一步,可使任何系统级的软件部件在其各自的MMU所保护的地址空间运行。用这种方法,出错的驱动程序和协议则不再成为单独起作用的失效点,而是可以在它们引起其他服务失效前,就使其停止或重新启动,而不必重新开机引导。

    产生的结果是完全独立的软件拥有自己独立的内存空间地址。内存管理设备在其造成诸如数据写进了距离自己很远的地址一类的危害前,可以中途阻止迷失方向的存取访问。

    这些工具在汽车运行中将可以监视应用软件的安全和运行情况。

    汽车电子是本报长期关注的一个热点领域,我们欢迎有关汽车电子的技术、产品等方面的稿件,相关事宜请发邮件到liu_xuexi@ccw.com.cn

    展开全文
  • 做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN上好多同学们都对实时、嵌入式这些概念...


    做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN上好多同学们都对实时、嵌入式这些概念似懂非懂,毕竟如果不做类似的产品,平时接触的机会很少,即使做嵌入式产品开发,基本也是只管调用Platform team封装好的API。所以在此总结一下这些概念,加深自己的理解,同时也给新手入门,欢迎大家拍砖,争取写个连载,本文先总结一下实时的概念,什么是真正的实时操作系统?

    1. 首先说一下实时的定义及要求:

    参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。
    http://www.faqs.org/faqs/realtime-computing/faq/

    一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows在CPU空闲时可以提供非常短的典型中断响应,但是,当某些后台任务正在运行时,有时候响应会变得非常漫长,以至于某一个简单的读取文件的任务会长时间无响应,甚至直接挂死。这是一个基本的问题:并不是Windows不够快或效率不够高,而是因为它不能提供确定性所以,Windows不是一个实时操作系统

    根据实际应用,可以选择采用硬实时操作系统或软实时操作系统,硬实时当然比软实时好,但是,如果你的公司正在准备开发一款商用软件,那请你注意了,业界公认比较好的VxWorks(WindRiver开发),会花光你本来就很少的银子,而软实时的操作系统,如某些实时Linux,一般是开源免费的,我们公司本来的产品就是基于VxWorks的,现在业界都在Cost Reduction,为了响应号召,正在调研如何把平台换成免费的嵌入式实时Linux。同学们,如何选择,自己考虑吧:-)

    硬实时 - 代表产品 VxWorks

    举一个经常使用的实例,中高档汽车中使用的气囊。当报告车辆碰撞的传感器中断CPU后,操作系统应快速地分配展开气囊的任务,并且不允许任何其他非实时处理进行干扰,晚一秒钟展开气囊比没有气囊的情况更糟糕,这就是一个典型的必须使用硬实时的系统。

    硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足。

    软实时 - 代表产品 软实时Linux

    再举一个实例,IPTV数字电视机顶盒,需要实时的处理(解码)视频流,如果丢失了一个或几个视频帧,显然会造成视频的品质更差,但是只要做过简单的抖动处理的系统,丢失几个视频帧就不会对整个系统造成不可挽救的影响。

    软实时系统就是那些从统计的角度来说,一个任务能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误。

    ---------------------------------------------

    请注意:讲到这里,想花点墨水区分一下实时和嵌入式的概念,因为笔者也长时间把这两者混为一谈。实时操作系统的概念上文已经讲的很清楚了,主要就是要能确定性的满足时间要求。嵌入式系统很难下一个定义,有兴趣的可以百科一下“嵌入式系统”,一般可以认为是板子或芯片上软硬件的总和,嵌入式系统一定要对实时任务有很强的支持能力,所以一般嵌入式系统都会采用实时操作系统,根据不同应用,选择采用硬实时或软实时。

    ---------------------------------------------

    2. 如何衡量一个实时操作系统的实时性能?

    主要有以下两个重要指标:

    指标1、中断响应时间(可屏蔽中断)

    计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。对于抢先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。抢先式内核的中断响应时间由下式给出:
    中断响应时间=关中断的最长时间+保护CPU 内部寄存器的时间+进入中断服务函数的执行时间+开始执行中断服务例程(ISR)的第一条指令时间

     

    请注意:中断响应时间是系统在最坏情况下响应中断的时间,某系统100次中有99次在50ms之内响应中断,只有一次响应中断的时间是250ms,只能认为中断响应时间是250ms。

    指标2、任务切换时间

    除为中断处理提供确定性外,实时处理也需要支持周期性间隔的任务调度。大量控制系统要求周期性采样与处理。某个特定任务必须按照固定的周期(p)执行,从而确保系统的稳定性。考虑一下汽车的防抱死系统(ABS)。控制系统对车辆的每个车轮的转速进行采样(每秒最多 20 次)并控制每个制动器的压力(防止它锁死)。为了保持控制系统的正常工作,传感器的采样与控制必须按照一定的周期间隔。这意味着必须抢占其他处理,以便 ABS 任务能按照期望的周期执行。

    当多任务内核决定运行另外的任务时,它把正在运行任务的当前状态(即CPU 寄存器中的全部内容)保存到任务自己的栈区之中。然后把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU 的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。做任务切换所需要的时间取决于CPU 有多少寄存器要入栈。CPU 的寄存器越多,额外负荷就越重。

    系统实时性能重要指标的典型值
    -----------------------------------------------------
                      VxWorks    uC/OS-II        RT-Linux2.0  QNX6 
    硬件平台  MC68000  33MHz-486  60MHz-486   33MHz-486 
    任务切换  3.8us          < 9us            不详                12.57us 
    中断响应  < 3us          < 7.5us         25us                7.54us 
    -----------------------------------------------------

    参考文献:《4种实时操作系统实时性的分析对比》 - 百度一下可以搜到

    3. 实时操作系统的核心 - 任务调度(VxWorks)

    既然实时性对于实时操作系统如此重要,同学们,我们下面就来学习一下实现实时性的核心模块 - 任务调度。笔者所在的公司花了大把银子购买风河的VxWorks,但是为了实现自己的可控性,除了任务调度模块以外全部重写,包括内存管理、文件管理等其他核心模块,但唯独任务调度模块除外,这可是人家的压箱底法宝:-)

    构成应用软件系统的程序集合中,独立的、相互作用的程序单元,在其执行时称之为任务,从系统的角度来看,任务是竞争系统资源的最小运行单元。单个CPU 中,多任务机制制造了一个多个任务同时执行的假象。其实系统只是根据一个多任务调度算法,将内核插入到这些任务中执行。实时系统VxWorks的一个任务可有多种状态,但最基本的状态有以下四种:

    1) 就绪态(Ready):任务只等待系统分配CUP资源。
    2) 挂起态(Pend):任务需等待某些不可利用的资源而被阻塞。
    3) 休眠态(Sleep):如果系统不需要某一个任务工作,则这个任务处于休眠状态。
    4) 延迟态(Delay):任务被延迟时所处的状态。

    大家可以在网上搜一下VxWorks任务调度的相关文章,一般都会配状态机图。

    ----------------------------

    请注意:任务(task)、进程(process)、线程(thread)等概念相互联系又相互区别,因为不是本文的重点,这里不多解释,如果想详细了解推荐看一看“Windows Kernel Programming”。在VxWorks中,因为每个任务没有自己独立的虚拟内存空间,可以把任务理解为线程。 

    ----------------------------

    任务由系统内核调度运行一段固定长度的时间,称为时间片。调度是指为任务分配资源和时间,使系统满足特定的性能要求。调度算法的目的是在正常情况下,尽可能满足所有任务的时限:在峰值负载条件下,保证强实时任务满足时限。因为时限是区分实时系统和非实时系统的关键因素,因此调度算法是实时系统的基本问题。实时操作系统所具有的运行性能,如吞吐量的大小、周转时间的长短、相应的及时性和可预测性等在很大程度上都取决于实时调度。

    进程调度可采用下述两种方式:

    1. 非抢占方式。采用这种调度方式,一旦把处理机分配给某进程后,便让该进程一直执行,直到该进程完成或发生某事件而被阻塞,才再把处理机分配给其他进程,决不允许某进程抢占已经分配出去的处理机。显然它难于满足紧急任务的要求,实时系统中不宜采用这种调度方式。

    2. 抢占方式。允许调度程序根据某种原则,去停止某个正在执行的进程,将已分配给该进程的处理机,重新分配给另一进程。抢占的原则有:

    - 时间片原则。各进程按时间片运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。

    - 优先权原则。当一个进程到来时,如果其优先级比正在执行的进程的优先级高,便停止正在执行的进程,将处理机分配给优先级高的进程,使之执行。实时系统中一般采用基于优先级的抢占式调度和轮转调度的进程调度和中程调度相结合的调度策略。因此既可具有较大的灵活性,又能获得极小的调度延迟。

    VxWorks的wind内核缺省调度机制为基于优先级的抢占式调度。采用这种机制时,系统把处理机分配给优先级最高的进程,使之执行。一旦出现了另一个优先级更高的进程时,进程调度程序剥夺当前任务的执行,将处理机分配给高优先级任务。而在相同优先级的多个任务之间,采用时间片轮转调度机制。采用这种机制时,当一个任务到达时,它被排在轮转队列的后面,等待分配给自己的时间片的到来,如果在时间片内没有结束,则再等待属于自己的时间片的到来,直到任务完成。

    - 优先级抢占式
        采用基于优先级的抢占式调度,系统中每个任务都有一个介于最高0到最低255之间的优先级。任一时刻,系统内核一旦发现一个优先级更
    高的任务转变为就绪态,内核就保存当前任务的上下文并把当前任务状态转换为阻塞态,同时切换到这个高优先级任务的上下文执行。
    - 轮转调度算法
        采用轮转调度算法,系统让处于就绪态的优先级相同的一组任务依次轮流执行预先确定长度的时间片。这是一种处理机平均分配的方法。如果不使用轮转调度算法,优先级相同的一组任务中第一个获得处理机的任务将不会被阻塞而独占处理机,如果没有阻塞或其他情况发生,它
    不会放弃处理机的使用权。
    - 抢占调度与轮转调度混合方式
        有时,基于优先级的抢占式调度可与轮转调度相结合。当优先级相同的一组任务依次轮流平均分配处理机时,若有高优先级的任务转变为
    就绪态则可抢占该组任务。直到再一次符合执行条件时,该组任务才可再次共享处理机。
        为了任务控制的灵活性,VxWorks内核还提供了动态优先级机制,任务的优先级在运行期间可动态地变化。同时,为了防止优先级反转,还具有优先级继承机制,通过使用互斥信号量可以防止高优先级的任务被迫等待一段不确定时间,直到一个低优先级任务完成。

    参考文献:《实时操作系统VxWorks的内核任务调度研究》 - 百度一下可以搜到

    4. Linux的任务调度

    通用Linux系统支持实时和非实时两种进程,实时进程相对于普通进程具有绝对的优先级。对应地,实时进程采用SCHED_FIFO或者SCHED_RR调度策略,普通的进程采用SCHED_OTHER调度策略。

    在调度算法的实现上,Linux中的每个任务有四个与调度相关的参数,它们是rt_priority、policy、priority(nice)、counter。调度程序根据这四个参数进行进程调度。

    在 SCHED_OTHER调度策略中,调度器总是选择那个priority+counter值最大的进程来调度执行。从逻辑上分析SCHED_OTHER 调度策略存在着调度周期(epoch),在每一个调度周期中,一个进程的priority和counter值的大小影响了当前时刻应该调度哪一个进程来执行,其中priority是一个固定不变的值,在进程创建时就已经确定,它代表了该进程的优先级,也代表这该进程在每一个调度周期中能够得到的时间片的多少;counter是一个动态变化的值,它反映了一个进程在当前的调度周期中还剩下的时间片。在每一个调度周期的开始,priority的值被赋给 counter,然后每次该进程被调度执行时,counter值都减少。当counter值为零时,该进程用完自己在本调度周期中的时间片,不再参与本调度周期的进程调度。当所有进程的时间片都用完时,一个调度周期结束,然后周而复始。另外可以看出Linux系统中的调度周期不是静态的,它是一个动态变化的量,比如处于可运行状态的进程的多少和它们priority值都可以影响一个epoch的长短。值得注意的一点是,在2.4以上的内核中,priority被nice所取代,但二者作用类似。

    可见SCHED_OTHER调度策略本质上是一种比例共享的调度策略,它的这种设计方法能够保证进程调度时的公平性--一个低优先级的进程在每一个epoch中也会得到自己应得的那些CPU执行时间,另外它也提供了不同进程的优先级区分,具有高priority值的进程能够获得更多的执行时间。对于实时进程来说,它们使用的是基于实时优先级rt_priority的优先级调度策略,但根据不同的调度策略,同一实时优先级的进程之间的调度方法有所不同:

    - SCHED_FIFO:不同的进程根据静态优先级进行排队,然后在同一优先级的队列中,谁先准备好运行就先调度谁,并且正在运行的进程不会被终止直到以下情况发生:1.被有更高优先级的进程所强占CPU;2.自己因为资源请求而阻塞;3.自己主动放弃CPU(调用sched_yield);

    - SCHED_RR:这种调度策略跟上面的SCHED_FIFO一模一样,除了它给每个进程分配一个时间片,时间片到了正在执行的进程就放弃执行;时间片的长度可以通过sched_rr_get_interval调用得到;

    由于Linux系统本身是一个面向桌面的系统,所以将它应用于实时应用中时存在如下的一些问题:

    - Linux系统中的调度单位为10ms,所以它不能够提供精确的定时;
    - 当一个进程调用系统调用进入内核态运行时,它是不可被抢占的;
    - Linux内核实现中使用了大量的封中断操作会造成中断的丢失;
    - 由于使用虚拟内存技术,当发生页出错时,需要从硬盘中读取交换数据,但硬盘读写由于存储位置的随机性会导致随机的读写时间,这在某
    些情况下会影响一些实时任务的截止期限;
    - 虽然Linux进程调度也支持实时优先级,但缺乏有效的实时任务的调度机制和调度算法;它的网络子系统的协议处理和其它设备的中断处理都没有与它对应的进程的调度关联起来,并且它们自身也没有明确的调度机制;

    参考文献:《基于Linux的实时系统》 - 百度一下可以搜到

    5. 实时Linux研究

    呼哧呼哧写了半天,终于到了重头戏,实时Linux研究。前文说过,风河的VxWorks虽然性能大大的好,但是要花很多银子,对于一般的软实时应用系统来说,还是用开源免费的实时Linux比较好。笔者所在的公司也正在研究将平台转为Linux。有许多种方法可以赋予普通Linux实时的能力:

    5.1 瘦内核(微内核)- Thin-Kernel

    瘦内核(或微内核)方法使用了第二个内核作为硬件与 Linux 内核间的抽象接口。非实时 Linux 内核在后台运行,作为瘦内核的一项低优先级任务托管全部非实时任务。实时任务直接在瘦内核上运行。瘦内核主要用于(除了托管实时任务外)中断管理。瘦内核截取中断以确保非实时内核无法抢占瘦内核的运行。这允许瘦内核提供硬实时支持。

    thin-kernel

    虽然瘦内核方法有自己的优势(硬实时支持与标准 Linux 内核共存),但这种方法也有缺点。实时任务和非实时任务是独立的,这造成了调试困难。而且,非实时任务并未得到 Linux 平台的完全支持(瘦内核执行称为瘦 的一个原因)。

    使用这种方法的例子有 RTLinux (现在由 Wind River Systems 专有),实时应用程序接口(RTAI)和 Xenomai。

    5.2 超微内核

    这里瘦内核方法依赖于包含任务管理的最小内核,而超微内核法对内核进行更进一步的缩减。通过这种方式,它不像是一个内核而更像是一个硬件抽象层(HAL)。超微内核为运行于更高级别的多个操作系统提供了硬件资源共享。因为超微内核对硬件进行了抽象,因此它可为更高级别的操作系统提供优先权,从而支持实时性。

    对硬件进行抽象的超微内核法

    注意,这种方法和运行多个操作系统的虚拟化方法有一些相似之处。使用这种方法的情况下,超微内核在实时和非实时内核中对硬件进行抽象。这与 hypervisor 从客户(guest)操作系统对裸机进行抽象的方式很相似。

    关于超微内核的示例是操作系统的 Adaptive Domain Environment for Operating Systems (ADEOS)。ADEOS 支持多个并发操作系统同步运行。当发生硬件事件后,ADEOS 对链中的每个操作系统进行查询以确定使用哪一个系统处理事件。

    5.3 资源内核(Resource-kernel)

    另一个实时架构是资源内核法。这种方法为内核增加一个模块,为各种资源提供预留(reservation)。这种机制保证了对时分复用(time- multiplexed)系统资源的访问(CPU、网络或磁盘带宽)。这些资源拥有多个预留参数,如循环周期、需要的处理时间(也就是完成处理所需的时间),以及截止时间。

    实现资源预留的资源内核法

    资源内核提供了一组应用程序编程接口(API),允许任务请求这些预留资源。然后资源内核可以合并这些请求,使用任务定义的约束定义一个调度,从而提供确定的访问(如果无法提供确定性则返回错误)。通过调度算法,如 Earliest-Deadline-First (EDF),内核可以处理动态的调度负载。

    资源内核法实现的一个示例是 CMU 公司的 Linux/RK,它把可移植的资源内核集成到 Linux 中作为一个可加载模块。这种实现演化成商用的 TimeSys Linux/RT 产品。

    5.4 标准的Linux内核最新版本2.6中加入了实时功能

    目前探讨的这些方法在架构上都很有趣,但是它们都在内核的外围运行。然而,如果对标准 Linux 内核进行必要的修改使其支持实时性,结果会怎么样呢?

    今天,在 2.6 内核中,通过对内核进行简单配置使其完全可抢占,您就可以得到软实时功能。在标准 2.6 Linux 内核中,当用户空间的进程执行内核调用时(通过系统调用),它便不能被抢占。这意味着如果低优先级进程进行了系统调用后,高优先级进程必须等到调用结束后才能访问 CPU。

    新的配置选项 CONFIG_PREEMPT 改变了这一内核行为,在高优先级任务可用的情况下(即使此进程正在进行系统调用),它允许进程被抢占。

    允许抢占的标准 2.6 Linux 内核

    但这种配置选项也是一种折衷。虽然此选项实现了软实时性能并且即使在负载条件下也可使操作系统顺利地运行,但这样做也付出了代价。代价就是略微减低了吞吐量以及内核性能,原因是 CONFIG_PREEMPT 选项增加了开销。这种选项对桌面和嵌入式系统而言是有用的,但并不是在任何场景下都有用(例如,服务器)。

    在 2.6 内核中另一项有用的配置选项是高精度定时器。这个新选项允许定时器以 1μs 的精度运行(如果底层硬件支持的话),并通过红黑树实现对定时器的高效管理。通过红黑树,可以使用大量的定时器而不会对定时器子系统(O(log n))的性能造成影响。

    只需要一点额外的工作,就可以通过 PREEMPT_RT 补丁实现硬实时。PREEMPT_RT 补丁提供了多项修改,可实现硬实时支持。其中一些修改包括重新实现一些内核锁定原语,从而实现完全可抢占,实现内核互斥的优先级继承,并把中断处理程序转换为内核线程以实现线程可抢占。

    参考文献:实时Linux架构剖析 - M. Tim Jones, 顾问工程师, Emulex Corp.
    http://www.ibm.com/developerworks/cn/linux/l-real-time-linux/#resources

     

    -------------------------------------------------------------------------

     

    本文就到此告一段落,结合自己的实际项目经验,总结了实时操作系统的概念,性能指标,任务调度方法,VxWorks和Linux的实时性对比,以及相应的介绍。供笔者自己学习,也供CSDN各位同学参考,大部分内容来自网络,不是一篇严谨的论文,如有纰漏还请指出,共同进步。

     

    转载请注明出处:http://blog.csdn.net/zhourui1982

     

     

     

    展开全文
  • 针对汽车电子软件的复杂性、实时性和可移植性问题以及现有OSEK操作系统的开源性问题,基于OSEK操作系统规范(ISO 173563),采用面向对象的程序设计思想,从任务、中断、资源、事件、计数器和警报6个方面进行研究,...
  • (开发汽车软件必备的基础知识) SEK/VDX是汽车的工业的一个联合项目,它的目标是为汽车上分布式的控制单元建立一个开放结构...本文只介绍在汽车上使用实时操作系统的概念及多任务处理的能力。它不涉及产品实现的描述.
  • 1. 实时操作系统简介 什么是实时操作系统? 一般而言,操作系统的任务是管理计算机的硬件资源和应用程序。 实时操作系统会执行这些任务,但是运行时间精度和可靠度都极高。 在实际应用中,有的系统失常代价高昂,...

    1. 实时操作系统简介

    什么是实时操作系统?

    一般而言,操作系统的任务是管理计算机的硬件资源和应用程序。 实时操作系统会执行这些任务,但是运行时间精度和可靠度都极高。 在实际应用中,有的系统失常代价高昂,甚至会引起安全事故。这时,操作系统的时间精度和可靠度都显得格外重要。

    顾名思义,实时操作系统必须在已知的关键时间内完成关键操作,至少要在绝对大多数情况下在已知时间内完成关键操作。 部分这类操作包括操作系统调用和中断处理。 完全满足在指定时间内完成关键性操作的实时操作系统,被称为“硬实时”操作系统。大多数情况下能满足在指定时间内完成关键性操作的实时操作系统,被称为“软实时”操作系统。 实际情况中,上述分类的指导意义有限。每个实时操作系统都有独特的性能特征,用户在决定使用某个实时操作系统之前需要仔细研究这些特征。

    下面通过列子来帮助理解实时操作系统的概念。 假设您在为一款新车设计安全气囊系统。 在该情况下,极小的时间误差(太早或太迟)都会产生灾难性后果,甚至导致人员伤亡。 因此,需要一个硬实时系统;在系统设计上要确保没有任何操作的优先级可以凌驾于时间限制之上。 另一方面,如要设计一个接收流媒体手机,在保持大致不丢失流媒体数据的前提下可以偶尔遗失少量数据。 在这种应用中,一个软实时操作系统就可满足要求。

    如果编程合理,实时操作系统可保证程序运行在时间上的稳定可靠性。 实时操作系统向用户提供任务优先级排序的高度控制权,也通常会允许用户检查任务执行是否符合时间上设定的要求。

    与实时操作系统相比,个人电脑上最常见的操作系统称为通用操作系统,例如,Windows。 下面将详尽阐述实时操作系统和通用操作系统的区别。在此之前,要先了解两种操作系统的优劣。 Windows等操作系统通过运行多个程序和服务来维持对用户操作的响应,实时操作系统通过精确和可靠度定时机制(关注编程人员设定的优先级)来运行关键性应用程序。

    重要的术语和概念

    确定性:运行在实时操作系统上的应用程序(或应用程序的关键性片段),如能保证时间精度,就认为是确定性的程序。

    软实时和硬实时:完全能保证时间精度的操作系统,称为硬实时操作系统。 多数情况下能保证时间精度的操作系统,称为软实时操作系统。

    抖动:程序开始时,首次循环相对于后续循环在时间上的差异,称为抖动。 实时操作系统可确保在编程合理的情况下,抖动为最小水平;任务首次执行与后续循环执行所用的时间非常接近。

    图1:抖动指一次任务执行和后续任务执行之间在时间上的差异。 实时操作系统通过各种优化方式使抖动最小化。

     

    至页首

    2. 实时应用程序范例

    实时操作系统用于两类应用:事件响应和闭环控制。 事件响应类应用需要在指定的时间内对外界触发条件作出响应。例如,生产线上自动视觉模式识别。 在视觉识别系统中,必须在生产线移动之前对待测部分进行拍照和分析。

    对运行在硬实时操作系统上的程序进行严格的设计和调试之后,在事件响应上工作的设计人员可保证响应的确定性(在指定时间内发生)。 在视觉识别案例中,使用通用操作系统可能会导致无法及时检测待测部分,从而降低生产线速度、强制报废待测品,甚至交付潜在的次品。

    在闭环控制系统中,例如,汽车巡航控制系统会连续处理反馈数据,调整输出。 因为输出数据取决于是否能在指定时间内处理完输入数据。在指定时间内完成任务至为重要,只有这样才能有正确的输出。 如果巡航系统无法在给定时间点上判断合适的油门设置,会发生什么情况? 硬实时系统可保证在指定时间内及时处理控制系统的输入数据。

    还必须指出,很多程序必须运行多个周期后才能充分体现实时操作系统的可靠性。 与通用操作系统同时处理多个程序和进程不同,实时操作系统上只有少量程序运行。实时操作系统适用于宕机代价高昂的全天候系统。

    如要在项目中使用实时操作系统,请查看我是否需要实时系统?

    至页首

    3. 探究事实:实时操作系统与通用操作系统有哪些不同之处

    Windows、Mac OS等操作系统是开发和运行非实时测量和控制应用程序的优秀平台。 这些操作系统使用于实时操作系统之外的使用场合。对于要求精确定时和长时间稳定运行的系统而言,通用操作系统不是理想的平台。 下面将阐述两种操作系统之间的区别,以及编写实时应用程序时的注意事项。

    设置优先级

    编写应用程序时,大多数操作系统都允许程序员指定应用程序的总体优先级,以及应用程序中不同任务(线程)的优先级。 这些优先级设置将程序和任务的重要性告知操作系统。 如两个任务同时运行,操作系统将优先运行优先级设置较高的任务。

    在实际应用中,通用操作系统不会始终严格按照程序设置的优先级执行。 因为通用操作系统可同时运行多个应用程序和进程,所有任务都会被分配到一些处理时间。 在某些情况下,低优先级任务的临时优先级可能会比高优先级任务更高。 这样,每个任务都会分配到一定的运行时间。这会违背程序设计人员的设计初衷。

    实时操作系统可严格按照程序员设置的优先级执行程序。 在多数实时操作系统上,如果一个高优先级任务占用率100%的处理器资源,低优先级任务将一直等待直到高优先级任务完成。 因此,设计实时应用程序时,必须谨慎、合理设置优先级。 在一个典型的实时应用程序中,设计者应该将实时代码放置在高优先级的部分。 写入磁盘、网络通信等较低优先级的代码应该放在较低优先级的部分。

    中断延迟

    设备生成一个中断和设备中断发生之间的时间,称为中断延迟。 通用操作系统响应中断需要的时间不固定,实时操作系统必须确保在一个固定的时间内响应中断。 也就是说,实时操作系统的延迟必须是已知的固定的值。

    性能

    一个常见的误解是实时操作系统的性能高于通用操作系统。 在某些情况下,因为不需要在多个应用程序和服务之间进行多任务操作,实时操作系统的性能更好。这并不是绝对的规律。 实际应用程序的性能取决于CPU主频、内存架构、程序特征,等等。

    即使实时操作系统对执行速度没有直接影响,但是它与通用操作系统相比具有更精确和更可靠的时间特性。

    展开全文
  • 实时操作系统特点

    2018-10-09 22:11:09
    实时操作系统(Real-time operating system, RTOS)是说,任务切换和中断响应的时间必须保证在多少时间内(如5us内)完成。  分为硬实时和软实操作系统:  硬实时是说必须在多少时间内完成切换(如VxWorks, 我们...
  • 什么是实时操作系统?参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义: 实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。 ...
  • 实时操作系统(Real-time operating system, RTOS)是说,任务切换和中断响应的时间必须保证在多少时间内(如5us内)完成。  分为硬实时和软实操作系统:  硬实时是说必须在多少时间内完成切换(如VxWorks, 我们...
  • 1. 首先说一下实时的定义及要求: 参见Donal Gillies在...一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用
  • 是美国windriver公司于1983年设计开发的高性能、可扩展的实时操作系统,具有嵌入实时应用中最新一代的开发和执行环境,支持市场上几乎所有的处理器,以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空...
  • 是美国windriver公司于1983年设计开发的高性能、可扩展的实时操作系统,具有嵌入实时应用中最新一代的开发和执行环境,支持市场上几乎所有的处理器,以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空...
  • 1、根据实际应用,可以选择采用硬实时操作系统或软实时操作系统,硬实时当然比软实时好,但是,如果你的公司正在准备开发一款商用软件,那请你注意了,业界公认比较好的VxWorks(WindRiver开发),
  • 目前市面流行的实时操作系统都是采用可抢占式的基于优先级的调度方式,其保证了处于就绪状态的优先级高的任务可以先于优先级低的任务而执行。但这并不是绝对的,优先级反转是实时系统中的一个经典特例。其大体流程...
  • 源码公开的嵌入式实时操作系统T-KernelIT 圈外不知道比尔·盖茨的人,恐怕很难成为富翁;在IT 圈里,如果不了解坂村健,也许要考虑还要不要立志成为IT 的技术专家。身为日本一名计算机专家,坂村健在计算机行业内部...
  • 什么是真正的实时操作系统  做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks。实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN上好多...
  • 本专栏系列介绍了Nucleus PLUS,包括Nucleus系统架构、启动过程、任务调度、任务间通信机制和中断等。
  • 前言 操作系统是物联网时代的战略制高点,今天 PC 和手机时代的操作系统霸主未必能在物联网时代延续霸业。操作系统产业的规律是,当垄断已经形成,后来者就很难颠覆,只有等待下一次产业浪潮。如今,一个全新的、...
  • 实时多任务操作系统uCOS-III的特点  uCOS-III是一个全新的实时内核,源于世界上最流行的实时内核uC/OS-II,除了提供熟悉的一系列系统服务,全面修订了API接口,使uC/OS-III更直观,更容易使用。该产品可以广泛...
1 2 3 4 5 ... 20
收藏数 76,775
精华内容 30,710
关键字:

汽车实时操作系统