我正在使用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";
答案 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函数。