2015-08-23 36 views
0

使用F()宏會帶來更多的RAM開銷,然後保存的短字符串是否有限制?F()是否有用的最小字符串長度?

對於(一個人爲的)例如:

Serial.print(F("\n")); 
Serial.print(F("Hi")); 
Serial.print(F("there!")); 
Serial.print(F("How do you doyou how?")); 

會那些中的任一個是不F()更有效率?

我想象它使用一些RAM遍歷字符串並將其從PROGMEM複製到RAM。我想問題是:多少錢?此外,堆碎片在這裏是一個問題嗎?

我在純粹從SRAM保存的角度來看待這個問題。

+0

F()宏用於存儲閃存中的字符串,完整的文檔可以參見http://playground.arduino.cc/Learning/Memory。取決於你想如何使用你的字符串,你可以考慮訪問flash或sram的速度,爲此你可以看到http://arduino.stackexchange.com/questions/221/what-c​​an-i-do-if-i -run-外的閃存-或-SRAM。 – user1929959

+0

@ user1929959「完整文檔」在'F()'宏上有完整的一個句子。我在我的問題中明確指出「我純粹從SRAM保存的角度來看待這個問題」。 – frnhr

+0

唯一正確的答案是*它取決於*因此,這是題外話題:基於意見和太寬泛,解釋如何配置文件將採取超過答案框允許的。 –

回答

0

我不認爲有任何最小字符串的大小是有用的。如果你看一下輸出是如何在Print.cpp實施:

size_t Print::print(const __FlashStringHelper *ifsh) 
{ 
    PGM_P p = reinterpret_cast<PGM_P>(ifsh); 
    size_t n = 0; 
    while (1) { 
    unsigned char c = pgm_read_byte(p++); 
    if (c == 0) break; 
    n += write(c); 
    } 
    return n; 
} 

你可以從那裏只有一個內存字節在一個時間(加上幾個變量)用看到的那樣,它拉PROGMEM中的字符串一次一個字節。這些都在堆棧中,所以沒有持續的開銷。

我想它使用一些RAM來迭代字符串並將其從PROGMEM複製到RAM。我想問題是:多少錢?

不,它不像我上面顯示的那樣。它一次輸出一個字節。沒有先將字符串批量拷貝到RAM中。

此外,在這裏堆碎片的關注?

不,代碼不使用堆。

相關問題