Linker 如何在闪存中存储其他代码段(AVR、GCC)

Linker 如何在闪存中存储其他代码段(AVR、GCC),linker,avr-gcc,atmega,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=0x700

我正在使用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节运行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节
标志,但我还需要存储在闪存中的常量字符串。我应该使用什么标志来实现这一点


在GCC中可以使用类似的东西吗

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

我不确定为什么它需要在那个特定的地址,除非你希望它可用于引导程序

讨论可用于从不同位置存储和访问闪存的功能。 通常使用
PSTR
命令在闪存中存储和访问字符串。 例如


我认为静态易失性字符不是你的意思。可能是const char,如下所示:

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

还要注意memcpy_PF函数。

你是说
avr objdump
没有在
main.elf
中显示
.fwversion
部分吗?是的,
.fwversion
在elf中被删除,因此代码不在十六进制文件中。有一些原因说明它为什么不在十六进制中,与它是否在elf中无关。
const char version[16] __attribute__ ((section(".fwversion"))) = "0.01 DEV";