<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > MCU開發利器:調試系統之UART

          MCU開發利器:調試系統之UART

          作者:時間:2023-08-30來源:開心果Need Car收藏

          軟件開發的同學,對于調試,并不陌生。開發階段,大家使用最多的調試手段:在調試器(eg:lauterbach)中,設置斷點(Breakpoint),通過程序進入斷點的方式確認問題。但是,此方式畢竟有其局限性,eg:

          本文引用地址:http://www.ex-cimer.com/article/202308/450092.htm
          1. 非開發人員(eg:測試人員)不能或者沒有條件通過此方式進行程序調試;

          2. 車輛量產后,出現bug時,無法連接調試器,不能獲取問題發生時的車輛工況信息

          3. ......

          所以,談到解決bug,我們就需要思考不同階段的不同調試策略。本文聚焦(universal asynchronous receiver transmitter,通用異步收發器)調試系統。

          關于調試(Debug),在Autosar規范中,也給出了多個調試模塊,比如:

          • DET(Default ErrorTracer)系統,此模塊側重檢查BSW(Basic Software)模塊開發和運行時的錯誤,并不能將錯誤信息以緩存的方式輸出。

          • DLT(Diagnostic Log and Trace)系統,此模塊可以將SW-Cs、BSW、RTE、Det以及Dem記錄的信息,以Message的形式通過外部接口輸出,如此,即可利用外部的上位機監控程序的運行狀態,或者將運行的時時狀態存儲下來,以便后續bug問題分析。

          DLT與DET的關系如下所示:

          車輛量產后的問題,相比于DET,DLT更適合,這類似于Linux等系統的日志系統,可以將程序運行的時時狀態記錄下來,以便于出現問題時,確認問題原因。本文所討論的調試系統類似DLT,但是,相對于DLT,更輕量化,自由度也更大。

          1、調試系統

          UART調試系統,故名思意,就是利用串口功能,將log信息輸出給上位機,示意如下所示:

          (一)為什么要log系統?

          如文章開篇提到的問題:車輛量產以后,出現bug問題時,無法使用調試器進行調試,同時,受限于DEM模塊記錄故障信息的能力,無法通過NVM存儲的有限數據確認車輛問題時的運行工況,比如:網絡狀態、某些模塊局部變量狀態等。如果能像飛機黑匣子一樣,將問題車運行的日志記錄下來,通過DTC信息(快照數據、拓展數據)+日志信息即可最大程度的還原車輛故障時工況,進而有效確認問題原因。

          (二)UART調試系統

          上使用調試系統,需要構造一個類似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



          關鍵詞: MCU UART

          評論


          相關推薦

          技術專區

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();