汽車開放系統架構(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.pswp.cn/bicheng/71856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71856.shtml
英文地址,請注明出處:http://en.pswp.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…