Autosar学习

应用软件层AppL

应用软件层最重要的就是SWC, 而SWC之间的通信需要接口,每个SWC由runnable组成,所以应用软件层的组成主要分为三个部分:

  • 应用软件组件(SWC)
  • AutoSAR的接口(Ports)和连接器(Connector)
  • 可运行实体(Runnable)

例子:汽车顶灯控制
汽车的顶灯一般有三种模式:常闭,常开,随着车的开关而开关的模式。实现汽车顶灯的控制需要传感器,处理单元和执行器。假设左右两个车门,左右两个车灯,一个开关传感器。该车顶的的控制需要7个SWC实现。但是这些SWC并非由一个ECU完成。

SWC之间的通信是通过虚拟功能总线(VFB)实现,该总线是片内外通信的结合体:

  • 在片内通过RTE通信。每个SWC可以理解为一个.c文件,C文件之间的通信通过全局变量进行。
  • 在片外通过片外的总线进行通信。常用的就是CAN总线。

在实际的汽车中,上述的7个SWC将被分配到两个ECU中。车灯开关,调光控制器和左右顶灯由车身顶部的ECU控制;左右车门和车门开关逻辑单元由专用的车门ECU芯片控制。两个ECU即连个控制器,分别位于车身前部的车门控制器和车身顶部的顶灯控制器。ECU内部通信通过RTE进行管理,跨ECU通信通过外部CAN总线进行。

SWC的类型

SWC的类型总共有三种:原子级SWC(Atomic SWC),集合级SWC(Composition SWC),特殊的SWC。
原子级SWC(Atomic SWC): 最小单元,不可再拆分,每个原子级SWC对应一个.c文件。比其更小的单元是runnable,即.c文件中的函数。每个SWC的功能基本上都是用来实现特定的算法。

Atomic SWC

集合级SWC(Composition SWC):该级别的SWC将很多功能相近或者需要整合到一处的Atomic SWC整合起来,方便SWC归类。

集合级SWC类似于一个文件夹,用于存放相近功能的Atomic SWC.

特殊SWC:在实际的工程中,不止应用层需要设计SWC, 在基础软件层中,IO硬件抽象成层和复杂驱动(CDD)都需要手动添加代码。他们被看做一种特殊的SWC进行操作。

接口(Ports)的类型

Ports存在于SWC之间作为通信的通道。或者SWC通过RTE和BSW做接口通信使用。Ports共有五种类型,如下图所示:

S/R接口:用于传输数据。该数据传输过程通过RTE进行管理,避免数据出错。如同时调用同一数据可能出错。在数据传输时,一个接口可以包含多个数据,类似于通过结构体的传输。可以传输的数据类型包括基础的如int, float等,以及复杂数据类型如record, array等。

C/S接口:该接口的作用是提供操作,即Server提供函数供Client调用。调用的过程分为同步,异步两种。同步代表直接调用,相当于函数直接插入上下文运行;异步需要灯带,相当于函数在另一个线程中运行,不影响原线程运行。C/S接口的可以提供多个操作(函数),可在ECU内部或者跨ECU调用。

可运行实体(Runnable)

Runnable即SWC中的函数,在AutoSAR架构被DaVinci软件生成时,Runnable是空函数,需要手动添加代码实现相应功能。Runnable可以被触发,例如定时器触发,操作调用触发,以及接受数据触发等。

实时运行环境(RTE)

RTE是AutoSAR架构中介于应用层和基础软件层之间,是AutoSAR虚拟功能总线VFB的接口的实现。其目的是为应用软件的SWC之间的通信提供基础设施服务,并促进包括OS在内的基础软件组建的访问。

RTE在Vector的工具链中是自动生成的,它的作用包括:

  • 提供ECU内部或者跨ECU的通信管理,通过VFB, RTE就是VFB的具体实现。
  • 提供对Runnable的管理功能,包括触发,唤醒等。即RTE可以把Runnable配置到OS对应的Task中去,生成的Task代码通过RTE的时间触发runnables的运行。注意这里RTE抽象了OS,防止SWC直接访问OS和BSW。

下图是车顶的控制系统中SWC与RTE以及BSW的组件之间的关系。

RTE对Runnables的运行支撑

RTE作为运行环境的主要功能有:

  • 通过RTE给runnables提供触发时间
  • 通过RTE给runnables提供所需的资源
  • 将BSW和SWC做隔绝:即runnables的运行条件由RTE提供,不能由OS直接提供。

Runnables的触发条件
Runnables在设计时,需要考虑触发条件,负责无法运行。触发条件即一些特定的事件。AutoSAR中主要规定了以下触发事件:

  • 初始化事件:初始化自动触发
  • 定时器事件:给定一个周期性定时器,计时完成自动触发
  • 接受数据事件(S/R): Receiver Ports接受数据即可触发
  • 接受数据错误事件
  • 数据发送完成事件:Send Ports发送完成即可触发
  • 操作调用事件(C/S):
  • 模式切换事件
  • 模式切换应答事件
  • 异步服务返回事件:C/S可在异步下运行,即在异步调用Server函数时,被调用函数作为一个线程与当前程序并行运行,运行结束后返回时,将会触发异步服务返回事件。

RTE对Ports的支持

RTE可以作为SWCs和BSW之间的交流途径:

  • 作为VFB的具体实现
  • 作为S/R接口的通信实现
  • 作为C/S接口的通信实现
  • ECU内部通信/跨ECU通过COM口通信
  • 实现AR-COM的回调功能,具体实现是在SWC中完成的,RTE负责完成这个回调机制
    其他特征:
  • RTE提供了一种实现数据一致性的机制,即避免多个SWC同时操作一个数据出现问题。
  • RTE支持简单和复杂的数据类型
  • 对SWC的类型进行实例化

R/S接口的实现
在配置好DaVinci后,RTE会自动生成一些调用,在runnable上方,可以直接复制。下面是一个例子:

/**********************************************************************************************************************
 *
 * Runnable Entity Name: RAB_Core0_100us
 *
 *---------------------------------------------------------------------------------------------------------------------
 *
 * Executed if at least one of the following trigger conditions occurred:
 *   - triggered on TimingEvent every 100us
 *
 **********************************************************************************************************************
 *
 * Input Interfaces:
 * =================
 *   Explicit S/R API:
 *   -----------------
 *   Std_ReturnType Rte_Read_AppPI_Can_ReceiverCore0_DEP_Can_Receiver(Idt_Can_Receiver *data)
 *
 * Output Interfaces:
 * ==================
 *   Explicit S/R API:
 *   -----------------
 *   Std_ReturnType Rte_Write_AppPI_Can_SenderCore0_DEP_Can_Sender(Idt_Can_Sender data, Rte_TransformerError *transformerError)
 *
 * Service Calls:
 * ==============
 *   Service Invocation:
 *   -------------------
 *   Std_ReturnType Rte_Call_ComM_UserRequest_GetCurrentComMode(ComM_ModeType *ComMode)
 *     Synchronous Service Invocation. Timeout: None
 *     Returned Application Errors: RTE_E_ComM_UserRequest_E_NOT_OK
 *   Std_ReturnType Rte_Call_ComM_UserRequest_GetMaxComMode(ComM_ModeType *ComMode)
 *     Synchronous Service Invocation. Timeout: None
 *     Returned Application Errors: RTE_E_ComM_UserRequest_E_NOT_OK
 *   Std_ReturnType Rte_Call_ComM_UserRequest_GetRequestedComMode(ComM_ModeType *ComMode)
 *     Synchronous Service Invocation. Timeout: None
 *     Returned Application Errors: RTE_E_ComM_UserRequest_E_NOT_OK
 *   Std_ReturnType Rte_Call_ComM_UserRequest_RequestComMode(ComM_ModeType ComMode)
 *     Synchronous Service Invocation. Timeout: None
 *     Returned Application Errors: RTE_E_ComM_UserRequest_E_MODE_LIMITATION, RTE_E_ComM_UserRequest_E_NOT_OK
 *
 *********************************************************************************************************************/
/**********************************************************************************************************************
 * DO NOT CHANGE THIS COMMENT!           << Start of documentation area >>                  DO NOT CHANGE THIS COMMENT!
 * Symbol: RAB_Core0_100us_doc
 *********************************************************************************************************************/


​ /**********************************************************************************************************************
​ * DO NOT CHANGE THIS COMMENT! << End of documentation area >> DO NOT CHANGE THIS COMMENT!
/

FUNC(void, SWCCore0Basic_Type_CODE) RAB_Core0_100us(void) /* PRQA S 0850 / / MD_MSR_19.8 */
{
/
*
* DO NOT CHANGE THIS COMMENT! << Start of runnable implementation >> DO NOT CHANGE THIS COMMENT!
* Symbol: RAB_Core0_100us
*********************************************************************************************************************/


​ /**********************************************************************************************************************
​ * DO NOT CHANGE THIS COMMENT! << End of runnable implementation >> DO NOT CHANGE THIS COMMENT!
​ *********************************************************************************************************************/
​ }

直接调用: 相当于有一个全局变量,runnable可以直接读写这个变量。

其写法采用一下语法:(指的是全局变量的名字,data指的是局部变量。这些函数都是在runnable中使用的)

Std_ReturnType Rte_Read_<port>_<data> (<DataType> *data)
Std_ReturnType Rte_Write_<port>_<data> (<DataType> data)

缓存调用: 该调用方式相当于先将全局变量复制到一个runnable的局部变量中,然后对局部变量进行操作,最后把这个局部变量赋值到全局变量中。

使用方法:

<DataType> Rte_IRead_<r>_<port>_<data> (void)
void Rte_IWrite_<r>_<port>_<data> (<DataType> data)

队列调用:

RTE数据一致性的实现

RTE对Interface的支持

基础软件层(BSW)

作者

John Doe

发布于

2021-05-01

更新于

2022-03-25

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论