MCU開發利器:調試系統之UART
搞MCU軟件開發的同學,對于調試,并不陌生。開發階段,大家使用最多的調試手段:在調試器(eg:lauterbach)中,設置斷點(Breakpoint),通過程序進入斷點的方式確認問題。但是,此方式畢竟有其局限性,eg:
本文引用地址:http://www.ex-cimer.com/article/202308/450092.htm非開發人員(eg:測試人員)不能或者沒有條件通過此方式進行程序調試;
車輛量產后,出現bug時,無法連接調試器,不能獲取問題發生時的車輛工況信息
......
所以,談到解決bug,我們就需要思考不同階段的不同調試策略。本文聚焦UART(universal asynchronous receiver transmitter,通用異步收發器)調試系統。
關于調試(Debug),在Autosar規范中,也給出了多個調試模塊,比如:
DET(Default ErrorTracer)系統,此模塊側重檢查BSW(Basic Software)模塊開發和運行時的錯誤,并不能將錯誤信息以緩存的方式輸出。
DLT(Diagnostic Log and Trace)系統,此模塊可以將SW-Cs、BSW、RTE、Det以及Dem記錄的信息,以Message的形式通過外部接口輸出,如此,即可利用外部的上位機監控程序的運行狀態,或者將MCU運行的時時狀態存儲下來,以便后續bug問題分析。
DLT與DET的關系如下所示:
車輛量產后的問題,相比于DET,DLT更適合,這類似于Linux等系統的日志系統,可以將程序運行的時時狀態記錄下來,以便于出現問題時,確認問題原因。本文所討論的UART調試系統類似DLT,但是,相對于DLT,更輕量化,自由度也更大。
1、UART調試系統
UART調試系統,故名思意,就是利用串口功能,將log信息輸出給上位機,示意如下所示:
(一)為什么要log系統?
如文章開篇提到的問題:車輛量產以后,出現bug問題時,無法使用調試器進行調試,同時,受限于DEM模塊記錄故障信息的能力,無法通過NVM存儲的有限數據確認車輛問題時的運行工況,比如:網絡狀態、某些模塊局部變量狀態等。如果能像飛機黑匣子一樣,將問題車運行的日志記錄下來,通過DTC信息(快照數據、拓展數據)+日志信息即可最大程度的還原車輛故障時工況,進而有效確認問題原因。
(二)UART調試系統
在MCU上使用調試系統,需要構造一個類似PC端的Printf接口,也就是重定向功能。利用MCU具有的外設,設計一個輸出系統,而UART是最常用的外設。關于UART調試系統,網上資源很多,本文不過多講解,文末給出一個源碼鏈接。
2、利用UART系統進行MCU程序調試
本文分享的UART調試系統來自Lwip,玩Lwip系統的同學應該比較熟悉。使用Lwip調試系統注意點:
(一)參數配置
在debug.h文件中,定義了一個宏:LWIP_DEBUGF,此宏引用了Ifx_Lwip_printf接口,如下所示:
而Ifx_Lwip_printf接口封裝了串口發送接口(sendUARTMessage),如下所示:
s8_tIfx_Lwip_printf(constchar*format, ...){#ifdef__LWIP_DEBUG__charstr[MAXCHARS + 4];s8_tresult = ERR_CONN;
va_list args;va_start(args, format);vsnprintf(str, MAXCHARS, format, args);va_end(args);{Ifx_SizeT cnt = 0;while(str[cnt]!=0)cnt++;sendUARTMessage(str, cnt);sendUARTMessage("rn", 2);}#endifreturnresult;}
使用調試系統時,需要使能Debug開關,第一個參數需要設置狀態和層級,參數配置示意如下:
TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE。如下所示:
TCP_DEBUG使能需要在opt.h文件中配置,如下所示:
/*** TCP_INPUT_DEBUG:Enable debugging in tcp_in.c for incoming debug.*/#if!defined TCP_INPUT_DEBUG || defined __DOXYGEN__#defineTCP_INPUT_DEBUG LWIP_DBG_ON#endif
(二)串口上位機輸出信息
在程序任意需要輸出信息的位置,添加LWIP_DEBUGF語句,輸出的調試信息如下所示:
如上的信息流就類似黑匣子信息,可以根據開發人員或者架構意圖,預埋一些關鍵信息,以便于后期的排查。
當然,凡是有利有弊,雖然這樣的調試系統,可以很方便的增加調試信息,對開發人員友好(個人很喜歡這樣的調試系統),但是,增加這樣的調試系統需要消耗軟/硬件資源。
硬件:意味著需要增加一個用于調試的串口UART,也可以使用其他外設,eg:Ethernet。log系統需要緩存信息,因此需要消耗一塊物理存儲空間,對于MCU這種內存資源有限的單片機,一般需要把信息傳遞給車機或者中控這類資源豐富的控制器。舉例:MCU將log信息傳遞給HUD(Head Up Display,抬頭顯示器),log信息由HUD存儲,之后通過對應總線將信息輸出給外部上位機,示意如下:
軟件:增加一個調試模塊,本身就需要增加對應的軟件,消耗部分資源。同時,由于軟件模塊的增加,也會增加部分CPU負擔,如果調試信息過多,會進一步加重CPU負擔。所以,這里就需要考慮增加多大的CPU開銷是系統所能承受的。
2、Lwip UART調試系統源碼
本文源碼鏈接:
https://github.com/Kaixinguo2021/TC397_Tasking_UART_Logging.git
評論