簡體   English   中英

printf的格式化緩沖區在哪里?

[英]Where is formatting buffer for 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編譯器。

這完全是針對特定於實現的。 printf沒有義務使用任何緩沖區。 當然,它具有與FILE相關的stdio緩沖區(在printf的情況下為stdout ),但如果程序使用setbuf / setvbuf關閉緩沖,則可能為零長度。 printf也有可能有一個內部緩沖區; 對於正確的C實現,這需要具有自動存儲(“在堆棧上”),但是沒有線程的低質量嵌入式可能使用靜態緩沖區。 在任何情況下, printf被指定為通過重復調用fputc來工作,並且它當然可以以這種方式實現而沒有任何緩沖區。

它是庫而不是編譯器,您應該查閱庫的文檔以及可能的源代碼。 這個(可能是過時的) IAR C庫文檔說:

由於完整的格式化程序需要大量空間,因此可以選擇幾種不同的格式化程序。 有關更多信息,請參閱“IAR C編譯器參考指南”。

當前的IAR編譯器參考討論格式化程序選擇,但在大多數情況下,鏈接器可以自動選擇最合適的格式化程序。 如果重建庫(可能需要源許可證),文檔甚至討論了可用的進一步優化。

某些實現(不是特定的IAR)使用大量的堆棧空間。 如果您想要完全控制,可以考慮使用Tiny printf等開源實現。 它不是完整的ISO實現,但適用於許多嵌入式應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM