4. AUTOSAR SWC设计与ETAS ISOLAR-AB实现
在AUTOSAR分层架构中,软件组件(Software Component,SWC)是应用层功能封装的基本单元。一个SWC并不直接访问硬件或总线,它通过端口(Port)声明自己需要什么、提供什么,通过Runnable实体描述“什么时候执行什么逻辑”,再由RTE(Runtime Environment)把Runnable与事件、端口、其他SWC连接起来。理解SWC类型、端口接口、Runnable实体以及RTE事件与触发机制,是使用ETAS ISOLAR-AB完成应用软件集成的前提。
一、SWC类型与端口接口
AUTOSAR定义了多种SWC类型,工程中最常见的是应用SWC(Application SWC)和传感器/执行器SWC(Sensor/Actuator SWC)。应用SWC实现控制算法、状态管理、数据处理等纯逻辑功能;传感器/执行器SWC则负责把ECU抽象层的信号转换为SWC可用的数据,或把SWC输出转换为对硬件的控制。此外还有服务SWC、复合SWC等,用于封装服务或组合多个子组件。
SWC之间以及SWC与RTE之间的交互通过端口完成。端口分为两类:
- 提供端口(Provide Port,P-Port):对外提供数据或服务,例如输出一个车速值、提供一个计算服务。
- 需求端口(Require Port,R-Port):向外部请求数据或服务,例如读取发动机转速、调用诊断服务。
端口必须绑定端口接口(Port Interface)。AUTOSAR主要定义了两类接口:发送-接收接口(Sender-Receiver Interface,S/R)和客户端-服务器接口(Client-Server Interface,C/S)。S/R接口用于异步数据传递,包含一个或多个数据元素(Data Element),每个数据元素有明确的数据类型;C/S接口用于同步或异步的服务调用,包含操作(Operation)、参数和返回值。在ISOLAR-AB中创建端口接口时,需要指定接口名称、数据元素名称、数据类型以及是否使用队列等属性。
二、Runnable实体与RTE事件
Runnable实体是SWC内部可被RTE调度的函数,相当于SWC的“执行入口”。一个SWC可以包含多个Runnable,每个Runnable有唯一的名称和函数原型。Runnable本身不决定何时执行,它由RTE事件触发。常见的RTE事件包括:
- 定时事件(TimingEvent):按固定周期触发,例如每10 ms执行一次。
- 数据接收事件(DataReceivedEvent):当某个R-Port收到新数据时触发。
- 操作调用事件(OperationInvokedEvent):当某个C/S端口被调用时触发。
- 模式切换事件(ModeSwitchEvent):当ECU模式或组件模式发生变化时触发。
- 初始化事件(InitEvent):在SWC初始化阶段触发一次。
RTE根据这些事件生成调度代码,把Runnable与触发条件、端口访问、数据拷贝等连接起来。因此,SWC设计阶段必须明确:每个Runnable由什么事件触发、访问哪些端口、读写哪些数据元素、执行周期是多少。
三、在ISOLAR-AB中创建并集成应用SWC
下面以一个简化的“车速限制控制”应用SWC为例,说明在ISOLAR-AB中的典型操作过程。假设该SWC需要读取车速信号,输出限速请求,并每20 ms执行一次控制逻辑。
- 创建SWC:在ISOLAR-AB的组件视图中新建Application SWC,命名为
SpeedLimitControl。设置其类型为Application,并选择所属的软件包路径。 - 定义端口接口:新建一个S/R接口
IF_VehicleSpeed,数据元素为VehicleSpeed,类型为uint16,单位km/h;再新建一个S/R接口IF_SpeedLimitRequest,数据元素为LimitRequest,类型为boolean。 - 添加端口:在
SpeedLimitControl上添加R-PortR_VehicleSpeed,绑定IF_VehicleSpeed;添加P-PortP_SpeedLimitRequest,绑定IF_SpeedLimitRequest。 - 创建Runnable:新建Runnable
RE_Control,函数原型为void RE_Control(void)。在Runnable中通过RTE API读取R_VehicleSpeed,计算限速请求,并写入P_SpeedLimitRequest。 - 绑定触发事件:为
RE_Control添加TimingEvent,周期设为20 ms。若还需要在车速更新时立即响应,可再添加DataReceivedEvent,绑定到R_VehicleSpeed。 - 生成RTE与集成:完成SWC描述后,在ISOLAR-AB中执行RTE生成,检查生成的
Rte_接口和Rte_调度代码。随后将SWC实例映射到ECU,配置任务与Runnable的映射关系,确保20 ms周期任务能够调用RE_Control。
在实现Runnable内部逻辑时,应使用RTE提供的端口访问API,而不是直接操作全局变量。例如读取车速可调用Rte_IRead_RE_Control_R_VehicleSpeed_VehicleSpeed(),写入限速请求可调用Rte_IWrite_RE_Control_P_SpeedLimitRequest_LimitRequest()。这些API由RTE生成,名称与端口、数据元素、Runnable的命名严格对应。
四、RTE事件与触发机制的关系
RTE事件与Runnable的绑定关系决定了SWC的实际执行行为。一个Runnable可以绑定多个事件,但同一时刻RTE只会根据事件类型调用一次。对于TimingEvent,RTE在对应任务中周期调用;对于DataReceivedEvent,RTE在数据接收完成后调用;对于OperationInvokedEvent,RTE在服务被调用时调用。若多个事件同时到达,RTE按照配置的优先级和排队策略处理。
下图展示了SpeedLimitControl SWC的端口、Runnable、RTE事件以及与其他SWC/RTE的交互关系。图中左侧为输入SWC,右侧为输出SWC,中间为当前SWC及其RTE绑定关系。
从图中可以看出,SpeedLimitControl通过R_VehicleSpeed接收车速,通过P_SpeedLimitRequest输出限速请求;RE_Control由20 ms定时事件和车速数据接收事件共同触发;RTE负责事件调度、端口访问和数据拷贝。实际集成时,还需要在ISOLAR-AB中把SWC实例映射到具体ECU,把Runnable映射到OS任务,并确认RTE生成后的接口与任务周期一致。
五、常见检查点
完成SWC设计与集成后,建议重点检查以下内容:端口接口的数据类型是否与接收方一致;Runnable的事件绑定是否覆盖所有必要的触发条件;RTE生成后是否存在未解析的引用;任务周期与TimingEvent周期是否匹配;数据元素是否使用了正确的队列或最后值语义。若出现RTE生成错误,通常优先检查端口接口命名、数据元素类型和Runnable原型是否与SWC描述一致。