お恥ずかしいことにLPC4337を使ったボードをよく開発しているにもかかわらず、マルチコア開発はしたことがありませんでした。
ただ最近になってマルチコアの需要がでてきた(とはいえ要求スペック的にはシングル処理でも間に合ってはいるんですが・・・)のでマルチコア開発の一歩としてサンプルプロジェクトをビルド+書き込みしてみます。
環境
前提としては
- 使用するマイコンはLPC4337で、サンプルなのでボードはLPCXpresso4337を使用する
- 上記につき、デバッガプローブはボード上にあるLPC-Link2相当のものをそのまま利用する
- 開発IDEはMCUXpresso IDE v11.1.1
という感じです。
LPC-Link2を使ってもいいんですが、まぁ最初は軽い気持ちでやりたいので。
プロジェクトの作成
LPCOpenからインポート
NXP製のマイコンをいじるならいまだとLPCOpenを使って開発することが多いと思います。
ここでは郷に従ってLPCOpenからライブラリとサンプルプロジェクトをインポートします。
MCUXpressoのおそらく左下にある「Quickstart Panel」から「Import projetc(s) from file system...」を選択します。
出てくるウィンドウの「Project archive (zip)」から「Browse」でLPCOpenのzipファイルを選択します。
今回はマルチコアのLチカのみ利用するので、LPC43xxのチップ用のプロジェクト(lpc_chip_43xx(m0))とLPCXpressoボード情報のプロジェクト(lpc_board_nxp_lpcxpresso_4337(m0))とマルチコアのサンプルプロジェクト(multicore_mc_sa_blinky_m4(0app))の6プロジェクトをインポートします。
「Finish」を選択すればIDEに戻り、Project Explorerにプロジェクトが6つ増えていると思います。
プロジェクトの設定を調整する
チップとボードのプロジェクトには手直しが必要ありませんが、サンプルプロジェクトはそのままではビルドが通らないのでマルチコアの設定を行っていきます。
最初にCortex-M0側から設定します。
Cortex-M0側のプロジェクト(Slave)
メモリ設定
こちらから設定するのは、Cortex-M4のプロジェクトでこちらのビルド済みオブジェクトファイルを指定する必要があるためです。
まずはプロジェクト設定を開きます。
「C/C++ Build」→「MCU settings」の箇所を修正します。
一見「Cortex-M0」などを選択されてるのでよさそうですが、メモリ設定が適応されていないようです。
設定をインポートするため、下の方にある「Import」でメモリ設定をインポートします。
インポートするファイルはデフォルトの設定でIDEをインストールしている場合は「C:\nxp\MCUXpressoIDE_11.1.1_3241\ide\Wizards\MemConfigs\NXP」にある「LPC43x7-M0_BankB.xml」を読み込みます。
(MCUXpressoIDE_11.1.1_3241の箇所はバージョン毎に違います。)
メモリの設定が写真の様に変わっていればたぶん大丈夫です。(Cortex-M0のプログラム領域はLPC43x7では0x1b000000からなのでよさそう)
「Apply」を選択して適応しておきます。
MCU Linkerの設定
あとはMCU Linkerの設定だけしておきます。
同じ様にプロジェクトの設定で「C/C++ Build」→「Settings」→「MCU Linker」→「Multicore」を参照します。
デフォルトでは「None」になっていると思いますが、「M0APP」にしておきます。
設定は以上なので「Apply and Close」で設定ウィンドウを閉じておきます。
以上の設定を行い、プロジェクトのビルドをしておきます。
プロジェクトを右クリックし、「Build Project」を選択します。
関連プロジェクトは勝手にビルドされると思います。
問題なければCortex-M0の方のプログラムのオブジェクトが「Debug」下に生成されているかと思います。
ここまで出来ればCortex-M0の方は終わりです。
Cortex-M4側のプロジェクト(Master)
基本的な動作としてはCortex-M4側のプログラムが起動し、Cortex-M0を起動するという流れなので、こちらのプロジェクトがメインになります。
メモリ設定
基本的にデフォルトの設定で問題ありません。
念のためCortex-M0に割り当てるFlashの領域が0x1b000000になってるかぐらいはチェックしましょう。
該当箇所は先ほどと同様にプロジェクトの設定を開いて「C/C++ Build」→「MCU settings」です。
MCU Linkerの設定
こちらも上記と同様に「C/C++ Build」→「Settings」→「MCU Linker」→「Multicore」を参照します。
先ほどとはちょっと表示が違います。
この「M0APP」にチェックを付け、残り二項目も設定します。
設定できたら「Apply and Close」で設定を適応させてウィンドウを閉じます。
Cortex-M4側のプロジェクトのビルド
プロジェクトのビルドはこちらから行います。
上記までの設定をしていれば、通常のビルドで問題無い筈です。プロジェクトを右クリックし、「Build Project」しましょう。
M0APP execute address differs from address provided in source image
と怒られる場合はCortex-M0側のメモリ設定ができていない可能性が高いです。
問題無くビルドができれば実際にデバッガを起動して書き込んでみます。
簡単な動作なのでGUI Flash Toolを使って書き込みだけするのでも良いと思います。
接続しているデバッガが出てくるので、該当するデバッガを選択してOKします。
とりあえずマルチコアデバッグもしたいのでJTAGがいいです。
以上でM4の方のデバッガが起動し、書き込みまで完了しています。
ここでM0のほうもマルチコアデバッグする場合は、デフォルトのデバッグ設定に一箇所設定を追加します。
Cortex-M0側のプロジェクトを右クリックして「Debug Configurations」を開きます。
開かれた時にはM4のデバッグ設定しかないと思いますので、「C/C++ (NXP Semiconductors) MCU Application」をダブルクリックします。
ダブルクリックするとプロジェクト名でデバッグ設定が新しく追加されます。
このままではデバッグできないので、「Search Project」から対象ファイルを選択します。
更に、「LinkServer Debugger」のタブで「LinkServer Options」の「Debug Cnnection」にある「Attach only」にチェックを付けておきます。
まず最初にCortex-M4側のデバッグを開始してから、デバッグを停止せずにCortex-M0のデバッグ(上記で設定したやつ)を開始します。
基本的にはメニューバーの虫ボタンをクリックすればデバッグできると思いますが、Cortex-M0側のデバッグの初回は表示されてないかもしれないので再度「Debug Condiguration」を開いてみてください。たぶん先ほど設定したものがありますので、そちらを選択して「Debug」すれば大丈夫だと思います。
Debugのウィンドウに2個スレッドが表示されていればマルチコアデバッグ出来てると思います。