如何在PROGMEM中多次防止字符串出现问题

时间:2015-04-07 08:53:14

标签: c++ assembly avr progmem

我试图通过尝试减少progmem中的计数字符串来保护一些程序空间。所以我开始将需要多次的所有stings放入带有命名空间的文件中:

#include <avr/pgmspace.h>
#ifndef __PSTRINGS__
#define __PSTRINGS__
namespace p_strings
{
//golbal
const char right_arrow[] PROGMEM = ">";
const char procent[] PROGMEM = "%";
const char start[] PROGMEM = "Start";
const char speed[] PROGMEM = "Speed: ";
//... more here
}
#endif

我使用字符串将它们包含在我需要它们的文件中,例如调用Display::out_p(1, 0) << p_strings::right_arrow;。其中读取了progmem中的字节并将它们放在显示器的正确位置。 但如果我查看.Iss,我会发现它们仍被多次包含在ASM中。

000000a8 <_ZN9p_stringsL5startE>:
      a8:   53 74 61 72 74 00                                   Start.
...
000000de <_ZN9p_stringsL5startE>:
      de:   53 74 61 72 74 00                                   Start.

所以我想这不是安全存储的正确解决方案。

我现在的问题是:

  1. 为什么它仍然多次包含(在asm中)? (也许是我思考的一些简单的失败)
  2. 如何创造&#34;某事&#34;这阻止了这个? (我是否需要一个我作为参考传递的课程?)
  3. 如果需要更多信息,请与我联系。

1 个答案:

答案 0 :(得分:1)

在C ++中,const变量默认具有内部链接(就好像它是static) - 这通常意味着每个翻译单元(每个.cpp文件)都有自己的副本。这可能就是您多次看到它们的原因。

您要做的是将变量声明为extern,然后在一个源文件中定义它们。