Classic AUTOSAR Application

       上一章节,我们提到了AUTOSAR中软件模块功能复用的优势,通过软件模块功能复用提高了经济性和稳定性内容,那么,如何实现这种功能复用呢?就需要对功能进行分层和模块化,进而实现最大程度上的解耦,包含软硬件的解耦、功能算法与底层BSW的解耦、驱动层/抽象层/服务层之间的解耦。

       AUTOSAR软件架构主要分为3大层,分别为:Application, RTE, BSW;

① Application层;主要是承载功能算法逻辑相关的应用层软件内容;  

② RTE层;主要是将Application和BSW之间做解耦化处理,使得应用层软件和底层软件做隔离和独立,同时,Application中的不同SWC之间也通过RTE做解耦隔离处理;

③ BSW层;主要是指底层软件部分,将硬件和应用层功能算法做解耦隔离;

      下面讲一下 “AUTOSAR Application”,通过这个章节,我们可以了解到AUTOSAR软件架构下应用层APP/SWC的接口、结构设计内容,从Application应用层的角度看看如何实现解耦化和模块化。

1. Software Component软件功能组件

1.1 Atomic Component

       Sofeware Component简称SWC,是原子软件代码片段和应用程序的一部分,代表一个功能组件,这个功能可以指小的功能、也可以指大的功能,功能具体颗粒度可以自行设定。

       在设计层面上,SWC类似于Simulink中的设计框图;在配置层面上,SWC独立于基础设施,可以映射到任何ECU,但1个SWC只能部署在1个单独的Core上,也只能部署在1个单独的功能安全分区上,这块 "多核和多功能安全分区" 的部署,会在后续章节中再进行详细介绍;在代码层面上,1个SWC对应1个.c文件,SWC相关的逻辑代码和实现都在这个.c文件中。

       如下图,是1个典型的电子控制系统,包含2个传感器的SWC,分别代表2个传感器,1个控制器的SWC,代表控制器,1个执行器的SWC,代表执行器。在这个系统中,数据流和控制流简要步骤如下:

步骤一:2个硬件传感器采集过来的值通过硬件 -> 软件驱动,将采集到的原始值上传给应用层的传感器Sensor SWC中,在传感器SWC中进行物理值和逻辑值的转换;

步骤二:2个传感器Sensor SWC换算出来的物理值,再传递给控制算法Application SWC,在控制算法Application SWC中,经过算法逻辑计算,最后输出执行指令,将执行指令输出给执行器Actuator SWC,该执行指令一般是原始值;

步骤三:执行器Actuator SWC收到执行指令的SWC之后,再进行逻辑转换,通过软件驱动操作外设执行器做相应执行动作。

        通过上图,可以看到,SWC在设计层面上,分为几类:Sensor/Actuator SWC(传感器/执行器SWC)、Application SWC(算法逻辑SWC),除此之外,还有ComplexDriver SWC(复杂驱动SWC)、IOHardwareAbstraction SWC(IO抽象层SWC)、Calibration SWC(标定SWC)、Non-Volatile MemoryBlock SWC(NvM存储SWC)等等;其中,以Sensor/Actuator SWC、Application SWC、ComplexDriver SWC这3个类型最为常用。

1.2 Composotion

       在SWC设计阶段,往往可能因为SWC个数较多需要进行分层设计或者需要将多个小功能SWC进行分类,这就需要做一层逻辑上的封装,将多个SWC进行组合打包成1个整体,这个整体我们一般称之为Composition。

       多个SWC可以组成成一个Composition,这个Composition一般是设计上的概念,不提供任何附加功能,仅用于提供结构,为了方便设计的时候使用,也不生成任何ECU代码,只对应SWC的界面设计。

       如下图,将多个传感器Sensor SWC封装到一起,就多出了1个Sensor Composition的内容,这个Composition将Sensor1和Sensor2封装起来,通过Composition对外进行统一接口交互,从界面上看起来,要更有层次,更为简洁一点了,这个特点在设计较多SWC的时候就显得尤为重要和好用了。当然,Sensor Composition的引入,并不生成额外的代码,即从代码层面上来说,多封装了一层Composition和无Composition相比较,并无差异。

2. Port端口

       前面介绍了SWC功能组件的设计,针对SWC功能组件之间的数据交互,需要通过Port Interface/端口进行,Port端口就类似于一组数据或服务传输总线,在Port端口中可以传输各种数据类型的数据内容或服务内容。下面我们看一下Port端口的相关概念;

       如上图,可以看到,从数据/服务提供和消费方角度来看,Port分为2种角色,其中,数据/服务消费方的Port,称之为Require Port(简称为R-Port);数据/服务提供方的Port,称之为Provided Port(简称为P-Port);Port之间的连线可以看成连接器,只有Port之间通过连线建立了连接,数据/服务通路才是正常打通的。

       从功能场景和交互方式角度来看,又分为Sender/Receiver Port、Client/Server Port,这2种Port比较常用,下面主要介绍这2类Port。

2.1 Sender-Receiver Port

       Sender/Receiver Port侧重于数据传输,如下图;

① 支持ECU内部不同SWC之间通信;如下图,ECU内部SWC1和SWC2之间的数据传输;

② 支持不同ECU之间的通信;如下图,ECU内部SWC2与BSW之间的通信,SWC2通过BSW将数据放在Bus总线上,通过总线将数据传输到其他ECU上,这就实现了不同ECU之间的数据交互,体现在下图ECU内部,就是SWC2与BSW之间的数据交互了。

       因此,Sender/Receiver Port的接口交互分为 "SWC与SWC之间" 和 "SWC与BSW之间" 这两条路径。

       Sender/Receiver Port在使用时,支持如下属性:

i. 可以1:1的收发,也可以1:n或n:1的收发;

ii. 每个Port可包含1到多个DataElement,Port相当于数据总线,DataElement相当于数据通道Channel;

iii. 每个DataElement中可以涵盖各种基本类型数据、自定义各种复杂数据类型数据;

2.2 Client-Server Port

       Client/Server Port侧重于服务交互

       Client/Server Port侧重于数据传输,如下图;

① 支持ECU内部不同SWC之间通信;

② 支持不同ECU之间的通信;

       即,Client/Server Port的接口交互也是分为 "SWC与SWC之间" 和 "SWC与BSW之间" 这两条路径。

       Client/Server Port在使用时,支持如下属性:

i. 可以1:1的交互,也可以n:1的交互;即支持1个Client Port对应1个Server Port的连接,也支持多个Client Port对应1个Server Port的连接;

ii. 每个Port可包含1到多个Operation操作;Port相当于服务总线,Operation相当于单个服务操作;

iii. 每个Operation操作内部可以传入传出自定义的数据类型;

iv. Client端通过Client Port调用服务之后,Server端就会被触发,然后Server端对应的具体服务内容就做执行操作了;

v. Client-Server Port之间的调用关系可以是Synchronous同步的、也可以是Asynchronous异步的;Synchronous同步简单理解类似于函数A嵌套调用函数B的过程,其中,ClientPort对应函数A,ClientPort对应函数B,Client端在调用ClientPort之后,程序会Block等待中,待Server端执行完成返回值之后,ClientPort端的程序会继续执行;Asynchronous异步是指,Client端在下发调用CllientPort请求之后,不需要等待Server端执行完成和返回值,直接执行后面的程序,这里面就没有Client端Block住的过程。

       除了常用的Sender/Receiver和Client/Server Port之外,还有NVData Port(NvM存储数据Port端口,类似于SendReceiver Port)、Mode Port(模式管理Port)、Calibration Port(标定数据Port),一般来说,这几类Port用的比较少。

3. Runnable运行实体

       前面提到了SWC功能组件和Port接口的内容,SWC作为功能组件,Port作为不同功能组件之间数据交互的接口,那么就有个问题,Port接口的调度执行是由谁来承载的?Runnable运行实体就是做这个承载实体的,Runnable除了承载Port接口的调度执行之外,还承载了功能&算法的调度执行。

       一个Runnable是一个原子软件组件SWC的可执行单元,Runnable是SWC的一些行为,说简单点它们就是SWC的一些具体逻辑的实现,就是一个函数,这些函数会被RTE调用、然后得到执行,具体的流程是:

a, 如上图,以主流工具链VectorDavinciDeveloper为例,为相应的SWC创建一些Runnable,然后为这些Runnable设定一些执行触发条件Triggers,Triggers的种类包含多种:Init, Background, Periodic等等,可以根据需求进行设定;

b, 创建完Runnable之后,Runnable作为SWC行为的载体,是无法自行启动调用执行的,需要借助OS操作系统来启动调度;故这就需要将Runnable映射Map到OS Task中去运行,映射操作,一般也都是通过工具链去操作的,在OS操作系统调度时,检测到满足Runnable的Triggers触发条件满足的情况下,就通过OS Task调度执行对应的Runnable了。

4. AUTOSAR Application整体回顾

       如下图,为1个SWC的总体介绍,它包含了SWC的基本内容,SWC的映射,将相应的SWC分布到对应的ECU中,其中的相应的PORT,PORT的DataElement,以及它们的映射,每个SWC的Runnable,以及Runnable的执行触发条件(event和timer)Task,还包含各个SWC与SWC之间的Port的调用。

① SWC与ECU的映射;

     SWC1和SWC2部署在ECU1,SWC3部署在ECU2,即SWC1和SWC2之间走的是ECU内部的通信,SWC1/SWC2与SWC3走的是ECU之间的通信;

② Runnable的触发调用;

     Runnable1/Runnable2/Runnable3的触发调用都是由OS触发调用执行的,触发条件包含多种,有事件触发、时间周期触发、条件触发等等,后续讲OS细致章节的时候会详细介绍;

③ Port之间的数据交互;

     ECU内部,SWC1与SWC2之间的数据交互,通过Port端口,走的RTE实现数据交互;ECU之间,SWC2与SWC3之间的数据交互,通过Port端口,走的RTE实现SWC与BSW之间的数据交互;关于RTE在这个里面所起的作用,后续会详细介绍。

5. 总结

       以上内容即为 “AUTOSAR Application” 的整体内容了,后面我们将会持续更新AUTOSAR RTE层架构和BSW相关内容,包含RTE层功能原理、BSW层架构、典型协议栈模块的功能原理和开发内容示例。

       敬请期待......

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AUTOSAR普及侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值