编辑推荐: |
本文主要介绍了AUTOSAR多核操作系统、软件分区和任务调度以及软件部署和核间通信三个方面。希望对你的学习有帮助。
本文来自于微信公众号焉知汽车,由火龙果软件Linda编辑、推荐。 |
|
软件架构设计是功能安全软件开发过程中的关键阶段,作为实现软件安全需求和软件需求的载体,它定义了软件架构要素并将其细化到能够识别出软件单元的程度。
ISO26262 Part6 Clause7中要求:软件架构设计应描述软件架构要素的静态设计方面和动态设计方面。接下来,我们将通过“功能安全之软件架构设计”专题分别从功能安全软件静态架构设计、动态架构设计、多核和部署三个方面进行介绍。
本文中,我们将从AUTOSAR多核操作系统、软件分区和任务调度以及软件部署和核间通信三个方面进行介绍。关于功能安全软件静态架构设计和软件动态架构设计,可以参考功能安全之软件架构设计。
01 AUTOSAR多核操作系统
在介绍AUTOSAR多核操作系统之前,我们先来简单了解下AUTOSAR操作系统的基础知识。
AUTOSAR操作系统是在OSEK操作系统的基础上进行修改和扩展的。OSEK OS的主要功能包括Task、Interrupt、Event、Resource、Alarm和System
function等,AUTOSAR OS新增了Software Free Running Timer、Schedule
Table、Stack Monitor、OS-Application、Multi-Core和IOC等。
AUTOSAR OS 的可裁剪类(Scalability Class)包括SC1~SC4;任务类型包括基本任务和扩展任务;一致类包括BCC1、BCC2、ECC1和ECC2;任务的抢占属性包括可抢占任务和不可抢占任务;系统调度策略包括完全可抢占型、不可抢占型和混合型三类;中断包括一类中断和二类中断;Alarm包括相对报警和绝对报警;OS-Application包括可信应用集和不可信应用集。
Task的相关特性参数和调度时序如下图所示:
图1 “VCU扭矩计算”的Task特性和调度时序
AUTOSAR Multi-Core OS是由AUTOSAR OS演化而来,其区别主要包括:
a. Multi-Core OS支持不同核的独立调度,不同核上的任务可实现并行处理;
b. Multi-Core OS需要考虑不同核之间的任务同步;
c. 内核的启动方式不同,Multi-Core一般分为主核和从核,主核由硬件启动,从核由软件启动;
d. Multi-Core OS通过Spinlock实现核间资源互斥;
e. AUTOSAR对Multi-Core提供了两种关闭方式,即单独关闭和同时关闭。
02 软件分区和任务调度
为了帮助大家更好的理解上述内容,我们继续使用功能安全之软件架构设计里面的项目案例进行讲解。
功能安全要求不同的软件组件之间要实现免干扰(Freedom From Interfrence, FFI),这就要求QM的软件组件和ASILs的软件组件以及低ASIL的软件组件和高ASIL的软件组件之间不能存在级联失效。针对由于内存所导致的级联失效问题,可以通过适当的软件分区来避免。
在AUTOSAR架构中,软件分区是通过OS-Application实现的,不同的OS-Applications会映射到不同的Partitions。OS-Appication中包含Task、ISRs、Schedule
Tables、Counter和Alarm,如下图所示。
图2 OS-Application示意图
OS-Application可分为Trusted OS-Application和Non-Trusted
OS-Application两类。Trusted OS-Application不仅可以在没有任何监控或保护特征禁能的情况下运行,并且能够不受限制的访问内存资源和操作系统的API。如果芯片本身支持特权模式,Trusted
OS-Application允许在特权模式下运行。Non-Trusted OS-Application必须在监控或保护特征使能的情况下运行,并且访问内存资源和操作系统的API时有严格限制。即使芯片本身支持特权模式,Non-Trusted
OS-Application也不允许在特权模式下运行。
此外,在使用AUTOSAR OS实现MPU保护和软件分区时存在如下限制:
a. 同一个OS-Application内部的SWC之间无法做到免干扰;
b. 内存分区不适用于Trusted OS-Application;
c. 内存分区不支持Task层级;
d. 内存分区会牺牲部分性能;
e. 基础软件不支持内存分区。
基于以上信息,可以将项目案例中的软件组件和runnables划分为4个Task,如下图所示:
图3 软件分区项目案例
AUTOSAR OS同一个内核中,Task的调度顺序是基于优先级确定的,优先级相同的情况下其调度顺序取决于Task的激活顺序。与单核处理器不同的是,多核处理器上不同的Task是并行运行的,任务的调度互不影响。AUTOSAR多核操作系统中任务的调度示意图如下图所示:
图4 AUTOSAR多核OS任务调度示意图
03 软件部署和核间通信
针对软件部署:如果MCU支持分核,在满足Safety Manual中的Assumption of
Use & System Integration Requirement & Safety
Mechanism的情况下,通常建议将Safety related代码部署在Lockstep Core,将Non-Safety
related代码部署在Non-Lockstep Core;如果MCU不支持分核,需要基于内核中不同Task的优先级、ASIL等级、调度周期、执行时间和内存分区等方面确保QM和ASILs以及Low
ASIL和High ASIL软件之间实现免干扰。项目案例的软件部署如下图所示:
图5 软件部署项目案例
核间通信主要是为了避免读写共享数据时所导致的数据侵蚀。通常情况下,核间通信不涉及Spinlock的多次调用,可以采用Minilock对共享数据进行保护;Minilock执行时间比Spinlock更短,可以减少核间通信的时间。AUTOSAR操作系统提供了Inter
OS Application Communication(IOC)的通信方式,IOC包括IOC without
notification和IOC with notification两种通信方式。
不带通知的1:1 Sender/Receiver IOC通信如下图所示:
图6 不带通知的IOC通信
当一个核中的SWC将数据发送给另一个核中的SWC时,接收端的runnable被周期性调用并从RTE接收数据,发送端的代码为:
{
Rte_Send_<port>_<item>
(…, <data>)
}
该函数调用IOC发送函数:
{
IocSend_<Id> (<data>)
}
IOC将该数据写入共享内存区域的缓存中,接收端的runnable被周期性调用,代码如下:
{
Rte_Receive_<port>_<item>
(…, <data>)
}
该函数会调用IOC接收函数:
{
IocReceive_<Id> (<data>)
}
|
不带通知的IOC通信方式适用于以下情况:
a. Sender/Receiver 通信;
b. 队列或非队列通信;
c. 1:1通信。
带通知的N:1 Client/Server IOC通信如下图所示:
图7 带通知的IOC通信
当一个核中的SWC请求另一个核中SWC的服务时,接收端的一个runnable被激活。RTE将Client/Server调用转换为Sender/Receiver,发送端的代码为:
{
Rte_Call_<port>_<op>
(…, <data>)
}
该函数调用IOC发送函数:
{
IocSend_<Id> (<data>)
}
|
IOC将该数据写入内部队列缓存后,Rte_Call()函数使用OS调用激活接收核中的服务Task来通知接收端。
带通知的IOC通信方式适用于以下情况:
a. 带通知的Sender/Receiver 通信;
b. Client/Server通信,队列或非队列通信;
c. N:1通信或接收端非周期性调用的1:1通信。 |