[英]What is the difference between sprintf and printf for microcontrollers
我知道printf和sprintf之間的基本功能差異。 但是,我想知道它們之間的一些時間/延遲相關的差異。 顯然,我想在一個自定義構建的RTOS的任務中使用它。 你怎么看 ? 我想知道它將如何影響系統的性能。 (如果有的話)。 通常,我不使用打印功能,因為大量的延遲,但我必須在這里強制使用它。
僅供參考,使用RS232在終端窗口上顯示輸出。
謝謝。
這里的主要問題是printf()
寫入stdout
,它可以(並且幾乎肯定會)阻塞調用線程。 在嵌入式系統上, stdout
成為一個非常慢的RS232端口並不罕見。
因此,您永遠不會在實時線程中執行此操作,因為它會非常快速地變為非實時。
使用sprintf()
寫入緩沖區相當便宜(提供緩沖區已經分配)。 它當然不會阻止。
您可能會發現您的RTOS提供了一種異步日志記錄機制,可以從實時線程調用而不會有阻塞的風險。 這只是一個環形緩沖區,您可以在其中編寫終端輸出,並使用較低優先級的線程將其打印到終端。
好吧......所有其他事情(未指明)都是相同的,我猜sprintf()
應該比printf()
“更快”,因為前者只是寫入內存緩沖區,而后者寫入一些I / O“設備”。 大多數設備會產生比僅寫入RAM更多的延遲,這就是printf()
可能更慢的原因。
這些差異可能很小,但主要問題是大多數實現都進行動態內存分配,這可能非常昂貴。
我建議刪除你的需求,這樣你就可以在不使用現成的sprintf()
實現的情況下實現它們,或者通過實現代碼來查看它們是否/何時進行堆分配。
sprintf()沒有硬件依賴性,printf()受stdout底層的低級支持。 將數據推送到UART並忙於等待發送寄存器或FIFO變為可用的簡單實現確實會產生“ 大規模延遲 ” - 但這在實時系統中將是一個愚蠢的實現。
您通常會將數據推送到環形緩沖區,管道或字符隊列,該隊列由中斷例程提供服務。 如果當您要將數據推送到緩沖區時緩沖區為空,則會強制發送器通過緩沖除第一個字符之外的所有字符然后將其直接寫入UART來啟動。 然后,UART中斷將保持發送器饋電,直到緩沖器為空。 從您的應用程序級別來看,您只是將數據寫入內存,因此延遲將是最小且確定性的。
stdin可以類似地實現,ISR寫入和應用程序異步讀取。
通過使用RTOS IPC機制(如管道或隊列)或使用信號量等同步原語,您可以在數據輸出上實現阻塞,阻塞和超時語義。
如果您的UART支持DMA,則可以進一步降低中斷率和CPU開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.