stm32 にフラッシュ メモリの領域を保存して、独自の構成情報を保存したいと考えています。
これを行うには、フラッシュ メモリの 2 番目のセクターを STM32F2/STM32F4 (0x08004000-0x08007FFF に格納された 16kb) に保存します。
インターネットとstackoverflowをチェックすると、これを行う4つの方法があります
1)
#pragma location=0x08004000
__no_init const char ReservedArea[16*1024];
2)
__no_init const char ReservedArea[16*1024] @0x08004000;
3) セクションの作成 + #pragma location=
プロジェクト ICF:
place at address mem: 0x08004000 { readonly section ConfigSection };
cファイル:
#pragma location="ConfigSection"
__no_init const char ReservedArea[16*1024];
4)
プロジェクト .icf ファイルでセクションを定義するIAR がカスタム データのメモリ領域を定義する
バグまたは問題が見つかりました
方法 1 ~ 3で問題ありません。リンカーには、変数用のスペース領域が含まれています。16 進エディタで生成された .bin ファイルを確認するか、デバッグして、変数が @ 0x08004000 であることを確認できます。
これらの方法で見つかった問題は、iar リンカが 0x08000800 ~ 0x08003FFF の間の 12k バイトを超える未使用のフラッシュ メモリを残すことです。これを確認する最善の方法は、var を削除してコンパイルし、bin ファイルのサイズをメモに書き込んでから、変数を追加することです。これを行うと、新しい bin ファイルのサイズが正確に 16kb でなければならないときに、16kb を超えていることがわかります。
アドレスを 0x08004000 から 0x0800C000 に変更せずに移動すると、ファイル サイズがさらに 32k バイト増加し、以前の領域はすべて 0x00 に設定され、bin ファイルでは使用されません。これは私たちのプロジェクトにとって大きな問題です。bin ファイルの残りの未使用領域を使用してファームウェアの更新を可能にするからです。
マップ ファイルを確認すると、予約ゾーンの前のエリアも未使用であることがわかります。
これを修正する方法をいくつか試しましたが、うまくいきませんでした。たとえば、アドレスで 2 つの変数を定義する、何時間もプレイする、リンカ オプションをチェックする、最適化する、他の #pragma オプションを使用するなどです。
4番目の方法については、変数をシステムに保存しますが、必要なアドレスを取得できません。おそらく問題は、両方の領域がアドレス空間を共有していたことです。
icf ファイル
define region LANGUAGE_region = mem:[from 0x08004000 to 0x08007FFF];
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
"LANGUAGE_PLACE":place at start of LANGUAGE_region { section .LANGUAGE_PLACE.noinit };
cコード
extern const char ReservedArea[16*1024] @".LANGUAGE_PLACE.noinit";
const char ReservedArea[16*1024];
それは私の問題ですか?バグですか?どんなヒントでも大歓迎です。
前もって感謝します。