UDS tester之Tdrm
UDS?tester之Tdrm?
2018-1-16
????????Tdrm叫做?tester?diagnostic?request?manager,或者叫做診斷請求測試管理器,今天以vector的Tdrm為例,研究下它的工作流程。
一、Tdrm的作用
????????如果你在做汽車ECU,那么當做診斷服務的時候一定會用到UDS,而如果恰好你所開發的ECU也有診斷其他ECU的需求,那么就一定會用到tester端軟件。Tester可以調用TP層,向其他ecu發起診斷請求,實現全車診斷、ECU軟件刷寫的功能,十分有用。它也可以處理ecu的反饋,供用戶層使用。
二、一個狀態機,四個timer
????????先看下內部狀態機的定義,tester一共定義了8個狀態,空閑狀態;?默認會話下的空閑狀態(用于查詢當前是否可以進行診斷操作,只有在idle的條件下才可以發起下一次診斷);?診斷請求發送過程中;等待請求發送完成;等待ecu應答;接收進行中(無請求的接收);?請求接收結果接收中;?等待下一次進入idle的delay。
typedef?enum?_tTdrmState
{
??kTdrmStateIdle,??????????????????/*?System?in?idle?state?*/
??kTdrmStateIdleSessionActive,????/*?System?session?is?active?(just?for?TdrmGetStatus()?when?in?idle?mode)?*/
??kTdrmStateTxInProgress,?????????/*?Temporary?state?while?sending?data?*/
??kTdrmStateWaitSendReqConfirm,?/*?Request?issued?to?TP.?Waiting?for?confirmation?*/
??kTdrmStateWaitEcuResponse,???/*?Service?successfully?transmitted?to?ECU.?Wait?for?ECU?response?*/
??kTdrmStateRxInProgress????????/*?Temporary?state?while?receiving?data?*/
??kTdrmStateWaitRxInProgress????/*?Temporary?state?while?receiving?data?*/
??kTdrmStateWaitIdle?????????????/*?Temporary?state?after?a?transmission?*/
}?tTdrmState;
????????四個timer P2, P2Star, S3,?P3
????????P2:?客戶端請求到ECU的響應時間,?typical?100ms。
????????P2Star:?增強延時時間,當client收到?0x78的否定響應時,會多延長一會等待時間,典型值為?5000ms。
????????S3:client發送兩次test?present(3E,00)的間隔。
????????P3:在沒有應答的條件下,兩次請求之間(從第一次請求timeout到第二次請求發出)插入的延時時間。
三、Tdrm的工作流程分析
????????下面用一張圖表示這幾個狀態是如何轉換的:
?
????????(1)tester?初始化
????????Tdrm?正常工作前應該首先調用TdrmInitPowerOn()來初始化狀態機用到的幾個timer,根據當前MCU執行的周期,計算出所有時間參數對應的循環數量;?調用TdrmInit()來初始化狀態機到idle狀態,關閉定時器以及清除請求標志等,此時狀態機停留在S1狀態。需要周期性調用TdrmTask(),來推動狀態機轉換。
????????(2)tester?發送請求
????????當應用層調用TdrmServiceRequest()來請求某一個服務時,此時App需要把請求服務的數據字和長度填充好,再調用TP層將數據發送出去;此處就直接返回發送成功,之后就就進入等待ECU應答的S4狀態。與此同時,TP發送完請求后會調用CanTp_NUSDataIndication進而調用TdrmSendConfirm,這里會判斷這個請求是否需要ecu應答,如果需要就進入到S5狀態,如果不需要應答肯定響應,就進入S8,繼而回到S1?idle狀態。
????????(3)tester?接收響應
????在S5?等待ECU應答狀態下,會啟動一個定時器P2,如果在規定的時間內TP收到了SF或者FF,那就會調用TdrmPrepareReception,使其進入到S7也就是等待接收過程中;如果接收完成或這接收失敗都會重新回到S1。如果在規定的時間內沒有收到任何應答,待P2超時后回到S1,此時重試次數減一,重置P2,待進行下一次重新發送。
????????(4)tester?維持會話
????????作為client端,請求服務器進入非default?session后,如果沒有請求,要周期發送tester?present報文來保持會話,如果應用層發起了其他請求從而使狀態機進入非idle狀態后,就不需要發送tester?present報文了。
四、Tdrm的局限性
????????在這個架構下是無法多路并發的。不過在實際的情況下,如果需要診斷總數不多的ecu,一般的做法是輪詢,但如果所在ecu需要診斷、刷寫的ecu比較多,論詢是非常耗時的,如果能把這個過程與ecu之間的診斷或刷新順序進行解偶,同時對多個ecu進行操作,就可以極大提升診斷或刷寫速度了。
總結
以上是生活随笔為你收集整理的UDS tester之Tdrm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问卷设计二:问题设计要遵循哪些原则?
- 下一篇: Tensorflow编程基础之Mnist