2017-02-08 23 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ファイルを生成していますが、プロジェクトのプロパティに "free"オプションを設定できます。 –

+0

メイクファイルのリンカ部分を投稿できますか? –

答えて

0

奇数__attribute__((used))が機能していないこと。試す2つの提案。

まず、変数を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__;のように見えるグローバルなchar配列がありました。 --undefined=codeCompileDetailsと組み合わせて、そのデータ(ここではコードがコンパイルされた日時を含む)は常に実行可能ファイルに変換されます。

関連する問題