一、引言
在當今高度智能化的汽車電子領域,軟件系統的復雜性呈指數級增長。為了應對這一挑戰,汽車開放系統架構(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 生成過程,提高軟件的開發效率和質量。