printf 語句長期以來一直是開發人員用來將人類可讀信息獲取到控制臺上的基石,他們可以使用該控制臺來理解和調試嵌入式系統。但是,printf 的問題在于它可能非常慢并且會影響系統的實時性能。例如,使用 9600 bps 的標準 UART 波特率會導致“Hello World!” 阻止應用程序超過 12 毫秒。在輸出中添加一個簡單的變量,時間會膨脹到超過 20 毫秒,這是現代嵌入式處理器的一生。有人可能想知道可以做些什么來改進 printf。事實證明,嵌入式開發人員可以使用多種技術來加速他們的 printf 語句,例如:
提高波特率
使用直接內存訪問 (DMA) 控制器上的通道
使用 RTT
使用 ITM
讓我們更詳細地看一下這些內容。
技巧#1——提高波特率
第一個也是最明顯的調整是增加波特率。數據通過通信介質傳輸的速度越快,所需的時間就越少,而實時影響保持在最低限度。然而,越來越快的問題在于,在某些時候,開發人員可能會達到處理和準備 printf 使用的緩沖區的時間成為主要時間阻礙的地步。
技巧 #2 – 在直接內存訪問 (DMA) 控制器上使用通道
DMA 控制器可以是一個了不起的工具,開發人員可以使用它來卸載用于將文本打印到控制臺的 CPU 周期。雖然開發人員經常使用 DMA 來收集傳感器數據并在應用程序中移動數據,但 DMA 控制器也可用于將內存緩沖區傳輸到 UART。這意味著通過對 printf 的一些修改,嵌入式開發人員可以準備一個字符串緩沖區,然后啟動 DMA 通道以將緩沖區傳輸到控制臺,同時 CPU 執行其他實時應用程序代碼。
技術#3——使用 ITM
使用 ARM 微控制器的開發人員還可以利用基于硬件的 ITM 將消息打印到控制臺。ITM 能夠分成 32 個不同的通道,每個通道都可以用來打印不同類型的消息。ARM CMSIS 標準包括開發人員利用 ITM 所需的 API 調用。開發人員需要做的就是修改 printf 或串行輸出函數以調用 ITM_SendChar 并且字符將被添加到 ITM 以便通過跟蹤通道傳輸回控制臺。
技巧 #4 – 使用 RTT
RTT 是 SEGGER 的專有串行傳輸協議。它可以與他們的任何 J-Link 或 J-Trace 產品一起使用,以在幾微秒或更短的時間內通過調試器將 printf 語句傳回。RTT 可用于任何允許后臺內存訪問的微控制器。這允許在 CPU 執行其正常指令時同時訪問數據和內存并在后臺傳輸。
結論
printf 聲明已經并將繼續成為嵌入式開發人員在未來幾年可用的重要工具。開發人員不能假設 printf 很快并且不會干擾實時系統性能,因為在許多情況下,它會。為了確保在不影響系統行為的情況下映射和使用 printf,開發人員需要發揮積極作用。