0. 概述
autoas/as 工程的RTE(Runtime Environment)通過自動生成C代碼,將各SWC(軟件組件)之間的數據通信全部靜態化、結構化,實現了類似“靜態消息總線”的通信模型。所有端口的數據交換都必須經過RTE接口完成,從而保證了組件之間的徹底解耦和AUTOSAR風格的分層設計。
1. RTE自動生成與代碼主流程
1.1 配置與建模
- 每個SWC用 Python 腳本(如
rte.py
)描述端口(P-Port / R-Port)、Runnable(行為)等。 - 這些腳本定義了端口名稱、方向、數據類型、定時事件等信息,作為RTE代碼生成的輸入。
1.2 RTE生成工具
- 工程中的
tools/generator/Rte.py
腳本會讀取配置,自動導入并執行各 SWC 的rte.py
。 - 這些腳本會調用
main(genDir)
,輸出針對每個 SWC 的 RTE C 代碼和頭文件。
1.3 生成的RTE代碼內容
- 生成的C代碼(如
Rte_SwcTelltale.c
)會包括:- 端口數據的靜態變量(數據緩沖區)
- 針對每個端口的讀寫函數(如
Rte_Write_TPMS(...)
、Rte_Read_TPMS(...)
、Rte_Write_Led1Sts(...)
、Rte_Read_Led1Sts(...)
) - Runnable 相關的調度函數和事件定義
2. 端口訪問機制(靜態“消息總線”)
- 每個端口的數據都用靜態C變量存儲。
- 寫端口:調用RTE生成的寫函數,將數據寫入對應變量。
- 讀端口:調用RTE生成的讀函數,從變量讀取數據。
- 所有SWC都通過這些RTE函數訪問數據,實現了解耦和統一調度。
3. 代碼與建模示例
3.1 Python建模
class Telltale(autosar.Template):@classmethoddef addPorts(cls, swc):swc.apply(TPMS.Send) # P-Portswc.apply(Led1Sts.Receive) # R-Port@classmethoddef addBehavior(cls, swc):swc.behavior.createRunnable('Telltale_run', portAccess=[...])swc.behavior.createTimingEvent('Telltale_run', period=20)
3.2 生成的C代碼
static OnOff_T TPMS_Buffer; // 靜態緩沖區
static OnOff_T Led1Sts_Buffer; // 靜態緩沖區Std_ReturnType Rte_Write_TPMS(OnOff_T value) {TPMS_Buffer = value;return E_OK;
}
Std_ReturnType Rte_Read_TPMS(OnOff_T* value) {*value = TPMS_Buffer;return E_OK;
}
Std_ReturnType Rte_Write_Led1Sts(OnOff_T value) {Led1Sts_Buffer = value;return E_OK;
}
Std_ReturnType Rte_Read_Led1Sts(OnOff_T* value) {*value = Led1Sts_Buffer;return E_OK;
}
- SWC通過
Rte_Write_TPMS
和Rte_Read_TPMS
完成TPMS端口數據的寫入和讀取。 - 通過
Rte_Write_Led1Sts
和Rte_Read_Led1Sts
完成Led1Sts端口的數據通信。 - 數據存儲在靜態變量,實現“靜態消息總線”功能。
4. 端口數據交換的原理與時序
4.1 背景說明
- AUTOSAR架構下,SWC間不能直接訪問彼此的數據,而只能通過端口通信。
- 端口是數據傳遞的通道,例如SWC_A有P-Port(輸出),SWC_B有R-Port(輸入),二者通過端口和RTE關聯。
- 所有數據交換都必須通過RTE接口(如Rte_Write_TPMS、Rte_Read_TPMS、Rte_Write_Led1Sts、Rte_Read_Led1Sts)進行。
4.2 場景舉例與流程
假設有兩個SWC:
- SWC_A(發送者):有P-Port(如TPMS輸出)
- SWC_B(接收者):有R-Port(如Led1Sts輸入)
數據流動流程
- SWC_A想要發送TPMS數據
- SWC_A調用
Rte_Write_TPMS(value)
,不是直接賦值給SWC_B的變量。
- SWC_A調用
- RTE接口實現
Rte_Write_TPMS
函數把數據寫入RTE內部的靜態緩沖區(如TPMS_Buffer
)。
- SWC_B想要讀取TPMS數據
- SWC_B不直接訪問SWC_A變量,而是調用
Rte_Read_TPMS(&value)
。
- SWC_B不直接訪問SWC_A變量,而是調用
- RTE接口實現
Rte_Read_TPMS
函數從RTE緩沖區讀取SWC_A寫入的數據,返回給SWC_B。
同理,Led1Sts端口的通信流程一致。
5. Mermaid邏輯結構與時序圖
5.1 靜態結構圖
說明:
- SWC_A 用 RTE 的寫函數寫入TPMS端口數據,數據保存在 RTE 的靜態變量中。
- SWC_B 用 RTE 的讀函數讀取TPMS端口數據,讀取的就是同一份靜態變量,實現“總線”式數據傳遞。
5.2 時序圖
6. 詳細說明與總結
- SWC_A 只管調用RTE提供的寫接口,不關心誰會用數據,也不知道數據會被誰用。
- RTE 就像一個中介或“數據中轉站”,把數據緩存在自己的緩沖區里。
- SWC_B 只管調用RTE的讀接口,不關心數據是哪里來的,只管要。
- 整個過程中,SWC_A和SWC_B完全沒有直接聯系,一切都通過RTE接口完成。
代碼片段示意
// 寫入端口數據
Std_ReturnType Rte_Write_TPMS(OnOff_T value) {TPMS_Buffer = value;return E_OK;
}// 讀取端口數據
Std_ReturnType Rte_Read_TPMS(OnOff_T* value) {*value = TPMS_Buffer;return E_OK;
}
- SWC_A調用
Rte_Write_TPMS(new_value);
,數據寫進RTE緩沖區。 - SWC_B調用
Rte_Read_TPMS(&myValue);
,從RTE緩沖區讀取數據。
總結
“端口的所有數據交換都通過RTE接口完成”就是:每個軟件組件之間的數據傳遞,都必須通過RTE生成的讀寫接口函數,數據實際存放在RTE的緩沖區里,誰也不能直接訪問別人的數據,所有交互都是中轉。
這種設計保證了組件間徹底解耦,便于管理、測試和安全性分析,也使得@autoas/as工程的RTE如同一個靜態高效的消息總線,完全契合AUTOSAR的分層和解耦思想。