通过printf从目标板到调试器的输出
最近在SEGGER的博客上看到Johannes Lask寫的一篇關于在調試時使用printf函數從目標MCU輸出信息到調試器的文章,自我感覺很有啟發,特此翻譯此文并推薦給各位同仁。當然限于個人水平,有不當之處懇請指正。原文網址:https://blog.segger.com/getting-printf-output-from-target-to-debugger/
?Erich Styger最近發布了一篇《關于如何使用ARM Cortex-M目標上的單線輸出(SWO)添加控制臺功能》的偉大教程。
這激發了我寫一篇在嵌入式目標(包括SWO和RTT)上的調試輸出(“printf”)實現的更普遍的文章。
從目標調試輸出
有不同的方法來從目標應用程序獲取調試輸出。
自從早期嵌入式系統以來,已經有了硬件依賴的解決方案,如使用UART或USB CDC。但是應用程序可能已經使用了UART,CDC需要目標硬件上的USB堆棧和USB連接器。
第一個軟件解決方案是semihosting。使用semihosting,CPU停止打印輸出,并由調試器重新啟動“幕后”操作。打印一個消息可能需要幾毫秒到幾百毫秒的時間,因為這是一個昂貴的操作。調試器需要意識到目標已經停止執行,讀取寄存器和內存,寫入內存,然后重新啟動CPU。這意味著目標CPU在這段時間內不運行。因此,semihosting可以簡單地不用于需要實時行為的應用,例如通信棧。另外,semihosting實現是依賴于調試器的,而使用semihosting的應用程序可能在沒有連接調試器的情況下運行。
然后還有ARM的SWO跟蹤端口和SEGGER的實時傳輸(RTT)。
單線輸出
SWO是由ARM為Cortex-M3,M4和M7設備設計的單引腳接口。引腳可以使用標準調試連接器連接到調試探頭,并與SWD接口(而不是JTAG)一起使用。目標MCU可以在CPU引腳上傳輸數據包,類似于UART TX引腳,時鐘速率來自CPU時鐘。在調試器上設置SWO需要知道CPU時鐘速度。如果應用程序的某些部分在啟動前必須在初始化之前進行輸出,或者在應用程序運行時時鐘速度發生變化,那么這一點尤為重要。SWO不會如semihosting發送輸出那樣停止CPU。通過SWO的輸出速度取決于組態的SWO速度。數據分組,即調試輸出分組,以特殊格式編碼。這允許發送多達32個數據包類型(刺激),但也會導致一些協議開銷,這將以10 MHz SWO速度將事情減慢到?1.5 us / char。這意味著輸出80個字符大約需要120個微秒。要在RTOS或中斷程序中使用來自多個任務的SWO,在SWO輸出期間應禁用中斷,這可能會影響系統的實時行為。
盡管SWO最常用于打印調試消息。它也可用于記錄中斷進入/退出和功能進入/退出,定期對PC值或內存中的變量進行采樣,或者用于事件通知。
Erich全面介紹了如何在調試消息中使用SWO,如何在目標上進行設置,以及如何在主機上獲取輸出。
實時傳輸
RTT是SEGGER的調試終端解決方案。它將SWO的優點與其他方法的特點相結合。RTT是一種僅用于軟件的解決方案,而不是標準調試連接以外的目標設備上不需要額外的硬件。它可以與任何J-Link一起使用,即使使用諸如J-Link OB,OpenSDA或轉換的ST-LINK等小型板載機型。
RTT允許非常高的傳輸速度,而不會影響目標的實時行為。沒有協議開銷,打印消息可以在一微秒或更短的時間內完成,基本上只需要做一個單個memcpy()的時間。由于RTT的速度非常快,所以輸出可以通過鎖定中斷來保證線程安全,而這種中斷對系統的實時行為影響最小。當目標應用程序正在運行時,輸出消息由J-Link讀取并傳輸到主機。
與UART類似,RTT是雙向的。您可以從主機向目標應用程序發送輸入。雙向通信允許您控制目標系統,而無需任何其他輸入設備。使用RTT可以實現全功能終端。
RTT實現源代碼可以自由地在任何系統中使用,提供功能和自由。
在主機上使用RTT是靈活并且容易的。J-Link軟件包括可以與任何調試工具并行使用的RTT Viewer,一個GUI。您還可以使用Telnet客戶端連接到調試會話(端口19031)并與目標進行通信。一些調試器甚至直接集成RTT。Embedded Studio和獨立調試器Ozone可以在其終端窗口中通過RTT顯示目標輸出,并且不需要任何其他工具。
概要
printf調用與不同實現的速度比較
在從嵌入式目標執行SWO調試輸出之前,只能使用低效或依賴硬件的方法。
使用SWO ARM設計了一個快速的解決方案。它重量輕且快速,但具有一些縮寫,因為它僅在某些Cortex-M器件上可用,需要額外的引腳連接到MCU,并且是單向的。
RTT結合了SWO的所有優點,并增加了更多功能。它比SWO更快,不僅限于Cortex-M,允許通過標準調試連接進行雙向通信,并且在任何需要系統的實時情況下都是最不具有干擾性的。
當您可以使用RTT時,沒有任何理由使用SWO。
歡迎關注:
總結
以上是生活随笔為你收集整理的通过printf从目标板到调试器的输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发者们都在关注的网站
- 下一篇: 包管理工具conda极简教程