【DLT學(xué)習(xí)筆記2】-- 什么是DLT?(Diagnostic Log and Trace)
DLTGENIVI項(xiàng)目下的log軟件工程
automotive-dlt: /home/pfefferz/dlt-daemon/include/dlt/dlt_user.h Source File
DLT包括:DLT daemon DTL viewer兩個(gè)子工程。
DLT daemon運(yùn)行在ECU上,DTLviewer運(yùn)行在調(diào)試PC上。
github地址:dlt-viewer
一、DLT使用場景
1.1 DLT的通用場景
應(yīng)用或SW-C產(chǎn)生日志消息
日志消息發(fā)送到DLT模塊
DLT模塊將日志消息發(fā)送到總線
外部DLT客戶端記錄日志消息
1.2 VFB追蹤(tracing of VFB)
RTE調(diào)用由DLT提供的宏,該宏可以調(diào)用DLT應(yīng)用接口產(chǎn)生追蹤消息(trace message)
DLT模塊發(fā)送跟蹤消息到DLT通訊模塊(黃色模塊)
DLT通訊模塊轉(zhuǎn)發(fā)跟蹤消息到網(wǎng)絡(luò)
外部客戶端接收并存儲跟蹤消息
1.3 DLT運(yùn)行配置
外部dlt客戶端發(fā)送日志和跟蹤等級變更到dlt模塊
dlt模塊根據(jù)收到的變更消息改變自己的過濾器設(shè)置配置
dlt模塊通知應(yīng)用新的日志等級
1.4 非冗余模式(non-verbose mode)
為了減少總線上的運(yùn)輸量,我們可以避免發(fā)送通訊總線上的變量元數(shù)據(jù)。
相反,一個(gè)外部FIBEX文件保存如何解釋有效負(fù)載的信息。
外部Dlt客戶機(jī)使用接收到的參數(shù)值合并和存儲這些元數(shù)據(jù)。
dlt模塊以非冗余模式來傳送dlt消息
dlt模塊過濾和產(chǎn)生dlt消息
dlt模塊發(fā)送dlt消息到通訊總線
外部dlt客戶端獲取外部FIBEX文件里的元信息
外部dlt客戶存儲合并的消息
二、DLT協(xié)議介紹
DLT消息包含三個(gè)部分:標(biāo)準(zhǔn)頭、擴(kuò)展頭、有效載荷。如下圖
2.1 標(biāo)準(zhǔn)頭
標(biāo)準(zhǔn)頭有16個(gè)字節(jié)大小,分為6個(gè)部分。它們之間的名稱和順序如下圖所示
Byte0:Header Type,這里用來配置DLT的可選項(xiàng),比如帶不帶ECU ID、Session ID、時(shí)間戳等,DLT協(xié)議版本號、大端優(yōu)先。具體如下圖所示:
1為采用,0為不采用
如果使用冗余模式,則UEH位必須為1
Byte1:Message Counter,從0開始最大255,可以在一定程度上識別丟失的消息。
Byte2-3:Length,這個(gè)字段指示整個(gè)DLT消息的長度,包括標(biāo)準(zhǔn)頭、擴(kuò)展頭、有效載荷
Byte4-7:ECU ID,可選的ECU ID用于識別哪個(gè)ECU發(fā)送了Dlt消息。因此,強(qiáng)烈建議ECU ID在車輛內(nèi)是唯一的。
Byte8-11:Session ID,可選的Session ID用于標(biāo)識ECU中的日志或跟蹤消息的來源。
Byte12-15:Timestamp,對產(chǎn)生的DLT消息添加時(shí)間信息。
2.2 擴(kuò)展頭
擴(kuò)展頭字段是緊跟在標(biāo)準(zhǔn)頭后面的,如果標(biāo)準(zhǔn)頭中‘UEH’位位1,則表示該DLT消息有擴(kuò)展頭。擴(kuò)展圖的結(jié)構(gòu)如下圖所示:
-Byte0:Message Info,該字節(jié)的字段非常重要,設(shè)計(jì)到dlt消息的類型分類,用來區(qū)分是日志消息、跟蹤消息、網(wǎng)絡(luò)消息、控制消息。字段結(jié)構(gòu)如下圖所示:
VERB為1時(shí)表示有效載荷必須按冗余模式傳輸
MSTP表示DLT的類型,一共分四種:日志消息、跟蹤消息、網(wǎng)絡(luò)消息、控制消息
MTIN表示不同類型DLT消息各自的下級分類
一圖勝千言
Byte1:Number of Arguments:參數(shù)數(shù)量表示一條Dlt消息的有效負(fù)載段中連續(xù)參數(shù)的數(shù)量。在冗余模式有效,非冗余模式此字段因?yàn)?x00
Byte2-5:Application ID,應(yīng)用程序ID是應(yīng)用程序的縮寫,它生成Dlt消息。
Byte6-9:Context ID,Context ID是用戶定義的ID,用于(邏輯上)對應(yīng)用程序生成的Dlt消息進(jìn)行分組。
2.3 有效載荷
2.3.1 非冗余模式
非冗余模式下的的有效載荷就比較簡單,只傳輸參數(shù)值(不需要任何關(guān)于它們的元信息),以及其他屬性(如參數(shù)名稱或類型),為了允許在接收到的Dlt消息中正確地分解所包含的參數(shù)值,將向有效負(fù)載添加專用的message ID。非冗余模式需要外部解析文件,用來解析Message ID通過消息ID和外部描述的組合,以下信息應(yīng)該是可恢復(fù)的:
類型信息:Type Length、Data Type、String Coding 、Variable Info 、Fixed Point
考慮到MCU的處理能力,非冗余模式只傳送dlt消息中的非靜態(tài)數(shù)據(jù),而每條dlt消息中的靜態(tài)數(shù)據(jù)通過外部解析文件與Message ID進(jìn)行關(guān)聯(lián),非冗余模式DLT消息結(jié)構(gòu)如下:
2.3.1.1 非冗余模式dlt消息示例
通過下面的例子,我們來看下非靜態(tài)數(shù)據(jù)是如何組裝,傳輸和解析的。
假設(shè)下面這條日志消息將要傳送給外部DLT客戶端:
靜態(tài)文本:“Temperature measurement”
8位uint:measurement_point = 1 (no unit)
32位浮點(diǎn)型:reading = 22.1 Kelvin
在源代碼中的這個(gè)特定位置上有一個(gè)唯一的消息ID,用來表示這個(gè)日志消息調(diào)用。以下信息與這個(gè)消息ID相關(guān)聯(lián):
源碼位置:source file “temp_meas.c”, line number 42
靜態(tài)文本:“Temperature measurement”
值位8位無符號整數(shù)。變量名=“measurement_point” , 單位 = “”
值位32位浮點(diǎn)型,變量名= “reading”,單位=“Kelvin”
所有的靜態(tài)數(shù)據(jù)已經(jīng)與message ID關(guān)聯(lián)了,所以只用傳輸非靜態(tài)數(shù)據(jù),
這條dlt消息的非靜態(tài)數(shù)據(jù)如下所示:
根據(jù)消息ID,接收方可以重新組合此Dlt消息的所有靜態(tài)數(shù)據(jù)(源代碼中的位置、靜態(tài)文本、變量名和單元)。非靜態(tài)數(shù)據(jù)將被一致地打包傳輸。可以通過使用與消息ID相關(guān)聯(lián)的信息進(jìn)行解釋。此外,參數(shù)的順序與消息ID相關(guān)聯(lián)。
2.3.1.2 非冗余模式被傳輸數(shù)據(jù)的解析格式
外部文件像ASAM Fibex文件,保存著如何解析有效載荷的信息。應(yīng)用程序或中間件的軟件供應(yīng)商應(yīng)提供此描述文件。由于Dlt可以有多個(gè)日志或跟蹤消息源(多個(gè)應(yīng)用程序或診斷模塊),因此可以將提供的描述文件合并到給定ECU的一個(gè)文件中。
每個(gè)用于描述非詳細(xì)消息的Fibex描述文件只對應(yīng)于一個(gè)ECU的日志或跟蹤消息。這是因?yàn)槊總€(gè)ECU的消息id是唯一的。此外,ECU的軟件版本號必須由描述文件提供。
原則上,每個(gè)日志或跟蹤消息都相當(dāng)于某些網(wǎng)絡(luò)協(xié)議中已知的PDU。在這里,日志或跟蹤消息的描述應(yīng)該等同于Fibex指定的CAN-Frame。來自Extended Header的信息被另外放入FRAME-TYPE xml元素中的xml元素中。非靜態(tài)數(shù)據(jù)由PDU和SIGNAL xml元素描述。
從用戶的角度來看,日志或跟蹤消息有幾個(gè)參數(shù)。這些參數(shù)可以是靜態(tài)文本或非靜態(tài)變量。只傳輸非靜態(tài)變量的數(shù)據(jù)。為了用所有參數(shù)重新組合整個(gè)消息,一個(gè)FRAME xml元素應(yīng)該包含一些空的PDU xml元素,這些元素用靜態(tài)文本表示參數(shù)。此文本應(yīng)置于PDU xml元素的DESC xml元素中。
一條日志或追蹤消息必須是一個(gè)Fibex XML元素框架表示
消息ID必須是<FRAME>XML元素的ID屬性
下面的示例顯示了FIBEX XML中示例Dlt消息的描述。
<fx:FRAME ID="ID_1"> <ho:SHORT-NAME>Dlt Message with ID_1</ho:SHORT-NAME> <fx:BYTE-LENGTH>1</fx:BYTE-LENGTH> <fx:FRAME-TYPE>OTHER</fx:FRAME-TYPE> <fx:PDU-INSTANCES> <fx:PDU-INSTANCE ID="P_1_0"> <fx:PDU-REF ID-REF="PDU_1_0"/> <fx:SEQUENCE-NUMBER>0</fx:SEQUENCE-NUMBER> </fx:PDU-INSTANCE> <fx:PDU-INSTANCE ID="P_1_1"> <fx:PDU-REF ID-REF="PDU_1_1"/> <fx:SEQUENCE-NUMBER>1</fx:SEQUENCE-NUMBER> </fx:PDU-INSTANCE> <fx:PDU-INSTANCE ID="P_1_2"> <fx:PDU-REF ID-REF="PDU_1_2"/> <fx:SEQUENCE-NUMBER>2</fx:SEQUENCE-NUMBER> </fx:PDU-INSTANCE> </fx:PDU-INSTANCES> <fx:MANUFACTURER-EXTENSION> <MESSAGE_TYPE>DLT_TYPE_LOG</MESSAGE_TYPE> <MESSAGE_INFO>DLT_LOG_DEBUG</MESSAGE_INFO> <APPLICATIONID>APPI</APPLICATIONID> <CONTEXTID>CONI</CONTEXTID> <MESSAGE_SOURCE_FILE>demo.c</MESSAGE_SOURCE_FILE> <MESSAGE_LINE_NUMBER>72</MESSAGE_LINE_NUMBER> </fx:MANUFACTURER-EXTENSION> </fx:FRAME>
<!--=============== 1. Parameter ==================-->
<fx:PDU ID="PDU_1_0"> <ho:SHORT-NAME></ho:SHORT-NAME> <ho:DESC>Temperature measurement</ho:DESC> <fx:BYTE-LENGTH>0</fx:BYTE-LENGTH> <fx:PDU-TYPE>OTHER</fx:PDU-TYPE> </fx:PDU>
<!--=============== 2. Parameter ==================-->
<fx:PDU ID="PDU_1_1"> <ho:SHORT-NAME>measurement_point</ho:SHORT-NAME> <fx:BYTE-LENGTH>1</fx:BYTE-LENGTH> <fx:PDU-TYPE>OTHER</fx:PDU-TYPE> <fx:SIGNAL-INSTANCES> <fx:SIGNAL-INSTANCE ID="S_1_0"> <fx:SEQUENCE-NUMBER>0</fx:SEQUENCE-NUMBER> <fx:SIGNAL-REF ID-REF="S_UINT8"/> </fx:SIGNAL-INSTANCE> </fx:SIGNAL-INSTANCES> </fx:PDU>
<!--=============== 3. Parameter ==================-->
<fx:PDU ID="PDU_1_2"> <ho:SHORT-NAME>reading</ho:SHORT-NAME> <fx:BYTE-LENGTH>1</fx:BYTE-LENGTH> <fx:PDU-TYPE>OTHER</fx:PDU-TYPE> <fx:SIGNAL-INSTANCES> <fx:SIGNAL-INSTANCE ID="S_1_0"> <fx:SEQUENCE-NUMBER>0</fx:SEQUENCE-NUMBER> <fx:SIGNAL-REF ID-REF="FLOA32"/> </fx:SIGNAL-INSTANCE> </fx:SIGNAL-INSTANCES> </fx:PDU>
2.3.2 冗余模式
DLT的冗余模式相對于非冗余模式,顯而易見,傳遞的數(shù)據(jù)更加全面完整,
如果ECU的內(nèi)存和帶寬都夠,建議使用冗余模式傳輸DLT消息。
冗余模式下的DLT消息結(jié)構(gòu)如下圖所示:
數(shù)據(jù)負(fù)載包含變量的值(即應(yīng)用程序或中間件的調(diào)試信息),它將在通信總線上傳輸。除了變量值本身之外,還需要提供變量的大小和類型等信息。該信息包含在Type Info字段中。
-Type Info:32位,表示元數(shù)據(jù)信息。
從上圖可以看出,Type Info主要描述“Data payload”類型信息。
Type Length(TYLE):Type Length指定標(biāo)準(zhǔn)數(shù)據(jù)類型的長度。比如:規(guī)定BOOL型為8位,SINT和UINT為8位、16位、32位、64位、128位,F(xiàn)LOA型為16位、32位、64位、128位。
Variable Info(VARI): 如果設(shè)置了變量信息(VARI),則可以添加變量的名稱和單位。兩者都包含一個(gè)長度信息字段和一個(gè)帶有文本(名稱或單元)的字段。長度字段包含關(guān)聯(lián)的名稱或單元字段的字符數(shù)。只在某些數(shù)據(jù)類型中添加單元信息。
Fixed Point(FIXP):如果使用定點(diǎn)值,則應(yīng)設(shè)置定點(diǎn)(FIXP)位。比數(shù)據(jù)字段表示一個(gè)固定點(diǎn)變量的物理值。為了解釋不動點(diǎn)變量,必須計(jì)算這個(gè)變量的邏輯值。邏輯值由不動點(diǎn)變量的物理值、量化值q和偏移量o來計(jì)算。
邏輯值Lv和物理值Pv之間的關(guān)系是Lv=Pv*q + O
不動點(diǎn)必須是整型數(shù)據(jù)
String Coding(SCOD): String Coding 僅對String 類型(STRG)的字符串?dāng)?shù)據(jù)進(jìn)行編碼。所有其他字符串,如參數(shù)名稱、單元和描述都是用8位ASCII格式編碼的。
Bool:如果數(shù)據(jù)是布爾型,1就代表True,0代表False。
Signed and Unsigned:整型和無符號整型數(shù)據(jù)。該位設(shè)置時(shí),代表Data payload里的數(shù)據(jù)是整型和無符號整型數(shù)據(jù)。
FLOA:浮點(diǎn)型,該位置1時(shí),代表Data payload里的數(shù)據(jù)時(shí)浮點(diǎn)型數(shù)據(jù)
String(STRG):字符串,該位置1時(shí),代表Data payload里的數(shù)據(jù)是字符串
Array(ARAY): 該位置1時(shí),代表Data payload里的數(shù)據(jù)是數(shù)組。
Struct(STRU):該位置1時(shí),代表Data payload里的數(shù)據(jù)是數(shù)組。
Raw(RAWD):該位置1時(shí),代表Data payload里的數(shù)據(jù)是原始數(shù)據(jù)。
Trace Info(TRAI):該位置1時(shí),跟蹤信息(如模塊名/函數(shù))應(yīng)在參數(shù)中傳遞。在數(shù)據(jù)有效負(fù)載的起始,一個(gè)16位無符號整數(shù)應(yīng)指定跟蹤數(shù)據(jù)字符串的長度,以字節(jié)為單位,包括終止字符。
介紹了那么多,來個(gè)示例解釋下自然數(shù)據(jù)類型參數(shù)是如何表示的吧下面這個(gè)示例展示了如何在冗余模式VARI置1的情況下,將一個(gè)8位無符號整型數(shù)據(jù)組裝起來。
Type Info是描述數(shù)據(jù)的32位字段。
在這個(gè)例子中,它定義了變量類型(無符號整數(shù))、
它的長度(8位)和描述變量名稱和單位的variable Info (VARI)的存在。
Variable Info后面跟著兩個(gè)16位無符號整數(shù),描述變量的Name和Unit的長度。
后面跟著兩個(gè)以空結(jié)束的字符串,它們描述了Name和Unit。最后,變量值緊隨其后。
Data字段的長度是8位。
Type Info字段各個(gè)位之間的組合表
下表顯示了根據(jù)使用的變量類型的強(qiáng)制(標(biāo)記x)和可選(標(biāo)記o)設(shè)置:
為了識別日志或跟蹤消息的來源,需要在Dlt消息中添加一些在源代碼中找到位置的信息。
因此,Dlt消息中的前兩個(gè)參數(shù)應(yīng)為:
源文件的名稱(字符串)
代碼行(無符號整數(shù))
日志或跟蹤消息的第一個(gè)參數(shù)應(yīng)該是一個(gè)字符串參數(shù),其中字段“Name”(在Variable Info中)包含字符串“source_file”,數(shù)據(jù)字段包含源文件的URL。
日志或跟蹤消息的第二個(gè)參數(shù)應(yīng)該是UINT參數(shù)(32位),其中字段“Name”(在Variable Info中)包含字符串“l(fā)ine_number”,數(shù)據(jù)字段包含發(fā)送日志或跟蹤消息的源文件中的行號。
2.4 DLT服務(wù)(命令)
以下章節(jié)將介紹已定義的Dlt命令,包括唯一標(biāo)識(Service ID)、格式和所需參數(shù)。
下面的表格表示DLT支持的服務(wù)命令:
建議定義的Dlt命令可以通過接收相應(yīng)的Dlt控制消息和/或通過單獨(dú)的C api觸發(fā)
三、時(shí)序圖
DLT 數(shù)據(jù)消息傳輸時(shí)序圖(Transmission of Dlt Data Message)
設(shè)置日志登記過濾器(Set LogLevel Filter)
緩存溢出(Buffer Overflow)
四、術(shù)語解析
術(shù)語名稱 解釋
SW-C Software Component的縮寫,即軟件組件,它是組成應(yīng)用軟件的基本單元
VFB VFB(Virtual Function Bus),也就是虛擬功能總線,而RTE是它的具體實(shí)現(xiàn)
RTE 運(yùn)行時(shí)環(huán)境(RTE)是AUTOSAR ECU體系結(jié)構(gòu)的核心。RTE是AUTOSAR中VFB的接口實(shí)現(xiàn),特定于每個(gè)ECU生成的。RTE提供基礎(chǔ)的通信服務(wù),支持軟件構(gòu)件間和軟件構(gòu)件到基礎(chǔ)軟件模塊的通信,并提供AUTOSAR軟件組件訪問基本軟件模塊(包括OS和通信服務(wù))的服務(wù)。
Metadata 元數(shù)據(jù)是關(guān)于數(shù)據(jù)的數(shù)據(jù)(參考3)
Log and trace message 一條日志和追蹤消息里包含所有描述軟件中的日志和事件追蹤的數(shù)據(jù)和選項(xiàng)。它們由消息頭和有效載荷組成
Dlt User DLT用戶是指產(chǎn)生Dlt消息的源頭。它們可以是應(yīng)用,RTE或者軟件模塊
Log message 日志消息包含調(diào)試信息,如狀態(tài)變化或值變化。
Trace Message 跟蹤消息包含通過VFB傳遞的信息
FIBEX 現(xiàn)場總線交換格式是一種通用的XML基礎(chǔ)描述格式。
ECU ID ECU ID是一個(gè)ECU的名稱,由4個(gè)8位ASCII字符(如ABS0、COMB)組成
Session 會話是日志或跟蹤消息源的邏輯實(shí)體。如果一個(gè)SW-C /應(yīng)用程序被實(shí)例化多次,則使用具有全局唯一會話ID的每個(gè)實(shí)例的一個(gè)會話。
Session ID 會話ID是日志或跟蹤會話的標(biāo)識號
Application ID “應(yīng)用ID”是SW-C / Application的縮寫。它標(biāo)識日志和跟蹤消息產(chǎn)生的SW-C /應(yīng)用程序。
Context ID 上下文ID是用戶自定義ID,四個(gè)8位ASCII字符組成上下文ID。用于對swc /應(yīng)用程序生成的日志和跟蹤消息進(jìn)行分組。具有以下使用規(guī)則:1. 每個(gè)應(yīng)用ID可以擁有幾個(gè)上下文ID 2.上下文ID由應(yīng)用ID進(jìn)行分組 3. 一個(gè)應(yīng)用ID里的上下文ID必須是唯一的 4. 使用元組“應(yīng)用程序ID”和“上下文ID”標(biāo)識日志和跟蹤消息的源
Message ID 消息ID是標(biāo)識信息的ID,信息由消息本身傳輸。消息ID唯一地標(biāo)識日志或跟蹤消息。它可以用來標(biāo)識消息的源(在源代碼中),也可以用來描述消息的有效負(fù)載。消息ID是在開發(fā)或配置時(shí)靜態(tài)固定的。
Log level 日志級別定義了日志消息的嚴(yán)重級別的分類。
Trace status 跟蹤狀態(tài)提供了是否應(yīng)該發(fā)送跟蹤消息的信息
Log Channel 一種用于傳輸Dlt消息的物理通信總線
External client 外部客戶端是使用Dlt模塊控制、監(jiān)視和存儲ecu提供的日志/跟蹤信息的工具。
PDU Protocol Data Unit,PDU包含SDU和PCI,PCI包含源地址和目標(biāo)地址信息,SDU是數(shù)據(jù)信息
五、參考
1.AUTOSAR虛擬功能總線-VFB
2.DLT協(xié)議(AutoSAR官方)
3.元數(shù)據(jù)
————————————————
版權(quán)聲明:本文為CSDN博主「黃水生」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jackhh1/article/details/122740788
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。