gpt4 book ai didi

c - 即使声明为(已使用),PROGMEM 变量也会被丢弃

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:28 25 4
gpt4 key购买 nike

我正在使用 ATMEL Studio 6.2 及其工具链和 avr-gcc (avr8-gnu-toolchain)。我有一个需要放在 flash (PROGMEM) 中的变量,我将其声明为全局变量:

static const uint16_t gPrgLen PROGMEM __attribute__((used)) = 0;

编译器没有报错,链接器也没有报错,但是当我打开 .lss 文件时,找不到 gPrgLen。在 .map 文件中我们可以看到它已被列在“discarded input sections”下

Discarded input sections
.progmem.data.gPrgLen 0x00000000 0x2 Boot.o

它是作为一个版本构建的,但调试构建给出了相同的结果。如何强制链接器将此变量包含在 *(.progmem*) 部分中?

编辑
添加了 static 但结果仍然相同。

这是链接器部分:

# All Target
all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)

$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP)
@echo Building target: $@
@echo Invoking: AVR/GNU Linker : 4.8.1
$(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="Boot.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -Wl,-section-start=.text=0xf800 -mmcu=at90usb647
@echo Finished building target: $@
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "Boot.elf" "Boot.hex"
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "Boot.elf" "Boot.eep" || exit 0
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "Boot.elf" > "Boot.lss"
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "Boot.elf" "Boot.srec"
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1056\avr8-gnu-toolchain\bin\avr-size.exe" "Boot.elf"

最佳答案

奇怪的是 __attribute__((used)) 不工作。有两个建议可以尝试。

首先,将变量从static 更改为volatile(或者只添加volatile)。这可能会阻止它被优化掉。

如果这不起作用,您可以向链接器添加一行,使其成为“[p]重新定义符号 symbol 未定义,以强制链接库模块来定义它” (GCC Link Options)。这是通过 -u symbol--undefined=symbol 完成的。

要将它添加到 Atmel Studio 项目文件,请转到工具链 -> AVR/GNU 链接器 -> 杂项。然后在 Other Linker Flags 添加 --undefined=gPrgLen.

我用它来将修订版/编译时信息嵌入到 Hex 文件中,而不用其他方式。这样我就可以从设备中检索内存并知道它是在什么条件下构建的(主要用于跟踪原型(prototype)设计和初始固件调试期间的变化)。我的 main.c 文件有一个全局字符数组,看起来像 const char codeCompileDetails[] PROGMEM = "company_name-"__DATE__ "-"__TIME__;。结合 --undefined=codeCompileDetails,该数据(此处包括编译代码的日期和时间)始终使其成为可执行文件。

关于c - 即使声明为(已使用),PROGMEM 变量也会被丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42116020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com