2012-10-25 21 views
7

我正在開發嵌入式系統(Cortex M3)。爲了從設備發送一些數據到串口(在PC屏幕上顯示),我使用了一些使用putchar()方法的自己的函數。C中的任何函數而不是sprintf()?編譯後代碼大小太大

當我想給整數浮動,我才能將其轉換爲字符字符串用sprintf(),並將它們發送到串行端口。

現在,他們的問題是,我使用的是Keil uVision IDE,它的最大版本爲32 KB。 每當我在不同的函數中調用sprintf()時,我不知道爲什麼編譯後代碼的大小增加太多。 我現在已經超過了32 KB,我不知道我必須改變我的一些功能,並使用別的東西而不是sprintf!

任何線索?

+7

畢竟,儘量避免浮動,因爲它們的運行時庫組件在大多數情況下相當大且很慢。 – glglgl

+1

由於執行它所需的大量代碼(尤其是浮點數),printf系列代價非常昂貴。一個整數只有printf是相當小的但仍然昂貴。你真的認爲你需要在嵌入式微控制器代碼中使用printf()嗎?你可以實現你自己的更便宜的解決方案。 –

+0

也看看你的編譯器供應商提供的庫。通常會有多種風格的C std庫,功能會減少。例如,處理int和float的sprintf,但不是科學記數法。 –

回答

0

您可以嘗試itoa()ftoa()並將它們作爲您的要求來實現。我的意思是,它們將這些字符轉換爲僅在定義內部的字符,可使用putchar()直接打印。

這是應該工作,我認爲。

+3

在C語言中沒有稱爲itoa的函數,也沒有稱爲ftoa的函數。 – Lundin

+0

@Lundin:可以寫成你的要求...或包括這些文件... itoa和ftoa在這些頭文件 Omkant

+0

C中沒有itoa()和ftoi()(我不知道它是否真的存在於C++中) – Django

6

如果你希望它是高效的,最好的方法可能是自己編寫代碼,或者在網上找到一些已經編寫好的代碼。然而,Int到字符串轉換非常簡單,每個程序員都可以在不到30分鐘的時間內完成。浮點到字符串的轉換有點複雜,並取決於所使用的浮點格式。

爲了方便起見,這裏是一個簡單的INT-到字符串的算法用於微控制器應用:

void get_dec_str (uint8_t* str, size_t len, uint32_t val) 
{ 
    uint8_t i; 
    for(i=1; i<=len; i++) 
    { 
    str[len-i] = (uint8_t) ((val % 10UL) + '0'); 
    val/=10; 
    } 

    str[i-1] = '\0'; 
} 
+2

如果你的micro沒有硬件分頻器......(或模數:),我不確定這是一個非常快速/高效的函數。儘管我的頭頂沒有更好的選擇! –

+3

@MartinThompson我不確定有很多人可以做到這一點,小數是基於10,但計算機更喜歡基於2/4/8/16/32的。除了我寧願將優化留給編譯器。 – Lundin

+1

公平的評論re:留下優化到編譯器 –

9

兩個潛在的產品(兩者都沒有我用我自己 - 我的編譯器廠商通常提供一個剝離下來printf嵌入式應用):

http://eprintf.sourceforge.net/ - [2017年9月:不幸的是,似乎已經消失,但源代碼仍然在這裏:https://sourceforge.net/projects/eprintf/files/]

http://www.sparetimelabs.com/tinyprintf/index.html - 2個文件,大約1.4KB代碼。選項啓用'長'(意味着更多的代碼大小)。支持前導零和字段寬度。沒有浮點支持。

+1

由於'eprintf'網頁沒有鏈接到實際的代碼,這裏是一個鏈接到sourceforge eprintf項目:http://sourceforge.net/projects/eprintf/ –

+0

雖然這鏈接可以回答這個問題,最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/評論/低質量帖/ 17459102) – StoryTeller

+0

@StoryTeller - 通常我會同意,但我不確定內容摘要有助於鏈接消失(正如我看到的他們有:( - 當我只是提供鏈接到源代碼而不是一個真正的「答案」。 –