如何防止字符串在 PROGMEM 中多次发出蜂鸣声
How to prevent strings from beeing multiple times in PROGMEM
我试图通过尝试减少 progmem 中的计数字符串来保护某些程序 space。所以我开始将所有多次需要的字符串放入一个名称为 space:
的文件中
#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;
。从程序中读取字节并将它们放在显示器的正确位置。
但是如果我查看 .Iss
我发现它们仍然多次包含在 ASM 中。
000000a8 <_ZN9p_stringsL5startE>:
a8: 53 74 61 72 74 00 Start.
...
000000de <_ZN9p_stringsL5startE>:
de: 53 74 61 72 74 00 Start.
所以我想这不是安全存储的正确解决方案。
我现在的问题是:
- 为什么它仍然多次包含(在 asm 中)? (也许我的想法有些简单的失败)
- 我如何创建 "something" 来防止这种情况发生? (我需要以某种方式作为参考传递的 class 吗?)
如果需要更多信息,请告诉我。
在 C++ 中,const
变量默认具有内部链接(就好像它是 static
)——这通常意味着每个翻译单元(每个 .cpp
文件)都获得其自己的副本。这很可能就是您多次看到它们的原因。
您要做的是将变量声明为 extern
,然后在一个源文件中定义它们。
我试图通过尝试减少 progmem 中的计数字符串来保护某些程序 space。所以我开始将所有多次需要的字符串放入一个名称为 space:
的文件中#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;
。从程序中读取字节并将它们放在显示器的正确位置。
但是如果我查看 .Iss
我发现它们仍然多次包含在 ASM 中。
000000a8 <_ZN9p_stringsL5startE>:
a8: 53 74 61 72 74 00 Start.
...
000000de <_ZN9p_stringsL5startE>:
de: 53 74 61 72 74 00 Start.
所以我想这不是安全存储的正确解决方案。
我现在的问题是:
- 为什么它仍然多次包含(在 asm 中)? (也许我的想法有些简单的失败)
- 我如何创建 "something" 来防止这种情况发生? (我需要以某种方式作为参考传递的 class 吗?)
如果需要更多信息,请告诉我。
在 C++ 中,const
变量默认具有内部链接(就好像它是 static
)——这通常意味着每个翻译单元(每个 .cpp
文件)都获得其自己的副本。这很可能就是您多次看到它们的原因。
您要做的是将变量声明为 extern
,然后在一个源文件中定义它们。