使用avr-gcc
可以將數據存儲在程序存儲器中以便節省RAM。這是使用PROGMEM attribute實現的。 AVR-libc還提供了一個宏,PSTR(),它可以用於字符串。__FUNCTION__上的PSTR()_
現在我試圖使用PSTR()
與__func__
, __FUNCTION__
or __PRETTY_FUNCTION__
.
下面的代碼按預期工作,
display.message(__func__, 2);
display.message(__FUNCTION__, 2);
display.message(__PRETTY_FUNCTION__, 2);
,而這些線路的編譯失敗,
display.messageP(PSTR(__func__), 2);
display.messageP(PSTR(__FUNCTION__), 2);
display.messageP(PSTR(__PRETTY_FUNCTION__), 2);
,出現以下錯誤:
initializer fails to determine size of '__c'
PSTR的定義,從WinAVR中/ AVR /包括/ AVR,解釋上的錯誤消息中引用變量:
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
這不是一般的宏,爲__FILE__
編譯和精細工作:
display.messageP(PSTR(__FILE__), 2);
什麼是導致此錯誤的任何想法,並且如果可以使用PSTR()在程序存儲器中插入函數名稱?
看起來像那些字符串文字不能放在那個空間中,因爲它們需要特殊的功能?訪問它們。事實上,這些名字應該相當小,所以我想知道是否有一個真正的優勢,無論如何移動它們。我說這不知道你的RAM的實際數量。 –
@MichaelDorgan avr-libc提供訪問程序存儲器中變量的函數;這是由問題的最後一行代碼所證實的,它工作正常。我同意這些字符串很小,但它們在嵌入式系統中很重要(只有幾K字節的RAM)。 – mMontu