| [NXP マイコン初心者ガイド 2] へ | |||
| NXP マイコン初心者ガイド まとめサイト |
もくじ
- はじめに
- 1. メモリー配置の確認方法(Hello World (変更前) の配置を確認)
- 2. RAM 上にプログラムを配置するための変更手順
- 3. リンカー周りの設定解説(さらにカスタマイズするための情報)
- まとめ
はじめに
この記事では、前回の [NXP マイコン初心者ガイド 2] i.MXRT1050 を使って Hello World を Debug してみた で使用した Hello World プロジェクトのメモリー配置を変更してみます。前回のまとめで触れたように、SDK に付属するオリジナルの Hello World プロジェクトは Flash 領域にプログラムを配置する作りになっているため、デバッグ実行のたびに Flash 領域の書き換えが行われます。
今回はプロジェクト設定を変更し、RAM 上にプログラムを配置して実行する方法について解説していきます。メモリー配置の確認方法についても触れたいと思います。
-
参考資料: 詳細な情報は MCUXpresso IDE User Guide を参照ください。
1. メモリー配置の確認方法(Hello World (変更前) の配置を確認)
メモリー配置の変更を試す前に、前回使用した Hello World プロジェクトのメモリー配置を確認してみましょう。ここでは、2通りの確認方法を紹介します。
以下に紹介するどちらの方法でも構わないので、変更前の Hello World のプログラム配置を確認してみてください。プログラム用のセクション(.text)が Flash 領域『 Region: BOARD_FLASH(Address: 0x60000000~)』に配置されている事が確認できると思います。
1-1. Image Info ビューによる確認
1つ目は、MCUXpresso IDE に用意される機能でメモリー配置を確認する方法です。"Image Info" ビューを選択し、ビルド済みイメージの情報をロードすることで、メモリー配置の情報が参照可能です。以下、【図1】に Image Info ビューの使い方・手順を ①~③ に示します。
【図 1】"Image Info" ビューの使い方・手順
ポイント: "Image Info" ビューへビルド済みイメージを読み込むことで、メモリー配置や使用サイズなどの情報が参照できます。
1-2. map ファイルによる確認
もう1つは、MCUXpresso IDE に限らず一般的に使用される方法となりますが、ビルド時に生成される map ファイル(拡張子:.map)を参照する方法です。ビルド実行後、実行イメージ(.axf)と同じディレクトリーに生成されている map ファイルをクリックして開きます。
以下のように、map ファイルにはメモリー領域の定義や、プログラムの配置情報が記録されます。
【図 2】map ファイルの中身
ポイント: map ファイルが生成されない場合には、プロジェクトのプロパティーにて、リンカーのオプション設定を確認してください。
2. RAM 上にプログラムを配置するための変更手順
ここからはプログラムの配置を Flash 領域から RAM 領域へ変更する方法を紹介していきます。
2-1. オプション変更
プロジェクトのプロパティーを開いて、リンカーのオプションを編集します。【図 3】の ①~④ に記載の手順に沿ってオプションを変更してください。
【図 3】RAM 配置向けのオプション変更
2-2. ビルド
配置変更後のプログラムである事が区別できるように、ビルド実行前に Hello World のメッセージを変更しておきます。main 関数に記述されている PRINTF の引数を好きな文字列へ変更してください。
【図 4】Hello World メッセージの変更
変更が完了したら、Project メニュー、もしくは Project Explorer の右クリックメニューから ”Build Project" を実行します。
メモ: "Console" ビューに以下のようなメッセージが表示されればビルド成功です。エラーが発生する場合は原因箇所を調べて再度ビルドを行ってください。
17:24:54 Build Finished. 0 errors, 0 warnings. (took 4s.929ms)
2-3. 変更後のメモリー配置を確認&比較
ビルド完了した所で、プログラム変更前後のメモリー配置の違いを確認しておきます。先に紹介した Image Info ビュー や map ファイルの差分を比較する以外にも、ビルド実行時に出力される Console ビューのログの違いから確認することができます。
ポイント: 詳細な情報を確認したい場合は Image Info ビューや map ファイルの利用がお勧めです。簡単な確認であれば Console ビューのログが役立ちます。
【図 5】メモリー配置の変化を確認
2-4. 実行(挙動の変化を確認)
配置変更後のプログラムを実行します。Debug As メニューもしくは よりデバッグを開始してください。
【図 6】デバッグ開始直後の状態
プログラムの動作上は、事前に変更した Hello World メッセージの違い以外に変化を感じることは難しいと思います。Run メニューの Resume (F8) もしくは より実行を再開して、メッセージの出力結果を確認してください。さらに、リセットボタンを押す事で Flash の書き換え発生の有無も確認できます。
ポイント: 予め Tera Term 等のシリアルターミナルを接続しておきます。【図7】のように MCUXpresso IDE 内の Terminal ビューも利用可能です。(ターミナルの設定は画像参照)
【図 7】変更後のメッセージ出力を確認
ここまでで、プログラム配置変更の確認は終了です。
3. リンカー周りの設定解説(さらにカスタマイズするための情報)
リンカーのオプション設定の仕組みについても紹介しておきます。
リンカー設定用のチェックボックス「Link application to RAM」を有効にするのみで、 Flash に配置されていたプログラムが RAM に配置される事を確認しましたが、リンカーへの配置指定の仕組みを意識せずとも簡単に変更が行える反面、細かい配置指定を行う方法が見えません。
今回試したチェックボックスの変更がどのように作用したのかを見ておくことで、より詳細な配置指定を行う際に必要となるリンカースクリプトの概要を理解してもらえると思います。
注記: ここで紹介するリンカースクリプトやオプションメニューは MCUXpresso IDE 標準の GCC ARM Embedded ツールチェーンを使用した場合を前提とした内容となります。
3-1. 自動生成されるリンカースクリプトの構成
リンカースクリプトは、ビルド時に実行ファイル(.axf)や map ファイル(.map)が生成されるディレクトリー(Release もしくは Debug 直下)に自動生成されています。
自動生成されるスクリプトは以下の3つのファイルで構成されます。
- evkbimxrt1050_hello_world_Debug.ld ... プログラムを構成するセクションの配置指定を含む
- evkbimxrt1050_hello_world_Debug_library.ld ... ライブラリーのオブジェクト指定を含む
- evkbimxrt1050_hello_world_Debug_memory.ld ... メモリー領域の定義を含む
以下、リンカースクリプトのファイル構成および内容を示します。
【図 8】自動生成されるリンカースクリプトの構成
3-2. RAM 実行 オプション変更の効果の解説(リンカースクリプトの差分)
今回試したオプション変更(チェックボックス「Link application to RAM」を有効化)を対象に、変更前後のリンカースクリプトを比較した結果を比較してみました。スクリプトを構成する3つのファイルを全て比較しましたが、差分が確認できたのはメインスクリプトのみです。
確認された差分と、その解説を【図9】と【図10】に示します。
【図 9】Flash 配置と RAM 配置のリンカースクリプト差分(1/2)
ヒント: IVT (Image Vector Table) の内容については i.MXRT デバイスのリファレンス・マニュアルを参照してください。
【図 10】Flash 配置と RAM 配置のリンカースクリプト差分(2/2)
3-3. 自作のリンカースクリプトを使用する場合のオプション
リンカースクリプトを自分で編集する場合には、以下のオプション変更を忘れずに行ってください。変更前の設定では、ビルドを実行するたびにスクリプトが自動生成(上書き更新)されるため直接の編集は行えません。
【図 11】スクリプトを直接編集する場合のオプション変更
まとめ
今回はプログラムの配置変更とリンカースクリプトの概要について紹介しました。スクリプトの内容についても簡単に触れましたが、詳細な記述方法は GCC 付属のリンカーの仕様となるので、一般的な技術情報を調べることで対応いただけます。
次回もサンプルプロジェクトをベースに、プロジェクトのカスタマイズを行う方法を紹介予定です。
| [NXP マイコン初心者ガイド 2] へ | |||
| NXP マイコン初心者ガイド まとめサイト |