1.前言:AUTOSAR通信系列介紹
這個系列是全新的系列,整個系列會通過實際操作,調試實際的代碼,以CAN為例,完整的解析AUTOSAR的從底層MCAL 到COM等上層模塊的通信鏈路層。重點講述數據的流向,以及各個模塊的作用,配置方法。
通過這個系列,將會以代碼的視角,了解如IPDU LPDU SDU HOH HTH HRH MB等AUTOSAR抽象概念的實際實現及其數據結構,以及在真實的AUTOSAR 架構軟件中,CAN CANIF PDUR COM CANTP 等模塊中數據的傳輸,配置參數,函數的調用等各個方面。讓我們在使用AUTOSAR配置通信的同時,不被其架空,不當只會配置的工具人。
系列將會從MCAL自底向上,一步步分析各個模塊,搞清楚整個通信的發送機制,和通信的接收機制。
2.Can_write函數介紹,以及HOH抽象的實施 MessgeBuffer介紹
整個的CAN發送,實際上是由Can模塊里面的Can_write實現的。我們先以S32K14x MCAL代碼為實例,介紹Can_write函數的發送機制,以對L_PDU HOH HTH Message Buffer這些抽象建立起基本的概念。
ECU執行完必要的初始化函數和設置controller模式后,我們就可以調用Can_Write函數來發送報文了。
Can_Write函數的傳入參數有兩個:
- hth:hardware transmit handle 硬件傳輸句柄。這個的詳細講解在后面。
- PduInfo(此即LPDU Data link Layer protocol)結構體成員如下:
id:CAN報文ID
swPduHandle:LPDU 句柄,此句柄在Canif層定義。每個句柄表示的是1個LPDU.用來在發送的最后時刻觸發PDU的tx_confirmation.
length:LPDU數據長度,即報文的長度。
sdu:LPDU的數據指針。
實例:Can_write函數介紹,以及HOH抽象的實施 MessgeBuffer介紹
我們以一個簡單的例子說明:
如下是代碼:
如下是報文:
這個例子介紹了AUTOSAR發送報文的最底層接口的使用方法,可以先建立一個直觀的印象。
can_write的第一個參數hth是AUTOSAR標準里面的一個概念,接下來的內容的講解目的是為了透徹的理解hth。
AUTOSAR從MCAL開始 就對CAN進行抽象了,抽象出HOH Hardware object handle 硬件處理對象,HOH以發送和接收的不同,分為了HTH,HRH,這倆可以統稱為HOH。
HOH對象包括很多屬性,如
Can Implementation Type(FULL/BASIC)
Can ID Message Type(STANDARD/MIXED/EXTEND)
Can Controller Reference (使用哪個can controler)
Number of Hw objects used to implement one HOH
等等屬性。
當我們用其中的一個HOH作為對象來發送報文時,這個報文的發送屬性會繼承這個HOH對象的所有屬性。
舉例說明:
EB(S32K148)中配置了如下幾個HOH:
這里的配置實際會影響的是Can_PBcfg中的MessgeBuffer的配置結構體,MessgeBuffer結構體數組是HOH的具體實施,它的含義下文詳細描述。Can Object ID即為HOH的ID。
在Can_write例子中我們傳入HTH的是4,即利用HOH_3_EcuTestNode_CanCluster這個HOH作為對象,進行發送。
深入Can_write中,調用的是Can_FlexCan_Write的這個函數:
他會先搜索Messge Buffer配置結構體中u32HWObjID為hth,即為4的這個配置。
Messge Buffer的配置結構體的部分成員:
static CONST(Can_MBConfigObjectType, CAN_CONST) MessageBufferConfigs0_PB[CAN_MAXMBCOUNT_PB] =
{
/* HOH_0_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
{
(Can_HwHandleType)0x0U, /* uIdMaskIndex */
(uint8)0U, /* ControllerId - based on the order from CanController list */
(CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
(Can_ObjType)CAN_RECEIVE, /* Receive/Transmit MB configuration */
(Can_IdType)0x0U, /* MessageId */
(uint8)0x0U, /* Local priority bits used for arbitration */
(Can_HwHandleType)0x0U, /* Hardware Object ID */
#if (CAN_FD_MODE_ENABLE == STD_ON)
(uint8)0U,
#endif
/* Read/Write period reference used when POLLING mode is selected for the controller */
(uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */
(uint16)0x0080U, /* Address of Message Buffer */
(uint8)8U, /* Payload lenth of Message Buffer */
(uint8)0U /* The index of MB in message buffer memory */
#if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
/* The parameter is used to detect the MB which run with trigger transmit feature */
,(boolean)FALSE
#endif
},
/* HOH_3_UDSTX_Node Message Buffer of Can Controller ID = 0U*/
{
(Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
(uint8)0U, /* ControllerId - based on the order from CanController list */
(CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
(Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
(Can_IdType)0x7eaU, /* MessageId */
(uint8)0x0U, /* Local priority bits used for arbitration */
(Can_HwHandleType)0x1U, /* Hardware Object ID */
#if (CAN_FD_MODE_ENABLE == STD_ON)
(uint8)0U,
#endif
/* Read/Write period reference used when POLLING mode is selected for the controller */
(uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */
(uint16)0x0180U, /* Address of Message Buffer */
(uint8)8U, /* Payload lenth of Message Buffer */
(uint8)16U /* The index of MB in message buffer memory */
#if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
/* The parameter is used to detect the MB which run with trigger transmit feature */
,(uint8)FALSE
#endif
},
/* HOH_3_NMTX_Node Message Buffer of Can Controller ID = 0U*/
{
(Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
(uint8)0U, /* ControllerId - based on the order from CanController list */
(CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
(Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
(Can_IdType)0x424U, /* MessageId */
(uint8)0x0U, /* Local priority bits used for arbitration */
(Can_HwHandleType)0x2U, /* Hardware Object ID */
#if (CAN_FD_MODE_ENABLE == STD_ON)
(uint8)0U,
#endif
/* Read/Write period reference used when POLLING mode is selected for the controller */
(uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */
(uint16)0x0190U, /* Address of Message Buffer */
(uint8)8U, /* Payload lenth of Message Buffer */
(uint8)17U /* The index of MB in message buffer memory */
#if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
/* The parameter is used to detect the MB which run with trigger transmit feature */
,(uint8)FALSE
#endif
},
/* HOH_3_XCPTX_Node Message Buffer of Can Controller ID = 0U*/
{
(Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
(uint8)0U, /* ControllerId - based on the order from CanController list */
(CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
(Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
(Can_IdType)0x667U, /* MessageId */
(uint8)0x0U, /* Local priority bits used for arbitration */
(Can_HwHandleType)0x3U, /* Hardware Object ID */
#if (CAN_FD_MODE_ENABLE == STD_ON)
(uint8)0U,
#endif
/* Read/Write period reference used when POLLING mode is selected for the controller */
(uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */
(uint16)0x01a0U, /* Address of Message Buffer */
(uint8)8U, /* Payload lenth of Message Buffer */
(uint8)18U /* The index of MB in message buffer memory */
#if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
/* The parameter is used to detect the MB which run with trigger transmit feature */
,(uint8)FALSE
#endif
},
/* HOH_3_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
{
(Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
(uint8)0U, /* ControllerId - based on the order from CanController list */
(CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
(Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
(Can_IdType)0x110U, /* MessageId */
(uint8)0x0U, /* Local priority bits used for arbitration */
(Can_HwHandleType)0x4U, /* Hardware Object ID */
#if (CAN_FD_MODE_ENABLE == STD_ON)
(uint8)0U,
#endif
/* Read/Write period reference used when POLLING mode is selected for the controller */
(uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */
(uint16)0x01b0U, /* Address of Message Buffer */
(uint8)8U, /* Payload lenth of Message Buffer */
(uint8)19U /* The index of MB in message buffer memory */
#if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
/* The parameter is used to detect the MB which run with trigger transmit feature */
,(uint8)FALSE
#endif
},
/* HOH_3_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
{
(Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
(uint8)0U, /* ControllerId - based on the order from CanController list */
(CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
(Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
(Can_IdType)0x110U, /* MessageId */
(uint8)0x0U, /* Local priority bits used for arbitration */
(Can_HwHandleType)0x4U, /* Hardware Object ID */
#if (CAN_FD_MODE_ENABLE == STD_ON)
(uint8)0U,
#endif
/* Read/Write period reference used when POLLING mode is selected for the controller */
(uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */
(uint16)0x01c0U, /* Address of Message Buffer */
(uint8)8U, /* Payload lenth of Message Buffer */
(uint8)20U /* The index of MB in message buffer memory */
#if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
/* The parameter is used to detect the MB which run with trigger transmit feature */
,(uint8)FALSE
#endif
},........
所以上文函數搜索到的第一個結構體成員一定是第一個Hardware Object ID為4的這個MB 結構體:
/* HOH_3_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
{
(Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
(uint8)0U, /* ControllerId - based on the order from CanController list */
(CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
(Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
(Can_IdType)0x110U, /* MessageId */
(uint8)0x0U, /* Local priority bits used for arbitration */
(Can_HwHandleType)0x4U, /* Hardware Object ID */
#if (CAN_FD_MODE_ENABLE == STD_ON)
(uint8)0U,
#endif
/* Read/Write period reference used when POLLING mode is selected for the controller */
(uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */
(uint16)0x01b0U, /* Address of Message Buffer */
(uint8)8U, /* Payload lenth of Message Buffer */
(uint8)19U /* The index of MB in message buffer memory */
#if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
/* The parameter is used to detect the MB which run with trigger transmit feature */
,(uint8)FALSE
#endif
},
以這個成員的配置去改變對應的寄存器,從而讓發送的報文繼承這里面的屬性。
我們現在需要搞明白的就剩這個MessgeBuffer配置結構體。
結構體里面的屬性的含義,這些看EB的CAN模塊的配置手冊可以搞明白,我想介紹的是MessgeBuffer這個機制。這是S32K Flex CAN的機制
這是 Flex CAN的報文緩沖。報文緩沖有很多,配置好相關寄存器,最后將報文數據寫入報文緩沖,可完成發送。
我們注意到MessageBufferConfigs0_PB中的每個結構體成員都有表示Address of Message Buffer的屬性和表示The index of MB in message buffer memory的屬性。這屬性各個成員全不同并且是序號,地址按順序遞增的現象。所以這些結構體成員就是一個一個不同的Messagebuffer。再注意到之前提到的Can_Write中傳入的Hth即是這里的Hardware Object ID。最后兩個結構體,你發現他們雖然Message Buffer的地址不同,但是共用一個Hth號4.實際上完整的Messagebuffer的定義,有十個結構體成員都是共用4號Hth.
這是由EB配置項Number of Hw objects used to implement one HOH配為10決定的。這里 Hw objects即不同的MessageBuffer。但是他們關聯了同個Hth。換言之1個Hth中可以包括多個MessageBuffer。即HTH是比MessageBuffer是更高層的抽象,例子中向Can_Write傳入這個ID為4的hth,可以有10個MessageBuffer供選擇寫入數據,一個MessgeBuffer被占了我再找下個MessageBuffer。這樣的配置作用就是使用這個HTH,可以在極短時間同時支持最多10個報文的發送。
以上例子Can_write函數的底層實現的邏輯簡化說明如下:
1.輪詢Messge Buffer配置結構體中u32HWObjID為hth是4的MB結構體成員。
2找到第一個hth為4的MessageBuffer。傳入LPDU數據,嘗試更新MessageBuffer發送,再判斷是否是CAN_BUSY狀態。假如是,找下一個Hth為4的MB繼續嘗試發送,直到成功發送出去一次,返回CAN_OK。
這期的介紹就到這里,本期我們可以搞清楚什么是LPDU,什么是HOH和HTH。從HOH的實際實施可以看出,所謂的AUTOSAR抽象,即將某個對象的所有配置,用結構體數組打包在一起,然后給他們編號。這個編號和各個對象的配置一一對應。后面需要使用這個對象的時候即使用編號去索引對應的結構體數組即可。這個思路會貫穿整個的AUTOSAR實現。
-
寄存器
+關注
關注
31文章
5342瀏覽量
120297 -
CAN通信
+關注
關注
5文章
93瀏覽量
17831 -
緩沖器
+關注
關注
6文章
1922瀏覽量
45478 -
AUTOSAR
+關注
關注
10文章
362瀏覽量
21570 -
PDU
+關注
關注
0文章
94瀏覽量
16979
發布評論請先 登錄
相關推薦
評論