2013-07-31 61 views
5

使用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()在程序存儲器中插入函數名稱?

+0

看起來像那些字符串文字不能放在那個空間中,因爲它們需要特殊的功能?訪問它們。事實上,這些名字應該相當小,所以我想知道是否有一個真正的優勢,無論如何移動它們。我說這不知道你的RAM的實際數量。 –

+0

@MichaelDorgan avr-libc提供訪問程序存儲器中變量的函數;這是由問題的最後一行代碼所證實的,它工作正常。我同意這些字符串很小,但它們在嵌入式系統中很重要(只有幾K字節的RAM)。 – mMontu

回答

8

__func____FUNCTION____PRETTY_FUNCTION__不是字符串文字,就像__FILE__,但像靜態局部字符數組變量,您使用的是他們從函數創建。因此,PSTR()宏將失敗,因爲您不能使用數組變量來初始化另一個數組變量。

__func__在C11中描述,§ 6.4.2.2 ¶ 1:

The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";
appeared, where function-name is the name of the lexically-enclosing function.

According to the GCC manual__FUNCTION____PRETTY_FUNCTION__是在C __func__只是同義詞(__PRETTY_FUNCTION__是對於C更詳細++)。

+0

有沒有辦法讓__func__進入程序內存?默認情況下,該定義將其放入RAM中。顯然,人們不想浪費RAM上的靜態調試數據。 – 2014-11-05 10:39:28

+0

問題是關於avr-gcc,意味着AVR平臺。它是一個具有兩個存儲空間的哈佛架構。程序存儲器是設備的閃存,通常是隻讀的。由於設備只有有限的RAM(16k大約是限制,通常爲2-4k),因此您不想使用調試字符串填充該設備。 – 2014-11-05 23:58:39

+0

@MoJo:謝謝,澄清。看起來您需要根據具體情況聲明自己的變量(如果您有此要求),或者您必須修改編譯器以將其擴展爲允許指定'__func__'變量的內存目標。 – jxh