2014-10-03 24 views
4

我在一個受約束的嵌入式系統上工作。printf的格式化緩衝區在哪裏?

目前我們使用snprintf到緩衝區,然後用另一份聲明中,打印緩衝區的串行端口:

char temp_buffer[256]; 
    int bytes_written = snprintf(temp_buffer, sizeof(temp_buffer), 
         "Solar system has %d planets\n", 
         10); 
    if (bytes_written > 0) 
    { 
    Serial_Port_Output(temp_buffer, bytes_written); 
    } 

我想切換到printf直接寫入到串行端口。根據我們的編譯器的文檔,我截獲了輸出數據以使用串口的函數調用。 (該接口使用塊寫入:地址和字符數)。

printf函數可能使用字符緩衝區進行格式化,如整數或浮點到文本。

問題:

  1. 哪裏緩衝區printf使用格式化? (其他 查詢頭腦想知道,在我做出更改之前)。
  2. 這是編譯器(平臺)相關的問題嗎?

平臺:Arm7tdmi處理器,片上系統(SOC),IAR EW編譯器。

+2

這是一個C庫的東西比編譯器的東西。你有libc的源代碼嗎?它可能是沒有緩衝區,如果它通過字符輸出char,但取決於libc實現。 – 2014-10-03 16:01:36

回答

1

它是庫而不是編譯器相關的,你應該查閱庫的文檔和可能的源代碼。這(也許是出於過期)IAR C Library documentation說:

由於一個完整的格式需要一個很大的空間有幾種不同的 格式化之間做出選擇。有關更多信息,請參閱 ,請參閱「IAR C編譯器參考指南」。

current IAR compiler reference討論格式的選擇,但在大多數情況下,連接器可以自動選擇最合適的格式。該文檔甚至討論瞭如果重建庫(您大概需要源許可證)可用的進一步優化。

某些實現(不是專門用於IAR)使用顯着的堆棧空間。如果你想完全控制,你可以考慮使用開源的實現,如Tiny printf。它不是一個完整的ISO實現,但適用於許多嵌入式應用程序。

13

這完全是實現特定的。 printf沒有義務使用任何緩衝區。當然,它具有與FILEstdout,在printf的情況下)相關聯的stdio緩衝區,但是如果程序關閉了緩衝區,則該緩衝區可以是零長度,其中setbuf/setvbufprintf也可能有一個內部緩衝區;對於一個合適的C實現,這將需要自動存儲(「在堆棧上」),但沒有線程的低質量嵌入式可能會使用靜態緩衝區。在任何情況下,printf被指定爲好像通過重複調用fputc一樣工作,並且它肯定可以用這種方式實現而不需要任何緩衝區。