もくじ
はじめに
この記事では、以前の [VS Code で NXP マイコン開発 3] FRDM-MCXN947 を使って Hello World を Debug してみた で使用した Hello World プロジェクトのメモリー配置を変更してみます。前回のまとめで触れたように、SDK に付属するオリジナルの Hello World プロジェクトは Flash 領域にプログラムを配置する作りになっているため、デバッグ実行のたびに Flash 領域の書き換えが行われます。
今回はプロジェクト設定を変更し、RAM 上にプログラムを配置して実行する方法について解説していきます。メモリー配置の確認方法についても触れたいと思います。
参考資料: MCUXpresso for Visual Studio Code も併せてご参照ください。
1. メモリー配置の確認方法(Hello World (変更前) の配置を確認)
メモリー配置の変更を試す前に、前回使用した Hello World プロジェクトのメモリー配置を確認してみましょう。ここでは、2通りの確認方法を紹介します。
以下に紹介するどちらの方法でも構わないので、変更前の Hello World のプログラム配置を確認してみてください。プログラム用のセクション(.text)が Flash 領域(Address: 0x00000400~)に配置されている事が確認できると思います。
1-1. Image Info ビューによる確認
1つ目は、VS Code に用意される機能でメモリー配置を確認する方法です。"Image Info" の "Load Build Artifact" のアイコンを押下、もしくは、ビルド実行により生成された実行イメージ (.elf) を右クリックし、"Binary Utilities" -> "Image Info" を選択することで、メモリー配置の情報が参照可能です。
【図 1】"Image Info" の "Memory" ビュー表示手順 1
【図 2】"Image Info" の "Memory" ビュー表示手順 2
上記のどちらかの手順によりビルド情報をロードすると、"Image Info" 内の "Memory" に詳細情報が出力されます。
【図 3】"Image Info" の "Memory" ビュー
ポイント: 【図 1】の手順でビルド情報をロードするとビルド対象が "Default" となっているイメージに対しての "Image Info" となります。
1-2. map ファイルによる確認
もう1つは、VS Code に限らず一般的に使用される方法となりますが、ビルド時に生成される map ファイル(拡張子:.map)を参照する方法です。ビルド実行後、実行イメージ(.elf)と同じディレクトリーに生成されている map ファイルをクリックして開きます。
以下のように、map ファイルにはメモリー領域の定義や、プログラムの配置情報が記録されます。
【図 4】map ファイルの中身
2. RAM 上にプログラムを配置するための変更手順
ここからはプログラムの配置を Flash 領域から RAM 領域へ変更する方法を紹介していきます。
ポイント: MCUXpresso IDE では、プロジェクトプロパティーで画面で変更可能でしたが、VS Code ではプロジェクトプロパティーが用意されていないため、手動でリンカースクリプトファイルを差し替える必要があります。
2-1. RAM 領域リンカースクリプトファイルのコピー
あらかじめ準備されている SDK 内にある RAM 領域対応のリンカースクリプトファイルを Hello World プロジェクト内にコピーします。
コピー元ファイル:<SDK インストールフォルダ>/devices/MCXN947/gcc/MCXN947_cm33_core0_ram.ld
コピー先フォルダ:<Hello World プロジェクトフォルダ>/armgcc
【図 5】リンカースクリプトファイルのコピー
2-2. リンカースクリプトファイルの差し替え
ビルド時にコピーした RAM 領域対応のリンカースクリプトが適用されるようにプロジェクト配下の armcc フォルダ内にある "flags.cmake" ファイルを【図 6】のように変更します。
【図 6】flags.cmake ファイル変更
2-3. ビルド
配置変更後のプログラムである事が区別できるように、ビルド実行前に Hello World のメッセージを変更しておきます。main 関数に記述されている PRINTF の引数を好きな文字列へ変更してください。
【図 7】Hello World メッセージの変更
変更が完了したら、Build Project アイコンを押下するか、プロジェクトの右クリックから "Build Project" を実行します。
メモ: "TERMINAL" ビューに以下のようなメッセージが表示されればビルド成功です。エラーが発生する場合は原因箇所を調べて再度ビルドを行ってください。
build finished successfully.
2-4. 変更後のメモリー配置を確認&比較
ビルド完了した所で、プログラム変更前後のメモリー配置の違いを確認しておきます。先に紹介した Image Info ビュー や map ファイルの差分を比較する以外にも、ビルド実行時に出力される TERMINAL ビューのログの違いから確認することができます。
ポイント: 詳細な情報を確認したい場合は Image Info ビューや map ファイルの利用がお勧めです。簡単な確認であれば Console ビューのログが役立ちます。
【図 8】メモリー配置の変化を確認
2-5. 実行(挙動の変化を確認)
配置変更後のプログラムを実行します。Debug アイコンを押下するか、 プロジェクトの右クリックから "Debug" を実行します。
【図 9】デバッグ開始直後の状態
プログラムの動作上は、事前に変更した Hello World メッセージの違い以外に変化を感じることは難しいと思います。Run メニューの Continue (F5) もしくはより実行を再開して、メッセージの出力結果を確認してください。さらに、リセットボタンを押す事で Flash の書き換え発生の有無も確認できます。
ポイント: 予め Tera Term 等のシリアルターミナルを接続しておきます。【図 10】のように VS Code 内の SERIAL MONITOR も利用可能です。(ターミナルの設定は画像参照)
【図 10】変更後のメッセージ出力を確認
ここまでで、プログラム配置変更の確認は終了です。
3. リンカースクリプトの設定解説
今回は SDK であらかじめ準備されているリンカースクリプトファイルを差し替えるのみで、 Flash に配置されていたプログラムが RAM に配置される事を確認しました。
ここでは、差し替え前後のリンカースクリプトの差分を解説します。
確認された差分は【図 11】の通りとなり、主な差分としては text 領域の先頭が変更されております。また、Flash 配置のリンカースクリプトでは flash セクションの定義があり、FlexSPI の XIP Boot も兼ねたリンカースクリプトになっていることが分かります。
【図 11】Flash 配置と RAM 配置のリンカースクリプト差分
まとめ
今回はプログラムの配置変更とリンカースクリプトの概要について紹介しました。スクリプトの内容についても簡単に触れましたが、詳細な記述方法は GCC 付属のリンカーの仕様となるので、一般的な技術情報を調べることで対応いただけます。
次回もサンプルプロジェクトをベースに、プロジェクトのカスタマイズを行う方法を紹介予定です。