ルネサスRL78コントローラーをベースにした自動車用のソフトウェアスタックの開発に取り組んでいます。問題に直接入ると、const(ROM変数)で宣言された変数が定義された値で初期化されていません。
例:const uint8 var_test = 1;
一方、グローバルな静的変数は初期化されています。
これはスタートアップコードの問題ですか?親切に提案...
他の回答と同様に、おそらく const 変数は ROM セクションに配置されていません。
コンパイラ/リンカーにどこに配置するかを伝える必要があります。
IAR ツールチェーンでは、おそらく次のようなものです
#pragma SET_CONST_PAGE(ConstArea)
const int myVariable1=42;
const int myVariable2=4711;
#pragma SET_DEFAULT_CONST_PAGE
ただし、デバッガーが正しい値を表示しないことは別の問題です。変数が最適化されている可能性があります。
何が起こるかを確認するには、マップ ファイルを調べて、(デバッガーを使用して) アセンブリ レベルで何が行われているかを調べます。
通常、 const は、変数を ROM に入れるのに十分な修飾子ではありません (いつでもキャストできます)。通常、必要なものを示すためにコンパイラ固有の何かで変数をマークする必要があります。または、意図を示すコンパイラ フラグを使用することもできます。IAR コンパイラは @ 記号を使用して、変数の場所を指定できるようにしていると思います。私はそのマニュアルをチェックします:-)
Constオブジェクトは、言語がROMに配置する必要はありませんが、初期化後に読み取り専用にする必要があります。たとえば、一部のターゲットでのパフォーマンス上の理由から、コンパイラーは意図的にそうすることを避ける場合があります。
IAR RL78 C /C++コンパイラリファレンスガイドには次のように記載されています。
「constと宣言され、farメモリにある静的およびグローバルオブジェクトはROMに割り当てられます。const宣言されたsaddrオブジェクトはRAMに割り当てられ、起動時にランタイムシステムによって初期化されます。const宣言されたnearオブジェクトは、オプション--near_const_locationに従って割り当てられます。
C ++では、ランタイムの初期化が必要なオブジェクトをROMに配置することはできません。」
#pragma location
マニュアルのディレクティブまたはオペレータを参照してください@
。これらを使用すると、絶対アドレスまたは名前付きメモリセグメント内に配置できます。
非静的const
変数は、通常、ROM に入れるのに十分な「定数」ではありません。このような変数を使用して関数を調べると、おそらく関数のプリアンブルに、ローカル スタック上の変数を初期化するコードが含まれていることがわかります。
もちろん、起動コードは (定義により) 値を ROM に書き込むことができないため、これを修正することはできません。