利用安全分割确保车载通信和信息娱乐系统的性能
扫描二维码
随时随地手机看文章
有越来越多的新技术被集中用于车载通信服务和信息娱乐系统,从而使车辆变得更安全、更舒适,最终令消费者更加满意。事实上,“更多、更好”恰当地表达了该市场中的流行趋势。汽车制造商其实早已推出集众多功能于一身的整合系统,这些功能包括了GPS导航、卫星电台、实时交通流量报告、三维接口、DVD播放、语音控制操作、自动紧急呼叫、MP3播放器连接、硬盘音频存储、用户定义音乐播放列表等。
为了提供如此丰富的功能,这些系统采用了大量软件组件,代码规模达10、20甚至30MB。软件的这种复杂性给系统可靠性和性能带来了极大的挑战,原因很简单,系统包含代码越多,编程错误、安全漏洞或软件组件之间发生资源冲突的机会就越大。
由于软件负责控制对CPU、存储器和其它系统资源的访问,因此实时操作系统(RTOS)将在诊断和防止这类问题方面发挥重要的作用。特别是它能加强软件进程之间的安全界限,阻止任何进程不经意或有意影响其它进程的性能。为了实现这一目标,一些RTOS引入了资源划分这一概念。
简单地讲,这一概念允许系统设计师将软件进程分组成多个独立的块或区,并给每个区分配一部分有保证的存储器和CPU时间等系统资源。这样,一个区内的进程不会占用其它区内进程所需要的资源。
另外,划分还能提供存储器保护,因为RTOS可以使用存储器管理单元(MMU)控制所有对存储器的访问。例如,Microkernel RTOS就允许开发人员将应用程序、设备驱动程序、协议堆栈和文件系统划分为有存储器保护的独立进程。如果有任何进程(如设备驱动程序)试图访问自身进程范围以外的存储器,MMU就会通知OS,让OS中断和重启该进程。
这种方法包括:
·可以防止任何进程中的代码错误影响其它进程或RTOS内核;
·允许开发人员快速识别和纠正其它方法可能要花几周时间才能隔离的存储器访问违例;
·显著减少故障恢复时间,因为不必在故障发生时进行重启(重启过程可能会花几秒到数分钟的时间),系统可以只重启有问题的进程(这个过程可能只要几个毫秒)。
CPU保证
诚然,建立一个可靠的信息娱乐或车载通信服务系统远不止将功能划分为多个存储器域。在许多情况下,保证对CPU的访问同样重要。如果任何一个子系统(如HMI)被剥夺了CPU周期,那么该系统对用户来说就变得不可用了。
对CPU访问的保证要求源自大多数RTOS采用的优选级抢占调度机制。简单地说,这种调度模型可以确保进程和线程按它们分配到的优选级顺序执行:较高优先级的线程通常可以抢占较低优先级的线程,而较低优先级线程不能阻止较高优先级线程的运行。
优先级调度有许多优点,包括:
可预测的延迟。通过将时间紧迫的功能分配为高优先级线程,开发人员可以控制系统要花多少时间响应外部事件,即使在系统非常繁忙的时候。
并发性和灵活性。在优先级调度机制下,嵌入式系统可以处理多种任务,包括具有硬性时间限制的周期性运行任务、高优先级的事件驱动任务以及后台处理任务。
成熟性和熟知性。优先级调度已被广泛用于汽车应用,嵌入式开发人员对此有较深的理解。
尽管有这些优点,但优先级调度也会导致任务饥饿这样一种状态。比方说一个系统共有两个线程,分别是A和B,A的优选级要比B稍高一些。如果A变得很忙,B(以及其它所有较低优先级的线程)将无法访问CPU。
在汽车应用中,线程A可能控制导航显示和进程为B的MP3播放器。如果导航系统在执行路由计算时占用了太多的CPU周期,就会使MP3播放器挨饿而停放。同样,在免提车载通信系统中,负责回波抵消的较高优先级线程可能会使负责噪声抑制的较低优先级线程挨饿,这个问题将影响噪声抑制模块和输出音频链下游的其它各个进程。
总之,优先级调度机制不能保证较低优先级线程访问即使是一小部分的CPU。较低优先级线程提供的服务,包括使系统免受软件错误影响的诊断服务,可能长时间处于CPU周期饥饿状态,从而影响系统的可用性。随着软件复杂性(和线程数量)的增加,这些问题将变得越来越频繁。
这种无法提供资源保证的情况将导致组成现代车载通信或信息娱乐设备的许多子系统之间产生严重的冲突,这种问题只有等到最终集成和验证测试时才会变得非常明显。那些在独立使用时即使工作得很好的子系统一旦开始与其它子系统竞争CPU时间和其它资源时响应速度也会慢下来。
这种资源冲突本身很难进行诊断和解决。系统设计师必须修改任务优先级,甚至可能改变系统的行为,然后重新测试和调整他们的修改方案。这些工作通常要花上几个星期的时间,从而增加了成本,拖延了产品上市时间。
有保证的资源预算
划分有助于避免这些问题。例如在图1中,设计师将软件子系统分组为4个区,并给每个区分配CPU预算:20%用于用户接口,20%用于MP3播放,30%用于免提音频,剩下30%用于导航和路由计算。设计师还可以给每个区分配单独的存储器预算,比如导航区可以分配40%的存储器。
采用这种方法后,每个开发小组就能从一开始就知道有多少存储器和CPU时间可用于他们的软件子系统。而且每个小组可以轻松测试他们的子系统以确保子系统工作在这些定义好的预算范围内。在集成时,RTOS将强制执行资源预算,防止任何子系统占用其它子系统需要的资源。这样每个系统就能象以前测试时那样正常工作。
从效果上看,划分使得开发小组能够更方便地并行工作。比如作为一个开发人员,你不再需要担心子系统外的线程优先级:这些线程不会影响你的吞吐量,即使它们的优选级比你的高。
另外,通过控制分区预算,设计师可以充分权衡各种子系统的响应时间,以便快速调整系统性能。理想情况下,划分调度程序可以让设计师在运行时间动态执行这种CPU调整,不需要强迫他们重建程序或系统映像。图2给出了可用于动态调整分区预算的一种工具。
自适应划分
划分调度程序有很多种。一些程序会一直执行CPU预算,即使分区没有任务也强迫它占用全部预算。有些实现程序则会把这些未用的CPU周期动态分配给其它分区,从而最大化整个CPU的利用率,允许系统处理峰值需求。这种方法是最佳的:它能在系统过多使用CPU周期时提供CPU保证(确保较低优先级服务的可用性),当空闲CPU周期可用时将它分配出去(最大化性能)。例如,当图3中的导航区繁忙时,它可以使用任何其它分区目前不在使用的CPU周期。
正确实现的划分调度程序不要求修改设计代码,也不要求改变设计师早已熟悉的调试技术。它还能使用标准的POSIX编程模型,允许嵌入式开发人员使用他们熟知的相同工业标准API和任务优先机制。为了引入划分机制,开发人员只需定义好分区预算,并确定每个分区分给哪些进程或线程。进程本身可以保持不变。在每个分区中,RTOS可以继续根据传统的抢占优先级调度机制执行线程调度。
良好集成、良好保护
随着复杂性和代码规模的增加,在最终产品中发生任务饥饿和其它软件问题的概率也将随之增加。在系统完成部署后再去解决这些问题的成本将有显著的提高,更不用说对供应商信誉和净收益造成的伤害了。正确实现的划分方案提供了高效易用机制来避免这些问题。另外,它还能阻止恶意软件或服务拒绝(DoS)攻击占用存储器和CPU,从而极大地提高安全性和系统可用性。总之,划分方案可以帮助嵌入式开发人员建立良好集成并受到良好保护的信息娱乐系统。