前言
最近在研究AUTOSAR通信協(xié)議棧的時候發(fā)現對Com模塊的Signal Group很是疑惑,產生了以下幾個問題:
(1)什么是Signal Group,為什么要用Signal Group?
(2)什么是Shadow buffer,Shadow buffer機制為什么能保證數據的一致性?
(3)一個信號又屬于一個信號組,那么可以為這個信號和所在的信號組都配置Notificaition嗎?
(4)信號組包括的信號可以跨不同IPDU嗎?
(5)RTE在獲取一個Signal時,如果這個Signal屬于一個Signal Group,那么Signal的值沖Signal的buffer獲取還是Shadow buffer獲???
本文先梳理一遍Com Signal報文的手法過程過程,然后回答這些問題。
AUTOSAR 通信服務-Com模塊概念詳解
正文
1.Signal Group概念介紹
為了支持復雜數據類型的AUTOSAR概念,AUTOSAR COM提供了信號組的解決方案。AUTOSAR COM模塊一致地發(fā)送和接收信號組,為復雜數據類型提供必要的一致性。信號組支持靜態(tài)配置。對于每個信號組,可以配置一個符號名。
AUTOSAR COM模塊通過shadowbuffer緩沖區(qū)機制實現信號組的一致性,即RTE訪問shadowbuffer緩沖區(qū)中的組信號。如果shadow緩沖區(qū)需要與I-PDU同步,RTE可以使用Com_SendSignalGroup或Com_ReceiveSignalGroup顯式觸發(fā)。同步是以原子方式執(zhí)行的。
一個信號組一致性的替代方法是啟用信號組數組APICom_SendSignalGroupArray和com_receivesignalgrouparray
1.1 Initialization
通過調用Com_Init, AUTOSAR COM模塊將初始化發(fā)送端信號組的shadow緩沖區(qū),一個結構良好的SWC在調用Com_ReceiveSignalGroup之前嘗試讀取組信號。
1.2 Transmission
如果Com_SendSignal或com_invalidatsignal被調用的信號屬于一個信號組,那么AUTOSAR COM將只更新這個信號組的shadow緩沖區(qū)。除非I-PDU內容發(fā)生了變化,否則不需要像TMS評估那樣進行進一步的I-PDU處理。
如果為信號組調用Com_SendSignalGroup, AUTOSAR COM模塊將自動復制shadow緩沖區(qū)內容到I-PDU buffer。
Example with two group signals signal_a and signal_b, which belong to group_x:
/* copy a to shadow buffer */
Com_SendSignal (signal_a, &a);
/* copy b to shadow buffer */
Com_SendSignal (signal_b, &b);
/* copy shadow buffer to I-PDU */
Com_SendSignalGroup (group_x)
1.3 Reception
當信號組數據被Com_ReceiveSignalGroup復制到shadow buffer后,可以通過調用com_receivessignal函數從shadow緩沖區(qū)接收組信號。
如果為一個信號組調用Com_ReceiveSignalGroup, AUTOSAR COM模塊將自動將數據從I-PDU緩沖區(qū)復制到shadow緩沖區(qū)。
Example with two group signals signal_a and signal_b, which belong to group_x:
/* copy I-PDU to shadow buffer */
Com_ReceiveSignalGroup (group_x);
/* copy a from shadow buffer */
Com_ReceiveSignal (signal_a, &a);
/* copy b from shadow buffer */
Com_ReceiveSignal (signal_b, &b)
1.4 Notifications
下表顯示,所有的通知功能僅可為信號組配置,而不是為單個組的信號配置。
2.Signal Group的接收過程
1)如果是Defered IPDU,那么Com_RxIndication只完成IPDU數據拷貝到IPUD的buffer中去,下一個mainfunction中中再去解析IPDU中的Signal。
2)如果是Immediate IPDU,那么Com_RxIndication中完成IPDU數據拷貝到IPUD的buffer中去后還完成Signal和Signal Group數據的解析和拷貝到Buffer當中去,1和2中buffer是一個地方。
Rte_COMCbk_ISigGrp_Receive_Test_Signal_Group(void) { Array_uint8_8data; (void)Com_ReceiveSignalGroup(((VAR(Com_SignalGroupIdType, AUTOMATIC))0)); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))0),&data[0]); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))1),&data[1]); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))2),&data[2]); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))3),&data[3]); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))4),&data[4]); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))5),&data[5]); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))6),&data[6]); (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType,AUTOMATIC))7),&data[7]); (void)Rte_Rx_000001(&data); }
3)如果配置了一個Signal Group的Notification且所在的IPDU是Immediate IPDU,那么在Com_RxIndication中就會調用Notification,且這個Notification的名字為Rte_COMCbk_
4)Notification中會調用Com_ReceiveSignalGroup完成Signal Group數據從shadow buffer拷貝到Signal Group buffer中去,然后調用Com_ReceiveShadowSignal將Signal Group數據拷貝到外部buffer中去。
3. Signal Group的發(fā)送過程
Rte_ImplWrite_Transmit_Test_Signal_Group(P2CONST(uint8, AUTOMATIC, RTE_APPL_DATA) data) /* 1 */ { VAR(Std_ReturnType, AUTOMATIC) rtn = RTE_E_OK; Rte_memcpy(Rte_Ms_000001, data, sizeof(Array_uint8_8)); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))0), &data[0]); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))1), &data[1]); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))2), &data[2]); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))3), &data[3]); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))4), &data[4]); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))5), &data[5]); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))6), &data[6]); Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))7), &data[7]); if ( ((VAR(StatusType, AUTOMATIC))E_OK) != Com_SendSignalGroup(((VAR(Com_SignalGroupIdType, AUTOMATIC))1)) ) { rtn = ((VAR(Std_ReturnType, AUTOMATIC))RTE_E_COM_STOPPED); } /* Send complete */ return rtn; }
信號組是可以直接和SWC進行Pport-Rport連接的,也就是說SWC可以通過RTE讀取或者發(fā)送Signal Group數據。在通過RTE發(fā)送Signal Group數據的時候,首先通過通過Com_UpdateShadowSignal函數將要發(fā)送的數據拷貝到Signal Group的shadow buffer中去,然后調用Com_SendSignalGroup將shadow buffer中的數據以原子操作的方式拷貝到IPDU的Buffer中去,并且觸發(fā)IPDU的數據發(fā)送(調用PduR_Transmit)。
4.問題回答
問題1:什么是Signal Group,為什么要用Signal Group?
答:為了支持復雜數據類型的AUTOSAR概念,AUTOSAR COM提供了信號組的解決方案。AUTOSAR COM模塊一致地發(fā)送和接收信號組,為復雜數據類型提供必要的一致性。通俗的來講,Signal Group就是一個IPDU里面的幾個Signal的集合,這幾個Signal的操作需要保持一致性(也就是如果外部發(fā)送方有對這幾個數據中一個或多個數據有改動,那么接收方也需要同時更新,比如車道線的一階參數、二階參數、三階參數、常數項是4個不同的Signal,這4個Signal就需要保持一致性,不然到最后儀表上畫出來的車道線就會偶發(fā)的和實際不一樣)。
問題2:什么是Shadow buffer,Shadow buffer機制為什么能保證數據的一致性?
答:本來COM模塊為每個Rx Signal和Rx Signal都設有一個Signal Buffer的,Signal數據的收發(fā)都通過這個Signal來實現。如果Signal Group,COM模塊為每個Signal Group又額外設置了一片Signal Group Buffer,這片Buffer就是所謂的Shadow buffer。在發(fā)送Signal Group的時候,將Signal Group拷貝到IPDU Buffer的時候是原子操作(也就是拷貝前關閉全局中斷,拷貝后打開全局中斷,保證拷貝過程不被中斷干擾)保證了Signal Group數據的一致性。
問題3:一個信號又屬于一個信號組,那么可以為這個信號和所在的信號組都配置Notificaition嗎?
答:AUTOSAR規(guī)范規(guī)定,一個Signal配置為一個Signal Group的Group Signal后只能有Signal Group的Notification。
問題4:信號組包括的信號可以跨不同IPDU嗎?
答:這個問題在AUTOSAR規(guī)范當中沒有找到。通過閱讀源碼發(fā)現Signal Group中的Signal應該都是同一幀IPDU中的Signal(這個有待進一步確認)。
問題5:RTE在獲取一個Signal時,如果這個Signal屬于一個Signal Group,那么Signal的值從Signal的buffer獲取還是Shadow buffer獲?。?/strong>
答:從Shadow buffer中獲取。
審核編輯:劉清
-
AUTOSAR
+關注
關注
10文章
362瀏覽量
21608 -
PDU
+關注
關注
0文章
94瀏覽量
16990
原文標題:AUTOSAR下Com模塊中Signal Group詳解
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論