簡體   English   中英

C 中的 printf() function 的核心

[英]Core of printf() function in C

有沒有辦法進入 printf 的核心? 我需要一個 USB output 盡快,但printf()非常慢,所以我想擺脫 function 內部發生的所有格式。 printf 在哪里聲明? 它很可能在標准輸出庫中,但我在哪里可以找到它(我正在使用 Visual Studio 代碼)。

背景(使用 SDK 庫在 Raspberry Pi Pico 上工作 - 但與此問題無關):

我想從 SPI1 讀取 16 位十六進制值,並在中斷中“實時”將它們寫入 USB。 所以我的程序有點像這樣:

Do nothing until SPI Interrupt triggers
Read data from SPI1
Write data to COM19 on PC via USB

來自主機的 SPI 數據以 4MHz 的速率輸入,數據字之間的間隔約為 480ns。 一個數據包大約需要 4.5us(從 word1 的 bit1 到 word2 的 bit1 測量)。 意味着中斷的最大時間不應大於4,5us。 帶有printf()的中斷 function 需要大約 9us 來處理,所以這太慢了,有些數據沒有被捕獲。 Write()能夠在一個周期內處理完畢,只需要大約 2us。 問題在於,數據在 COM 端口(膩子)上打印為 ASCII。 我禁用了很多 SDK 函數來優化運行時,我想知道我可以對printf()做同樣的事情嗎? 必須可以直接寫入 TX 寄存器並將其發送到 PC,但我無法在我的研究中找到有關此主題的任何信息。

要么我需要加快printf() function,要么找到一些替代方案,因為它顯然會減慢我的程序。

這個速度怎么樣。。

char *hex = "0123456789ABCDEF";
char buf[4];
buf[3] = hex[n >> 0 & 0xF];
buf[2] = hex[n >> 4 & 0xF];
buf[1] = hex[n >> 8 & 0xF];
buf[0] = hex[n >>12 & 0xF];
write( fd, buf, sizeof buf ); 

需要考慮“字節順序”,但無法想象你能比這更快......

由於您尚未指定所有要求和環境條件,因此此列表僅收集想法。 有些可能有效,有些則無效。 這完全取決於您在問題中未提供的條件。 如果某些術語對您來說是新的,請將它們用作研究的起點。

  1. 正如其他人建議的那樣,使用一個或多個表從二進制轉換為 ASCII。 這只會加快轉換速度。

  2. 不要傳輸 ASCII,發送二進制值。 您可能使用的 ASCII 十六進制值至少需要 5 個字符,4 個用於數字和 1 個分隔符。 與二進制相同的值只有 2 個字節。 此外,您不需要任何轉換。

  3. 從傳輸中分離數據采集。 例如,您可以使用足夠大的循環緩沖區來處理平均吞吐量。 請注意,您有多個線程,請仔細設計您的軟件。

在任何情況下,請確保接收機器可以處理數據速率。 眾所周知,PC 依賴於負載,甚至一次又一次地“休眠”,因為它們的操作系統不是實時操作系統。

暫無
暫無

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

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