【发布时间】:2013-07-31 16:55:36
【问题描述】:
使用avr-gcc 可以将数据存储在程序存储器中以节省 RAM。这是使用PROGMEM attribute 完成的。 AVR-libc 还提供了一个宏,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/include/avr,解释了错误消息中引用的变量:
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
这对于宏来说不是通用的,因为 __FILE__ 编译和工作正常:
display.messageP(PSTR(__FILE__), 2);
关于导致此错误的原因以及是否可以使用 PSTR() 将函数名插入程序内存的任何想法?
【问题讨论】:
-
看起来那些字符串文字不能放在那个空间中,因为它们需要特殊功能?访问它们。事实上,这些名字应该非常小,所以我想知道将它们移到那里是否有真正的优势。我这么说是不知道你有多少内存。
-
@MichaelDorgan avr-libc 提供访问程序内存中变量的函数;问题的最后一行代码证实了这一点,它工作正常。我同意这些字符串很小,但它们在嵌入式系统中很重要(只有几 KB 的 RAM)。