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的功能基本上都是用来实现特定的算法。
集合级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)
install_url
to use ShareThis. Please set it in _config.yml
.