c++ - 如何防止字符串在 PROGMEM 中多次发出蜂鸣声

标签 c++ assembly avr progmem

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

#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.

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

我现在的问题是:

  1. 为什么它仍然多次包含(在 asm 中)? (也许我的想法有些简单的失败)
  2. 我如何创建阻止这种情况的“东西”? (我是否需要以某种方式作为引用传递的类(class)?)

如果需要更多信息,请告诉我。

最佳答案

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

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

关于c++ - 如何防止字符串在 PROGMEM 中多次发出蜂鸣声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29487540/

相关文章:

timer - AVR定时器编程: CTC mode vs. 正常模式

c - 嵌入式 C : AVR; variable in header cannot be evaluated in main

c++ - cocos2dx中加速度计的使用方法

c++ - 如何编写和调用std::hash? -用于gmp的mpz_class和mpz_t

c++ - 在可执行文件中链接 CUDA 文件时出现 cuSparse 函数的多个定义错误

c - ATmega8 加/减计数器计数不正确

php - 网络图库

c - VC++ 2010 中的内联汇编错误

assembly - 如何制作一个自动构建、链接和执行 .asm 文件的批处理文件?

linux - 尝试在 Ubuntu 上的 NASM 上运行 .asm 文件时出错