前言
最近在研究AUTOSAR通信協(xié)議棧的時候發(fā)現(xiàn)對Com模塊的Signal Group很是疑惑,產(chǎn)生了以下幾個問題:
(1)什么是Signal Group,為什么要用Signal Group?
(2)什么是Shadow buffer,Shadow buffer機制為什么能保證數(shù)據(jù)的一致性?
(3)一個信號又屬于一個信號組,那么可以為這個信號和所在的信號組都配置Notificaition嗎?
(4)信號組包括的信號可以跨不同IPDU嗎?
(5)RTE在獲取一個Signal時,如果這個Signal屬于一個Signal Group,那么Signal的值沖Signal的buffer獲取還是Shadow buffer獲取?
本文先梳理一遍Com Signal報文的手法過程過程,然后回答這些問題。
AUTOSAR 通信服務(wù)-Com模塊概念詳解
正文
1.Signal Group概念介紹
為了支持復(fù)雜數(shù)據(jù)類型的AUTOSAR概念,AUTOSAR COM提供了信號組的解決方案。AUTOSAR COM模塊一致地發(fā)送和接收信號組,為復(fù)雜數(shù)據(jù)類型提供必要的一致性。信號組支持靜態(tài)配置。對于每個信號組,可以配置一個符號名。
AUTOSAR COM模塊通過shadowbuffer緩沖區(qū)機制實現(xiàn)信號組的一致性,即RTE訪問shadowbuffer緩沖區(qū)中的組信號。如果shadow緩沖區(qū)需要與I-PDU同步,RTE可以使用Com_SendSignalGroup或Com_ReceiveSignalGroup顯式觸發(fā)。同步是以原子方式執(zhí)行的。
一個信號組一致性的替代方法是啟用信號組數(shù)組APICom_SendSignalGroupArray和com_receivesignalgrouparray
1.1 Initialization
通過調(diào)用Com_Init, AUTOSAR COM模塊將初始化發(fā)送端信號組的shadow緩沖區(qū),一個結(jié)構(gòu)良好的SWC在調(diào)用Com_ReceiveSignalGroup之前嘗試讀取組信號。
1.2 Transmission
如果Com_SendSignal或com_invalidatsignal被調(diào)用的信號屬于一個信號組,那么AUTOSAR COM將只更新這個信號組的shadow緩沖區(qū)。除非I-PDU內(nèi)容發(fā)生了變化,否則不需要像TMS評估那樣進(jìn)行進(jìn)一步的I-PDU處理。
如果為信號組調(diào)用Com_SendSignalGroup, AUTOSAR COM模塊將自動復(fù)制shadow緩沖區(qū)內(nèi)容到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
當(dāng)信號組數(shù)據(jù)被Com_ReceiveSignalGroup復(fù)制到shadow buffer后,可以通過調(diào)用com_receivessignal函數(shù)從shadow緩沖區(qū)接收組信號。
如果為一個信號組調(diào)用Com_ReceiveSignalGroup, AUTOSAR COM模塊將自動將數(shù)據(jù)從I-PDU緩沖區(qū)復(fù)制到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數(shù)據(jù)拷貝到IPUD的buffer中去,下一個mainfunction中中再去解析IPDU中的Signal。
2)如果是Immediate IPDU,那么Com_RxIndication中完成IPDU數(shù)據(jù)拷貝到IPUD的buffer中去后還完成Signal和Signal Group數(shù)據(jù)的解析和拷貝到Buffer當(dāng)中去,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中就會調(diào)用Notification,且這個Notification的名字為Rte_COMCbk_
4)Notification中會調(diào)用Com_ReceiveSignalGroup完成Signal Group數(shù)據(jù)從shadow buffer拷貝到Signal Group buffer中去,然后調(diào)用Com_ReceiveShadowSignal將Signal Group數(shù)據(jù)拷貝到外部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進(jìn)行Pport-Rport連接的,也就是說SWC可以通過RTE讀取或者發(fā)送Signal Group數(shù)據(jù)。在通過RTE發(fā)送Signal Group數(shù)據(jù)的時候,首先通過通過Com_UpdateShadowSignal函數(shù)將要發(fā)送的數(shù)據(jù)拷貝到Signal Group的shadow buffer中去,然后調(diào)用Com_SendSignalGroup將shadow buffer中的數(shù)據(jù)以原子操作的方式拷貝到IPDU的Buffer中去,并且觸發(fā)IPDU的數(shù)據(jù)發(fā)送(調(diào)用PduR_Transmit)。
4.問題回答
問題1:什么是Signal Group,為什么要用Signal Group?
答:為了支持復(fù)雜數(shù)據(jù)類型的AUTOSAR概念,AUTOSAR COM提供了信號組的解決方案。AUTOSAR COM模塊一致地發(fā)送和接收信號組,為復(fù)雜數(shù)據(jù)類型提供必要的一致性。通俗的來講,Signal Group就是一個IPDU里面的幾個Signal的集合,這幾個Signal的操作需要保持一致性(也就是如果外部發(fā)送方有對這幾個數(shù)據(jù)中一個或多個數(shù)據(jù)有改動,那么接收方也需要同時更新,比如車道線的一階參數(shù)、二階參數(shù)、三階參數(shù)、常數(shù)項是4個不同的Signal,這4個Signal就需要保持一致性,不然到最后儀表上畫出來的車道線就會偶發(fā)的和實際不一樣)。
問題2:什么是Shadow buffer,Shadow buffer機制為什么能保證數(shù)據(jù)的一致性?
答:本來COM模塊為每個Rx Signal和Rx Signal都設(shè)有一個Signal Buffer的,Signal數(shù)據(jù)的收發(fā)都通過這個Signal來實現(xiàn)。如果Signal Group,COM模塊為每個Signal Group又額外設(shè)置了一片Signal Group Buffer,這片Buffer就是所謂的Shadow buffer。在發(fā)送Signal Group的時候,將Signal Group拷貝到IPDU Buffer的時候是原子操作(也就是拷貝前關(guān)閉全局中斷,拷貝后打開全局中斷,保證拷貝過程不被中斷干擾)保證了Signal Group數(shù)據(jù)的一致性。
問題3:一個信號又屬于一個信號組,那么可以為這個信號和所在的信號組都配置Notificaition嗎?
答:AUTOSAR規(guī)范規(guī)定,一個Signal配置為一個Signal Group的Group Signal后只能有Signal Group的Notification。
問題4:信號組包括的信號可以跨不同IPDU嗎?
答:這個問題在AUTOSAR規(guī)范當(dāng)中沒有找到。通過閱讀源碼發(fā)現(xiàn)Signal Group中的Signal應(yīng)該都是同一幀IPDU中的Signal(這個有待進(jìn)一步確認(rèn))。
問題5:RTE在獲取一個Signal時,如果這個Signal屬于一個Signal Group,那么Signal的值從Signal的buffer獲取還是Shadow buffer獲取?
答:從Shadow buffer中獲取。
審核編輯:劉清
-
AUTOSAR
+關(guān)注
關(guān)注
10文章
350瀏覽量
21473 -
PDU
+關(guān)注
關(guān)注
0文章
93瀏覽量
16963
原文標(biāo)題:AUTOSAR下Com模塊中Signal Group詳解
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論