2017-02-08 54 views
1

我正在使用ATMEL Studio 6.2及其帶有avr-gcc(avr8-gnu-toolchain)的工具鏈。我有一個需要被置於閃光燈(PROGMEM)一個變量,我宣佈它作爲一個全球性的: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: [email protected] 
@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: [email protected] 
"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" 
+0

你有沒有試過這一行'(void)PROGMEM;'你的代碼中的某處強制使用該變量?如果它不起作用,那麼你必須強制它在鏈接器文件中(你有鏈接器文件嗎?) –

+0

我試圖在程序中使用該變量,但它仍然沒有鏈接。 ATMEL Studio正在生成make文件,但我可以在項目屬性中設置「免費」選項。 –

+0

你可以發佈makefile的鏈接器部分嗎? –

回答

0

奇怪__attribute__((used))不工作。兩個建議嘗試。

首先,將變量從static更改爲volatile(或者只是添加volatile)。那可能阻止它被優化掉。

如果不工作,而不是你可以添加一行鏈接器,使其「[P] retend符號符號是不確定的,要強制鏈接庫模塊來定義它」(GCC Link Options)。這是通過-u symbol--undefined=symbol完成的。

要將其添加到Atmel Studio項目文件,請轉到工具鏈 - > AVR/GNU鏈接器 - >其他。然後在其他鏈接器標誌中添加--undefined=gPrgLen

我已經使用它來將修訂/編譯時信息嵌入到Hex文件中,否則它不會被使用。這樣我就可以從設備中檢索內存,並知道它在什麼條件下生成(主要用於跟蹤原型設計和初始固件調試期間的更改)。我的main.c文件有一個全局字符數組,看起來像const char codeCompileDetails[] PROGMEM = "company_name-" __DATE__ "-" __TIME__;。再加上--undefined=codeCompileDetails,那些數據(這裏包括代碼編譯的日期和時間)總是將其寫入可執行文件。

相關問題