AR3X_BMT 專案功能

此內容適用於 7.6.1 版或更新版本。 AUTOSAR AR3x_BMT 專案定義 AUTOSAR SW 架構和該 SW 架構之汽車 SW/C 類型的 Rhapsody® 實作。

AR3X_BMT 專案

AR3X_BMT 專案可以包含:
AR3X_BMT 專案還包含其他兩個圖表:
  • RIMB 圖 - 定義 Rhapsody 實作區塊
  • SWC 實作圖 - 透過 RIMB 物件定義 AR SW/C 類型的實作,進而將 RIMBO 與 SW/C 類型鏈結起來
RIMB 埠設計為僅透過委派連接器連接至 AR 埠。有四種類型對應於 RIMB 介面的 RIMB 埠:
  • RIMB 接收端埠 - 由 RIMB 接收端埠介面輸入,並設計為連接至 AR 接收端埠(使用 S/R 介面的 AR 必要埠)
  • RIMB 傳送端埠 – 設計為連接至 AR 傳送端埠
  • RIMB 用戶端埠 – 設計為連接至 AR 用戶端埠
  • RIMB 伺服器埠 – 設計為連接至 AR 伺服器埠
RIMB 介面 - 有四種 RIMB 介面:
  • RIMB 接收端埠介面
  • RIMB 傳送端埠介面
  • RIMB 用戶端埠介面
  • RIMB 伺服器埠介面
RIMB 介面可以具有:
  • 在傳送端或接收端介面上輸入屬性和作業參數,在用戶端或伺服器介面上輸入作業參數。輸入的屬性和作業參數必須為與相符的 AR 資料元素類型相容的 C 類型。
  • 在必須由 Rhapsody 事件輸入的傳送端或接收端介面上使用 Rhapsody 事件輸入屬性。由 Rhapsody 產生的 helper 函數還將產生對應的 Rhapsody 事件,並將資料本身當作選用性參數。此類 Rhapsody 事件可用於觸發 RIMB 狀態圖上的轉移。Rhapsody 事件可以沒有參數,也可以有一個參數,使用與要連接的 AR 資料元素類型相容的 C 類型。Rhapsody 事件的處理透過提供的 helper 函數合力進行。
  • 指定存取模式,它取決於介面類型和是否需要為其提供其他資訊:
    • 接收端介面:存取模式需要在屬性標籤中針對每個屬性指定。存取模式可以具有下列值:
      • 明確封鎖 - 它表示在值到達之前封鎖的 AR 明確存取。在存取權及啟動標籤中,沒有作用中元素可以具有接收到資料事件的啟動原則。

      • 明確無封鎖 - 它表示立即返回並帶有狀態碼的 AR 明確存取。在存取權及啟動標籤中,沒有作用中元素可以具有在發生接收到資料事件時起動的啟動原則。

      • 隱含 - 它表示 AR 隱含存取。在存取權及啟動標籤中,必須有一個存取它的作用中元素。

  • 指定需要提供下列資訊的呼叫模式:
    • 用戶端介面,其呼叫模式需要在作業標籤中針對每個作業指定。呼叫模式可以是:
      • 同步 – 呼叫會在伺服器完成作業之前封鎖

      • 非同步 – 呼叫會立即返回

    另一個具有啟動原則「非同步伺服器呼叫返回事件」的作用中作業,可用於擷取已撰寫參數的值

RIMB 作用中作業 - 該標籤定義 AR 可執行實體。所有在 RIMB 中定義的行為必須由作用中作業啟動(呼叫),包括狀態圖執行。作用中作業可以由任何程式碼實作。作用中作業標籤主要特性為:
  • 存取傳送端或接收端介面上的 DataElements,以及用戶端或伺服器介面上的作業。存取權基於存取權及啟動標籤定義。

  • 決定 RTE 排程器應該何時啟動該作業的啟動原則。它的值可以為下列其中一個:

    非同步啟動原則 - 啟動基於存取權及啟動標籤定義

    定期啟動原則 - 時段和偏移已定義

  • 受保護 - 受保護的作用中作業是互斥的。 由專用的 AR 排除區域實作,在該區域中所有受保護的作用中作業都指定為「在指定範圍內執行」。
RIMB 存取權及啟動 - 該標籤定義相關的內部行為構件。
  • 存取權 - 哪些作用中元素(如資料讀寫存取、資料發送/接收點、伺服器同步或非同步呼叫點、等待點等)存取埠上的哪些元素。 隱含或明確的存取模式在 RIMB 介面上的屬性層次中指定,而不是在這裡。

  • 啟動 - 代表非同步作用中元素的啟動原則。定義哪些 RTE 事件(除了計時事件)將導致啟動每個非同步作用中元素。如果是行定義(其他)存取權,則啟動可能為「不適用」

註: 如果啟動原則為「接收到資料事件」或「在發生接收到資料事件時起動」,則該行同時定義啟動原則和對資料元素的存取權。給定的作用中元素在表格中可以具有多個行。在此情況下,已定義的啟動原則及存取權是所有行的總和。

RIMB 並行可以為作用中(預設值)或循序。 當並行為「作用中」時,將針對 RIMB 的 "doExecute" 方法建立 RunnableEntity。必須指定啟動原則,該原則決定 RTE 何時啟動 RIMB 的 "doExecute" 方法。啟動原則可以為「非同步」或「定期」。「非同步」啟動原則基於「存取權及啟動」標籤定義。「定期」啟動原則基於時段和偏移的定義時間定義。當並行為「循序」時,未定義任何明確啟動。如果 RIMB 定義為執行管理程式,則 RIMB 將實作 "doExecute" 方法,該方法將管理其狀態圖(如果存在)及其組件,並將擁有事件佇列。

產生的 Helper 函數

Rhapsody 可以為 RIMB 產生數個類型的 helper 函數。helper 函數可以從作用中作業呼叫、隱藏 RTE API 的複雜性和特徵並啟用使用進一步服務,如 receiveAndHandleP_x。 helper 函數包含:
  • 接收程式 - 讀取接收端埠上的資料。 在某些情況下,容許變更存取模式而不變更使用者的程式碼。

  • 傳送程式 - 傳送傳送端埠上的資料

  • 處理程式 - 處理收到的資料

  • 接收並處理 - 結合接收和處理的效果

  • 呼叫程式 - 呼叫必要的(用戶端)服務

  • 接收程式、傳送程式、接收並處理和呼叫程式 - 返回 RTE API 狀態

表 1.
產生的 Helper 函數 說明

receiveData_p_x (int* const x)

讀取接收端埠 p 上屬性 x 的值並將其放入參數 x。僅限 p.x 是由 C 類型而不是事件輸入時,才會產生此函數。

handleData_p_x (int x)

僅限 p.x 是由 c 類型而不是事件輸入時,才會產生此函數。
  • 如果 RIMB 具有觸發的作業 evP_x,則呼叫它。

  • 如果 RIMB 具有屬性 p_x,則將其設為該參數的值。

  • 此外,如果 RIMB 變更了名為 chP_x 及 x 的接收,則會產生 Rhapsody 事件 chP_x 並將其排入管理程式的佇列。

receiveAndHandleData_p_x()

立即接收並隨後進行處理。 程式碼是行內的,例如,它不會暗示其他兩個函數呼叫。

receiveEvent_p_x (int* const x)

讀取接收端埠 p 上屬性 x 的值並將其放入參數 x。僅限 p.x 是由 Rhapsody 事件輸入時,才會產生此函數。 最好直接呼叫 receiveAndHandleEvent

handleEvent_p_x()

僅限 p.x 是由事件輸入時,才會產生此函數。
  • 如果 RIMB 具有接收 ev,則會產生 Rhapsody 事件 ev,並將其排入管理程式的佇列。

  • 如果輸入 p.x 的事件具有參數,則 handleEvent 具有複製到該事件的參數。

receiveAndHandleEvent_p_x()

立即接收並隨後進行處理。程式碼是行內的,例如,它不會暗示其他兩個函數呼叫。

sendData_p_x(int x)

將參數值傳送至傳送端埠 p 上的屬性 x。僅限 p.x 是由 C 類型而不是事件輸入時,才會產生此函數。

sendEvent_p_x()

僅限 p.x 是由事件 ev 輸入時,才會產生此函數。
  • 如果 ev 具有參數,則 sendEvent 也具有將傳送出去的參數。

  • 如果 ev 不具有參數,則將傳送任意值。

call_p_f

對於用戶端埠 p 上的作業 f 需要進行呼叫。

時間處理

逾時實作為:
  • 兩個可執行實體:

    TimeTick - 負責時間增量

    PostTimedElements - 負責公佈過期逾時。在 mxf/RiCTimer.c 中實作。

  • 兩個計時事件:

    TimeTick_tmev、PostTimedElements_tmev - 用於定期觸發上述可執行實體

  • 一個排除區域:

    TimerManager_EA - 用於確保時間計數器的使用互斥。進入和跳出此排除區域是由名為 RiCOSTimerManagerMutex_lock()、RiCOSTimerManagerMutex_free()的 mxf API 來完成的。

所有構件都在 ARXML 中宣告。

RIMB 的狀態圖

Rhapsody 事件的處理由產生的接收端、傳送程式和處理程式合力進行。RIMB 的狀態圖可能透過下列兩種模式之一執行:

定義 RIMB 的狀態圖以便在 RTE 管理的模式中執行:
  • 將 RIMB 定義為「循序」

  • 對應 RIMB 接收端埠 p(其到達應觸發轉移)上的每個屬性 x,透過名稱 evP_x 定義觸發的作業

  • x 的存取模式必須為明確封鎖明確無封鎖(亦即,非隱含的),並且必須由一般的 C 類型輸入(例如,不是由 Rhapsody 事件輸入)

  • 撰寫使用那些觸發的作業作為轉移觸發程式的狀態圖

  • 對於每個這種 p.x,可以定義作用中作業以用作 p.x分派器

  • 作用中作業的實作必須呼叫 receiveAndHandleP_x()

    此步驟對於 RTE 管理的模式和 Rhapsody 管理的模式是相同的。差異是 Rhapsody 針對 receiveAndHandleP_x() 產生的程式碼

  • 將狀態圖的所有分派器標記為「受保護」,以確保將由個別可執行實體啟動的分派器互斥

定義 RIMB 的狀態圖以便在 Rhapsody 管理的模式中執行:
  • 將 RIMB 定義為「作用中」,並且使用「定期」執行原則

  • 使用 Rhapsody 事件在 RIMB 輸入埠的接收端介面上輸入屬性

  • 接收端埠 p 上 AR 資料元素 x 的到達將觸發事件 ev 新增至事件佇列

  • 埠 p 的 RIMB 接收端介面上的 x 必須由 ev 輸入

  • ev 是狀態圖上事件的名稱,不是 p.x 上的名稱

  • ev 連結至 p.x 透過由 ev 輸入 x 實現

  • 撰寫使用 Rhapsody 事件 ev 作為轉移觸發程式的狀態圖

  • 對於每個這種 p.x,可以定義作用中作業作為 p.x 的輪詢

  • 作用中作業的實作應呼叫 receiveAndHandleP_x()

    此步驟對於 RTE 管理的模式和 Rhapsody 管理的模式是相同的。差異是 Rhapsody 針對 receiveAndHandleP_x() 產生的程式碼


意見回饋