汽车开放系统架构(AUTOSAR)中运行时环境(RTE)生成过程剖析

在这里插入图片描述

一、引言

在当今高度智能化的汽车电子领域,软件系统的复杂性呈指数级增长。为了应对这一挑战,汽车开放系统架构(AUTOSAR)应运而生,它为汽车电子软件开发提供了标准化的分层架构和开发方法。其中,运行时环境(RTE)作为 AUTOSAR 架构中的关键部分,负责协调软件组件之间的通信和调度,确保整个系统的高效运行。本文将深入探讨 AUTOSAR 中 RTE 的生成过程,详细介绍 RTE 合同阶段和 RTE 生成阶段,并通过具体的例子,包括文件内容、源代码以及.arxml 文件,帮助读者更好地理解这一复杂的过程。

二、AUTOSAR 分层架构

AUTOSAR 采用分层架构,这种架构设计使得软件的开发和维护更加模块化和可扩展。主要包含三个层次:

(一)应用层(Application Layer)

应用层是汽车电子系统中与具体功能相关的部分,它包含了各种软件组件和 RTE。例如,在一个智能驾驶汽车的系统中,应用层可能包含了用于处理传感器数据的软件组件、用于决策的软件组件以及用于控制执行器的软件组件。这些软件组件通过 RTE 进行通信和协作,共同实现智能驾驶的功能。

(二)RTE 层

RTE 层就像是一个桥梁,负责软件组件之间的通信和调度。当应用层中的一个软件组件需要与另一个软件组件进行数据交换时,它会通过 RTE 来完成。例如,传感器数据处理组件需要将处理后的数据发送给决策组件,这一过程就需要 RTE 来协调。

(三)基础软件层(Base Software Layer)

基础软件层为应用层和 RTE 层提供了底层的支持,它又细分为服务层、ECU 抽象层和微控制器抽象层。

  • 服务层(Service Layer):提供了一系列的服务,如内存管理、任务调度等。例如,在一个汽车的多媒体系统中,服务层可能会提供内存分配服务,用于存储音频和视频数据。
  • ECU 抽象层(ECU Abstraction Layer):将应用层和微控制器抽象层隔离开来,使得应用层可以独立于具体的硬件平台进行开发。例如,不同型号的汽车可能使用不同的 ECU,但应用层的软件组件可以通过 ECU 抽象层来访问这些 ECU,而不需要关心具体的硬件细节。
  • 微控制器抽象层(Microcontroller Abstraction Layer):直接与微控制器进行交互,提供了对微控制器硬件资源的访问接口。例如,它可以提供对 GPIO 引脚、定时器等硬件资源的控制接口。

下面是一个简单的 AUTOSAR 分层架构示意图:

在这里插入图片描述

三、软件组件开发与部署

在软件组件开发过程中,可分为两个阶段:

(一)软件组件开发(Software Component Development)

软件组件开发涵盖了软件组件的规格定义、设计和实现。例如,我们要开发一个用于控制汽车发动机的软件组件,在规格定义阶段,我们需要明确该组件的功能需求,如控制发动机的转速、温度等。在设计阶段,我们需要设计组件的内部结构和接口,如定义输入输出端口、事件和可运行实体等。在实现阶段,我们使用编程语言(如 C 语言)来编写具体的代码。

以下是一个简单的软件组件代码示例:

// 发动机控制软件组件
#include <stdio.h>// 定义输入端口
typedef struct {int current_speed;int current_temperature;
} EngineInput;// 定义输出端口
typedef struct {int throttle_position;int cooling_fan_speed;
} EngineOutput;// 可运行实体函数
void EngineControl(EngineInput input, EngineOutput *output) {// 根据输入计算输出if (input.current_speed < 50) {output->throttle_position = 80;} else {output->throttle_position = 60;}if (input.current_temperature > 90) {output->cooling_fan_speed = 100;} else {output->cooling_fan_speed = 50;}
}

(二)软件组件部署(Software Component Deployment)

软件组件部署涉及将应用程序集成到基础软件中,并将组件分配到 ECU。例如,我们将上述发动机控制软件组件集成到汽车的 ECU 中,需要考虑组件与基础软件的接口兼容性,以及组件在 ECU 中的资源分配情况。

四、RTE 概述

RTE 即运行时环境,其主要职责是实现应用层中软件组件之间的通信,以及软件组件的调度。当应用层需要与基础软件通信时,也需通过 RTE 进行。

例如,在一个汽车的车身控制系统中,有一个用于控制车门锁的软件组件和一个用于控制车窗升降的软件组件。当驾驶员按下车门锁按钮时,车门锁控制组件会通过 RTE 将信号发送给车窗升降控制组件,以确保在车门锁定时车窗也能自动关闭。

五、RTE 生成阶段

RTE 生成器主要在两个阶段运行:

(一)合同阶段(Contract Phase)

  • 输入:仅考虑软件组件描述文件(如.arxml 文件)。以下是一个简单的.arxml 文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<AR-PACKAGE><SHORT-NAME>EngineControlComponent</SHORT-NAME><ELEMENTS><SW-COMPONENT-TYPE><SHORT-NAME>EngineControl</SHORT-NAME><Ports><R-PORT-PROTOTYPE><SHORT-NAME>EngineInputPort</SHORT-NAME><DATA-PROTOTYPE><SHORT-NAME>EngineInput</SHORT-NAME><TYPE-TREF>EngineInputType</TYPE-TREF></DATA-PROTOTYPE></R-PORT-PROTOTYPE><P-PORT-PROTOTYPE><SHORT-NAME>EngineOutputPort</SHORT-NAME><DATA-PROTOTYPE><SHORT-NAME>EngineOutput</SHORT-NAME><TYPE-TREF>EngineOutputType</TYPE-TREF></DATA-PROTOTYPE></P-PORT-PROTOTYPE></Ports></SW-COMPONENT-TYPE><DATA-TYPE-MAP><SHORT-NAME>EngineDataTypes</SHORT-NAME><DATA-TYPE-REFS><DATA-TYPE-REF><SHORT-NAME>EngineInputType</SHORT-NAME><TYPE-TREF>STRUCTURE-TYPE</TYPE-TREF><STRUCTURE-TYPE><SHORT-NAME>EngineInput</SHORT-NAME><ELEMENTS><STRUCTURE-ELEMENT><SHORT-NAME>current_speed</SHORT-NAME><TYPE-TREF>INTEGER-TYPE</TYPE-TREF></STRUCTURE-ELEMENT><STRUCTURE-ELEMENT><SHORT-NAME>current_temperature</SHORT-NAME><TYPE-TREF>INTEGER-TYPE</TYPE-TREF></STRUCTURE-ELEMENT></ELEMENTS></STRUCTURE-TYPE></DATA-TYPE-REF><DATA-TYPE-REF><SHORT-NAME>EngineOutputType</SHORT-NAME><TYPE-TREF>STRUCTURE-TYPE</TYPE-TREF><STRUCTURE-TYPE><SHORT-NAME>EngineOutput</SHORT-NAME><ELEMENTS><STRUCTURE-ELEMENT><SHORT-NAME>throttle_position</SHORT-NAME><TYPE-TREF>INTEGER-TYPE</TYPE-TREF></STRUCTURE-ELEMENT><STRUCTURE-ELEMENT><SHORT-NAME>cooling_fan_speed</SHORT-NAME><TYPE-TREF>INTEGER-TYPE</TYPE-TREF></STRUCTURE-ELEMENT></ELEMENTS></STRUCTURE-TYPE></DATA-TYPE-REF></DATA-TYPE-REFS></DATA-TYPE-MAP></ELEMENTS>
</AR-PACKAGE>
  • 处理过程:读取软件组件描述文件,并生成组件 API。
  • 输出:特定软件组件的头文件。以下是根据上述.arxml 文件生成的头文件示例:
#ifndef ENGINE_CONTROL_RTE_H
#define ENGINE_CONTROL_RTE_H// 定义输入输出数据类型
typedef struct {int current_speed;int current_temperature;
} EngineInput;typedef struct {int throttle_position;int cooling_fan_speed;
} EngineOutput;// 声明 RTE 函数
void Rte_Read_EngineInputPort(EngineInput *input);
void Rte_Write_EngineOutputPort(EngineOutput *output);#endif // ENGINE_CONTROL_RTE_H
  • 用例及优势:可用于软件与目标库的共享。同时,该阶段能解决 RTE 生成过程中的一些问题。例如,在 RTE 生成时,RT 缓冲区访问默认被授予,其缓冲区编号可能会因 AUTOSAR 接口变更或.arxml 文件配置更改而改变,这可能导致链接器错误。而合同阶段通过用函数调用替代直接的缓冲区访问,确保应用开发者在源代码中无需直接访问变量,而是调用 RTE 生成的函数,从而避免此类问题。以下是修改后的发动机控制软件组件代码,使用 RTE 函数进行数据读写:
// 发动机控制软件组件
#include "EngineControlRte.h"// 可运行实体函数
void EngineControl(void) {EngineInput input;EngineOutput output;// 从 RTE 读取输入数据Rte_Read_EngineInputPort(&input);// 根据输入计算输出if (input.current_speed < 50) {output.throttle_position = 80;} else {output.throttle_position = 60;}if (input.current_temperature > 90) {output.cooling_fan_speed = 100;} else {output.cooling_fan_speed = 50;}// 将输出数据写入 RTERte_Write_EngineOutputPort(&output);
}

(二)生成阶段(Generation Phase)

  • 输入:包括 ECU 提取文件、系统描述文件、ECC 值、s_swcd 文件和 bsmd 文件等。假设 ECU 提取文件包含了 ECU 的硬件配置信息,如 GPIO 引脚的分配、定时器的参数等。以下是一个简单的 ECU 提取文件示例:
# ECU 提取文件
GPIO_Pin_1: Input
GPIO_Pin_2: Output
Timer_1_Period: 100ms
  • 处理过程:利用这些文件为单个 ECU 生成 RTE 代码。
  • 输出:生成等效的头文件、源文件(如.rte.c)以及相关的 XML 文件。以下是生成的 RTE 源文件示例:
#include "EngineControlRte.h"// 模拟的 RT 缓冲区
static EngineInput rt_input_buffer;
static EngineOutput rt_output_buffer;// RTE 读取输入端口函数实现
void Rte_Read_EngineInputPort(EngineInput *input) {*input = rt_input_buffer;
}// RTE 写入输出端口函数实现
void Rte_Write_EngineOutputPort(EngineOutput *output) {rt_output_buffer = *output;
}
  • 用例:当需要将应用层软件(ASW)集成到基础软件(BSW),或者有来自 OEM 或第三方的软件共享文件时,这些操作都会在生成阶段进行处理。例如,将发动机控制软件组件集成到汽车的基础软件中,需要在生成阶段将 RTE 代码与基础软件进行链接和编译。

六、软件组件实现类别

软件组件实现类别在 RTE 生成过程中起着关键作用。在创建软件组件时,需明确其交付形式,如源文件(s_SW_SRC)、目标文件或头文件。当指定为 s_SW_SRC 时,会触发生成阶段;而指定为目标文件时,则会触发合同阶段。此外,在软件组件实现映射中,还需明确特定软件组件的内部行为。

例如,我们将发动机控制软件组件以源文件的形式交付,那么在 RTE 生成过程中,会触发生成阶段,将源文件与 RTE 代码一起编译和链接。如果以目标文件的形式交付,则会触发合同阶段,对目标文件进行处理。

七、总结

通过上述内容,我们对 RTE 生成过程有了清晰的认识。合同阶段以软件组件描述文件为输入,输出等效的头文件;而生成阶段则综合考虑更多文件,输出等效的头文件、源文件及相关 XML 文件。理解这两个阶段对于汽车电子软件开发中确保软件组件的正确通信和调度至关重要。同时,通过具体的例子,包括.arxml 文件、源代码等,我们更加直观地了解了 RTE 生成过程的具体实现。在实际的汽车电子软件开发中,开发者需要根据具体的需求和场景,合理运用 RTE 生成过程,提高软件的开发效率和质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MATLAB的OFDM通信系统仿真设计

下面将为你详细介绍基于MATLAB的OFDM通信系统仿真设计的步骤和示例代码。 1. OFDM系统原理概述 正交频分复用&#xff08;OFDM&#xff09;是一种多载波调制技术&#xff0c;它将高速数据流通过串并转换&#xff0c;分配到多个正交的子载波上进行传输&#xff0c;这样可以有效…

stm32仿真 74hc238流水灯 数码管动态数字显示

f103c6t6a_hex文件 #include "main.h"![请添加图片描述](https://i-blog.csdnimg.cn/direct/8c0d44b121134cf08f5186df316ea07f.gif)#include "stdlib.h"void SystemClock_Config(void); static void MX_GPIO_Init(void); // 自定义abc引脚 #define A_PIN…

结构型模式 - 代理模式 (Proxy Pattern)

结构型模式 - 代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式&#xff0c;它允许通过代理对象来控制对另一个对象&#xff08;目标对象&#xff09;的访问。代理对象充当目标对象的接口&#xff0c;客户端通过代理对象间接访问目标对象。 分为两大类 静态代理&#…

网络层(IP)

基本概念 子网和局域网是一个概念主机: 配有 IP 地址, 也能进行路由控制的设备;路由器: 即配有 IP 地址, 又能进行路由控制;节点&#xff1a; 路由器和主机的统称。 背景 两主机并不是直接连接的&#xff0c;路径选择问题&#xff1f;为什么&#xff1f; 由网络层&#xff08…

JMeter性能问题

性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…

创建型模式 - 建造者模式 (Builder Pattern)

创建型模式 - 建造者模式 (Builder Pattern) 建造者模式是一种创建型设计模式&#xff0c;它将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 需求描述 在游戏开发中&#xff0c;创建一个复杂的游戏角色&#xff0c;角色具有多种属性&…

代码随想录第二十天|二叉树part08--669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

刷题小记&#xff1a; 上期学习了二叉搜索树的插入和删除操作&#xff0c;这次学习如何按区间修剪二叉搜索树。还有两题&#xff0c;关于借助二叉搜索树的有序特性进行转换。 669.修剪二叉搜索树&#xff08;669.修剪二叉搜索树&#xff09; 题目分析&#xff1a; 给定一个…

Fisher信息矩阵(Fisher Information Matrix,简称FIM)

Fisher信息矩阵简介 Fisher信息矩阵&#xff08;Fisher Information Matrix&#xff0c;简称FIM&#xff09;是统计学和信息理论中的一个重要概念&#xff0c;广泛应用于参数估计、统计推断和机器学习领域。它以统计学家罗纳德费希尔&#xff08;Ronald Fisher&#xff09;的名…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表&#xff1f; 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法&#xff08;时间复杂度O(1)&#xff09; 尾插法&#xff08;时间复杂度O(n)&#xff09; 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

《论湖仓一体架构及其应用》审题技巧 - 系统架构设计师

软考论文写作框架 一、考点概述 “湖仓一体架构及其应用”这一论题&#xff0c;主要考察了考生对现代数据管理系统中湖仓一体架构的理解、应用及问题解决能力。随着5G、大数据、人工智能、物联网等技术的快速发展&#xff0c;企业数据的管理需求正发生深刻变化。传统的数据管…

MybatisPlus-扩展功能-枚举处理器

在Mybatis里有一个叫TypeHandler的类型处理器&#xff0c;我们常见的PO当中的这些成员变量的数据类型&#xff0c;它都有对应的处理器&#xff0c;因此它就能自动实现这些Java数据类型与数据库类型的相互转换。 它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器&#xff0…

北京大学第二弹《DeepSeek提示词工程和落地场景》

大家好&#xff0c;我是吾鳴。 之前给大家分享过北京大学出品的DeepSeek教程《DeepSeek与AIGC应用》&#xff0c;今天吾鳴发现北京大学又出第二版教程了&#xff0c;教程的名称叫做《DeepSeek提示词工程和落地场景》&#xff0c;在此分享给大家。文末有完整版PDF下载地址。 教程…

deepseek自动化代码生成

使用流程 效果第一步&#xff1a;注册生成各种大模型的API第二步&#xff1a;注册成功后生成API第三步&#xff1a;下载vscode在vscode中下载agent&#xff0c;这里推荐使用cline 第四步&#xff1a;安装完成后&#xff0c;设置模型信息第一步选择API provider&#xff1a; Ope…

322.零钱兑换

class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""n len(coins) dp [float(inf)]*(amount 1) # 初始值为正无穷大dp[0] 0 # 一定要初始化为0if amount 0:return 0 …

ARM Cortex-M处理器中的MSP和PSP

在ARM Cortex-M系列处理器中&#xff0c;MSP&#xff08;主堆栈指针&#xff09;和PSP&#xff08;进程堆栈指针&#xff09;是两种不同的堆栈指针&#xff0c;主要用于实现堆栈隔离和提升系统可靠性。以下是它们的核心区别和应用场景&#xff1a; 1. 基本定义 MSP&#xff08;…

交换机与路由器连接方式

交换机和路由器连接的三种主要方式如下&#xff1a; 一、直连连接 这是最简单直接的连接方式。通过一根网线将交换机的一个端口与路由器的一个LAN端口相连。这种连接方式适用于小型网络&#xff0c;其中交换机负责局域网内部的数据交换&#xff0c;而路由器则负责将内部网络连接…

Python代码片段-Excel导入到MongoDB

有一次遇到一个需求&#xff0c;需要把Excel的数据导入到MongoDB中&#xff0c;表面上感觉就是导入数据很简单&#xff0c;但实际操作后&#xff0c;发现是比较麻烦的一个事情&#xff0c;一般图形化的工具对于MongoDB而言&#xff0c;导入选项都是json的&#xff0c;根本没有E…

axios几种请求类型的格式

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…

手写系列——MoE网络

参考&#xff1a; MOE原理解释及从零实现一个MOE&#xff08;专家混合模型&#xff09;_moe代码-CSDN博客 MoE环游记&#xff1a;1、从几何意义出发 - 科学空间|Scientific Spaces 深度学习之图像分类&#xff08;二十八&#xff09;-- Sparse-MLP(MoE)网络详解_sparse moe…

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…