【发布时间】:2017-02-08 14:37:16
【问题描述】:
我正在使用 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
.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"
【问题讨论】:
-
您是否在代码中的某处尝试过
(void)PROGMEM;这一行来强制使用该变量?如果它不起作用,那么你必须在链接器文件中强制它(你有链接器文件吗?) -
我已经尝试在程序中使用该变量,但它仍然没有链接。 ATMEL Studio 正在生成 make 文件,但我可以在项目属性中设置“免费”选项。
-
你能贴出makefile的链接器部分吗?
-
更新了 makefile 链接器部分。
-
你在使用
avr-g++吗?尝试将extern "C"放在定义 PROGMEM 变量的行的开头,以告诉编译器不要修改它的名称。
标签: c linker avr-gcc atmelstudio progmem