如何在ROM(Atmel)中存储常量

时间:2016-10-12 03:42:31

标签: c embedded atmel atmelstudio

美好的一天,

我正在使用AtmelStudio 7为ATMega645A编写固件。我正在开始一个本地化项目,需要在3种不同语言的16x2字符显示器上显示消息。现有的(英文消息)存储在SRAM中,但如果我必须将消息数量增加三倍,我将最终溢出这个数据存储空间。

所以,我试图将消息存储在ROM中,空间很大。问题是,Atmel应用笔记是(a)错误或(b)不完整,因为我根据他们的建议尝试了多种方法,并且代码无法编译(参见:Atmel提示和技巧应用说明doc8453.pdf第8页,以及{ {3}})。我的代码如下所示:

// before main(void)
#include <avr/pgmspace.h>
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";

PGM_P string_table[5] PROGMEM =
{
  string_1,
  string_2,
  string_3,
  string_4,
  string_5
};

在main(void)中我有以下内容:

char buffer[10];
PGM_P p;
int i;

memcpy_P(&p, &string_table[i], sizeof(PGM_P));
strcpy_P(buffer, p);

编译时,我收到一条消息: 变量&#39; string_table&#39;必须是const才能通过&#39; 属性((progmem))&#39;

进入只读部分

我已经尝试过&#39; char&#39;而不是&#39; const char&#39;,但似乎没有编译。关于将这些静态字符串存储在ROM中的正确语法的任何建议都将非常感激。

1 个答案:

答案 0 :(得分:0)

在整天忙乱以及许多试错之后,我想出了以下内容:

更改行

`PGM_P string_table[5] PROGMEM =`

`PGM_P const string_table[5] PROGMEM =`

这似乎是编译,我可以在显示器上显示字符串“buffer”的内容(“String 1”实际上是发送到显示器的内容)。我希望这将有助于其他有类似问题的人进出ROM的常数。