如何在FLASH存储器(AVR,GCC)中存储其他代码段

时间:2013-12-05 15:49:56

标签: linker avr-gcc atmega

我正在使用AVR ATmega328p MCU,我想在地址0x7000处将常量字符串添加到闪存中。我怎么能用AVR-GCC做到这一点?

我的代码包含此声明:

// Firmware version
static volatile char version[16] __attribute__ ((section (".fwversion"))) = "0.01 DEV";

现在,当我用这个标志运行gcc时:

avr-gcc -Wl,--section-start=.fwversion=0x7000 -mmcu=atmega328p -DF_CPU=8000000UL -Os -Wall -o main.elf main.c

ELF文件包含.fwversion部分,avr-objcopy之后,iHEX文件中的地址为0x7000。

但是当我使用-Wl,--gc-sections标志运行gcc:

avr-g++ -Wl,--gc-sections -Wl,--section-start=.fwversion=0x7000 -mmcu=atmega328p -DF_CPU=8000000UL -Os -Wall -o main.elf main.c

.fwversion部分已删除。

我需要使用-Wl,--gc-sections标志,但我还需要将常量字符串存储在闪存中。我应该用什么标志来实现这个目标?


可以在GCC中使用这样的东西吗?

static volatile char version[16] __attribute__ ((section (0x7000))) = "0.01 DEV";

2 个答案:

答案 0 :(得分:0)

我不确定为什么它需要在某个地址,除非您希望它可用于引导程序。

This Program Memory link讨论了可用于从位置存储和访问闪存的功能。 通常,您使用PSTR命令在闪存中存储和访问字符串。 E.g。

char str[16] = PSTR("I am a string\n");

答案 1 :(得分:0)

我认为静态volatile char不是你的意思。也许const char,像这样:

const char version[16] __attribute__ ((section(".fwversion"))) = "0.01 DEV";

另请注意memcpy_PF函数。