AUTOSAR是从4.0版本开始支持多核OS的。随着汽车电子对软件可靠性和实时性要求的不断提高,多核OS应运而生。

1.OS Application

        AUTOSAR多核OS采用软件分区机制,每个核中至少分配一个OS Application。每个OS Application都有任务、中断服务、计数器、报警、调度表等对象。OS Application需要定义访问权限:Trusted和Non-Trusted。Trusted OS Application包含的对象,对大部分内存拥有读写的权限,包括所有的FLASH、LMU(Local Memory Unit)、CSA(Context Save Areas)以及外设单元等。Non-Trusted OS Application内包含的对象只有读写少部分内存的权限:当前活跃的栈、当前OS Application的数据以及LMU中的共享数据。

2. 软件分区机制

        AUTOSAR OS采用软件分区机制来实现简单的内存保护功能。其原理是在内存空间中划分不同的内存区间,各个分区的软件代码执行互不干扰,防止一个分区中发生的故障影响到同一个ECU的其他分区。一般来讲,每一个OS Application对应一个分区,每个分区会规定对应的OS Application所能访问的内存地址范围。

3. 任务调度

        AUTOSAR多核OS根据任务或中断的优先级来决定调度顺序。同一内核中,优先级越高的任务或中断优先调度;优先级相同时,根据激活顺序决定调度顺序。不同内核中的任务调度顺序是独立的,其优先级不会相互影响。

        有一点需要注意,由于汽车电子对可靠性的需求,AUTOSAR OS中的任务、资源、服务均是静态配置的,不可以动态创建。

        此外,AUTOSAR多核OS任务调度模式有全调度和拒绝调度两种模式。全调度模式下,任务会被更高优先级的任务或中断抢占;拒绝调度模式下,任务不会被其他任何任务或中断抢占。

        为了满足其实时性要求,一般建议重要任务分配更高的优先级;重要程度类似的任务,周期越短,分配的优先级应越高。

4. 计数器、报警器与调度表

        一般情况下,AUTOSAR OS的任务调度是通过报警器或者调度表实现的,报警器和调度表由对应的计数器触发,映射到硬件上就是Timer。不同的内核需要配置不同的Counter以及对应的Timer。内核和Timer的映射关系,一般在供应商发布的软件包OS模块相关的Technology Reference文档中会说明,如果对应关系搞错了,OS跑起来是会出现异常的。

5. 自旋锁和共享资源

        AUTOSAR多核OS为实现核间资源互斥,保证数据一致性,设计了自旋锁机制。该机制适用于核间资源互斥。

        当某个任务或者二类中断需要使用自旋锁,而该锁又被其他内核的任务或二类中断占用时,该任务或者二类中断就会死等,占用CPU资源,直到获取自旋锁。所以时间较长的任务不建议使用自旋锁,以防止造成其他内核资源浪费。

        同时,AUTOSAR OS为了避免同一个内核上自旋锁造成的死锁,在任何任务或者中断占用自旋锁时,OS会自动挂起所有的中断,不会被同一内核上的任务或者中断抢占。但是,如果核间任务嵌套请求占用自旋锁,就有可能导致任务的相互锁死。比如,核0上的某任务请求先占用自旋锁A,再占用自旋锁B;而核1上的另一个任务请求先占用自旋锁B,再占用自旋锁A。如果这两个任务开始运行的时间间隔很近,就有可能造成任务的互相锁死,即自旋锁的回环嵌套调用导致的死锁。所以在系统设计时,禁止回环嵌套使用自旋锁。如果实在需要嵌套使用自旋锁,那么需要严格按照顺序请求。比如核0上的某任务请求先占用自旋锁A,再占用自旋锁B;核1上的另一个任务也先请求占用自旋锁A,再占用自旋锁B,这样顺序地访问自旋锁就不会造成死锁。

        核内资源互斥一般使用Shared Resource机制。共享资源采用优先级天花板模式,防止优先级翻转问题。

6.核间通信

       当核间应用程序需要通信时,OS会为其开辟共享的Cache区域,通信双方的应用程序通过对该区域的读写,完成数据传输。为了保证数据一致性,应用程序对共享Cache区域读写时,会申请占用一个自旋锁,防止其他内核上的应用程序同时访问。

       因此,为了尽可能减少核间通信带来的开销,建议将耦合性强的任务尽量分配至同一内核中,减少核间通信的使用。

7.总结

        以上只是理论上AUTOSAR标准规定了这些内容,实际上各家供应商如何实现以及实现了哪些机制,还需要阅读软件包中附带的技术文档,甚至去看代码,去测试验证。具体情况具体讨论,以免在软件设计或者调试时陷入误区,浪费时间和资源。