Coretex-M向けbootloaderの作成

テクニカル・ノート 160822

アーキテクチャ:

ARM

コンポーネント:

general

更新日:

2018/09/04 6:38

はじめに

本テクニカルノートでは、IAR Embedded Workbench for ARMを使用してブートローダを作成する際のガイドラインを示します。本テクニカルノートで示す推奨事項は一般的な内容がほとんどですが、サンプルプロジェクトはCortex-Mマイクロプロセッサ用(具体的にはSTMicroelectronics STM32L152VB用)です。

解説

ブートローダを作成する際、プロジェクトの設定、およびブートローダからアプリケーションへの制御の受け渡しに関していくつか注意すべき点があります。STM32L152VB用のサンプルプロジェクトを参照し、以下の注意事項に従ってください。本テクニカルノートでは、簡潔化のため、アプリケーションのライブアップデート(アプリケーションプログラミングにおけるIAP)を実施する方法については説明しません。また、ブートローダでは通信インタフェースがよく使われますが、通信インタフェースを設定する方法についても、分かりやすさを重視して本テクニカルノートでは説明しません。

一般的な注意事項

  • ブートローダ用とアプリケーション用のプロジェクトを別々に作成してください。この2つのプロジェクトは、同じワークスペースに置くことができます。プロジェクトを分けることで、ブートローダとアプリケーションとの間でコードとライブラリ関数が共有されるのを防ぐことができます。
    ワークスペース
  • フラッシュメモリのブロックサイズをチェックしてください(ブロックとは、フラッシュメモリにおける最小の消去可能単位です)。ブートローダとアプリケーションは、フラッシュブロックの境界で分ける必要があります。さもないと、そのどちらかを差し替えたときに、アプリケーションまたはブートローダの一部が消去されるおそれがあります。

  • ハードウェアの初期化は、通常、1回だけ行ってください(多くの場合、ブートローダで初期化します)。必要な場合を除き、アプリケーションがハードウェアを再度初期化しないようにしてください。

  • ブートローダからアプリケーションに制御を渡す前に、以下の処理が行われるようにしてください。
  1. アプリケーション起動時に予期せぬ割り込みが発生しないように、割り込みを無効にする
  2. ブートローダによって使用されたスタックポインタをアプリケーションに開放するため、スタックポインタを設定/リセットする
  3. ブートローダではなくアプリケーションによって割り込みが処理されるように、VTORレジスタを設定する
    サンプルコード

デバッグに関する注意事項

ブートローダとアプリケーションを同時にデバッグすることは可能ですが、例えば、どちらにもmain関数が含まれているので、注意が必要です。デバッガに2つのアプリケーションを認識させるには、プロジェクト(Project) > オプション(Options) > デバッガ(Debugger) > イメージ(Images)を選択し、他のプロジェクトのELF出力ファイルからデバッグ情報を読み込みます。

(ブートローダのmain関数とアプリケーションのmain関数の)どちらのmain関数を実行すべきかで迷わないように、デバッガの設定のページで指定位置まで実行(Run to main)オプションを無効にしてください。

 また、<module>\<function> 構文を使用して、実行するメイン関数をデバッガに正確に指定することができます。 Technical Note 45813 を参照してください。この例では、Run to: bootloader_main\main を使用できます。

ダウンロードが完了すると、デバッガは、デフォルトで__vector_tableというシンボルで指定されたアドレスから実行を開始します。ブートローダとアプリケーションを同時にデバッグすると、以下のメッセージが表示される場合があります。

正しい__vector_tableシンボルをデバッガに通知するには、ブートローダのベクタテーブルがどこにあるかを指定する必要があります。プロジェクト(Project) > オプション(Options) > デバッガ(Debugger) > 追加オプション(Extra Options)を選択し、以下のオプションを指定してください。

 --drv_vector_table_base=0x08000000

デバッグを行う際、2つのアプリケーションにあるシンボル名が競合するのを防ぐため、表示(View) > イメージ(Images)ウィンドウを使用して、現在スコープ内にあるアプリケーションを選択してください。

シングルステップのステップオーバを使用してブートローダからアプリケーションにジャンプする際、イメージ(Images)ウィンドウに現在読み込まれているデバッグ情報を必ず切り替えてください。

フラッシュの書き込みに関する注意事項

アプリケーションとブートローダをフラッシュメモリにダウンロードする方法は複数あります。ブートローダとアプリケーションは別々のプロジェクトに置かれるため、各プロジェクトからそれらを個別にダウンロードできます。一つの方法として、リンカを使用してアプリケーションのバイナリをブートローダのプロジェクトに取り込めば、アプリケーションとブートローダをフラッシュメモリに同時にダウンロードできます。この方法を使用するには、プロジェクト(Project) > オプション(Options) > リンカ(Linker) > 入力(Input)を選択します。

リンカ設定ファイルでは、アプリケーションのバイナリをフラッシュメモリに配置する設定は以下のように記述されています。

place at address mem: app_vector { readonly section .APP };

詳細はサンプルプロジェクトを参照してください。このプロジェクトは、C-SPYシミュレータドライバを使用して、または、I-jetを使用する場合はSTM32ターゲットデバイス上で、テストすることができます。

まとめ

ブートローダを作成する際、プロジェクトの構成、およびブートローダからアプリケーションへの実際のジャンプに関していくつか注意すべき点があります。本テクニカルノートは、IAR Embedded Workbench for ARMを使用してブートローダを作成する際の一般的なガイドラインとして利用していただくことを目的としています。デバッガウィンドウ、オプション、および__vector_tableシンボルに関してさらに詳しい情報を見るには、ヘルプ(Help) > C-SPYデバッグガイド(C-SPY Debugging Guide)を選択してください。例えば、アプリケーションからフラッシュメモリへの書き込みの例を見るには、ヘルプ(Help) > インフォメーションセンタ(Information Center) > サンプルプロジェクト(Example Projects)を選択し、目的のデバイスに関する説明を参照してください。

 

全ての製品名は、それぞれの所有者の商標または登録商標です。

 

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。