[英]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
函數可以使用字符緩沖區進行格式化,例如整數或浮點到文本。
問題:
printf
用於格式化的緩沖區在哪里? (在我做出改變之前,其他有探究的人都想知道。) 平台: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.