ROM変数
投稿:2014-09-01、更新:2014-09-05
リセット直後から関数mainに到着するまでにグローバル変数、スタティック変数を初期化しています。
- ROMに格納済みの初期値をRAMにコピーして変数とする
- 初期値を持たない変数はRAMをゼロクリアして変数とする
参照だけのテーブルは更新できなくて良い訳ですから、初期値が格納済みのROMを参照すれば良いじゃないかと考えました。
まず、変数宣言用のマクロを用意、ROM変数専用のセクションへ配置させます。
まず、変数宣言用のマクロを用意、ROM変数専用のセクションへ配置させます。
// 参照限定のテーブルをROMに配置する属性 #define KSRK_ROM static const __attribute__((section(".ksrk_rom")))次にリンカスクリプトでセクションを宣言しておきます。
/* KSRK_ROM SECTION */ .ksrk_rom : ALIGN(4) { KEEP(*(.ksrk_rom)) . = ALIGN(4); } > MFlash512これで変数の宣言にKSRK_ROMを前置すればROMに配置されます。 当然ですけれど、ROM変数を更新しようとするとバスフォルトを食らいますからくれぐれもご注意ください。
図解するとこんな感じ
当初、既存のセクション「.rodata」を指定してROMに配置させていましたけれど、
何故かProblemに警告が出てしまうので専用のセクション「.ksrk_rom」を用意しました。