KDSおよびCodewarrior for MCU GCCビルドでは、リンカはリセット後にRAMを初期化し、メイン機能を入力します。ただし、一部のアプリケーションでは、ユーザーはリンカーがデータセクションを初期化することを望んでいません。典型的なケースは、ブートローダ+アプリケーションの組み合わせプロジェクトで、2つのプログラムが同じRAMメモリを共有する必要がある場合です - ユーザーアプリケーションが共有RAMにデータを書き込んでから、ソフトウェアリセットによってブートローダを呼び出すと、ブートローダは正確なデータを読み取ることができます。共有 RAM のデータは、ブートローダー リンカの初期化によって上書きされません。この記事では、GCCビルドに初期化されていないデータセクションを追加する方法について2つの方法を紹介します。
メソッド1。リンカファイルでNOLOADキーワードを使用します。
NOLOAD : セクションはロード不可としてマークして、プログラムの実行時にメモリにロードされないようにする必要があります。たとえば、以下のセクション.bufframと .bss2は "NOLOAD" としてアドレス指定され、プログラムの実行開始時にロードする必要はありません。
詳しくは、Eclipse上のマイコンの記事 http://mcuoneclipse.com/2014/04/19/gnu-linker-can-you-not-initialize-my-variable/ をご覧ください。
メソッド2。初期化されていない RAM の C コードでポインターを使用します。
この方法では NOLOAD は使用されません。これを利用する手順は次のとおりです。
ステップ1:リンカファイルで初期化されていないRAMを定義しないでください。
ステップ2:Cファイルで、ポイントを使用して初期化されていないアドレスにアクセスします。
詳細については、デモがリストされている添付ドキュメントを参照してください。
このドキュメントは、KDSおよびCodewarrior for Kinetis GCCビルド用です。
S32DSのMPC5744Pに関する質問がある場合は、S32DSスペースで質問することをお勧めします https://community.nxp.com/community/s32/s32ds
私はMPC5744PにS32DSを使用しており、キーワードNOLOADを使用してみましたが、正しく動作しないようです。
起動時に特定のRAMメモリを初期化せず、初期化されていないRAMを読み書きすると、ECUの電源がオンになるたびにMCUがIVOR1エラーを生成します。
しかし、起動時にアプリケーションとブートローダが共有する特定のRAMメモリを初期化し、アプリケーションで共有RAMにデータを書き込んでからソフトウェアリセットによってブートローダを呼び出すと、ブートローダは正確なデータを読み取る ことができません 。
何よりも、MPC57xxのS32DSでRAMメモリを読み書きする場合は、起動時にRAMメモリを初期化しないと、ECUの電源投入時にIVOR1エラーが発生します。正しいですか?感謝。