RZ/G2Lでマルチコアを体験(4)2023/04/10
サブコアでプログラム実行
前回はe2 studioのインストールからサンプルプログラムをビルドするところまで説明しました。今回はビルドしたファイルをRZ/G2Lのボードにダウンロードして実行確認を行います。ボードにプログラムをダウンロードするにはデバッガが必要ですが、ここではコンピューテックスのPALMiCE4を使用します。
ボードとPALMiCE4の接続
RZ/G2L Evaluation Board KitとPALMiCE4を接続します。PALMiCE4のケーブルをボードに用意されているJTAGコネクタに接続します。すべて接続するとこんな感じになります。

ボードに接続されているUSBケーブルは、白い方が電源で、もう一つの黒い方がシリアルターミナルです。
CSIDEを起動する
次にデバッガソフトCSIDEを起動します。ここからはCSIDEがインストールされている前提で話を進めますのでご了承ください。詳しくは以下のURLより「RZ/G2L Evaluation Board Kitセットアップ説明書」がダウンロードできますので、そちらも合わせてご覧ください。
https://www.computex.co.jp/products/palmice4/p4_check_board.htm
CSIDEを起動し、[設定]メニューの[ターゲットシステムの設定]を選択すると、CPUの選択画面が表示されます。ここで、メーカ名は[Renesas]、CPUは[RZ/G2L]を選択し、[起動する]ボタンを押します。

次にターゲットシステムの設定ウィンドウが表示されますので、[更新]ボタンを押してください。

これで起動しました。起動後はすべてのコアが実行状態になっています。CSIDEではCortex-A55の2つがCore0、Core1、Cortex-M33はCore2という名前に割り当てられます。画面の左下で風車のようにぐるぐる回っているのは各コアの実行状態を表しています。
この状態ではまだデバッグできませんので、CSIDEがコアの制御を取得するためのアタッチという操作を行います。今回はCortex-M33がデバッグ対象ですので、以下のメニューからアタッチします。

アタッチした後はデバッグ対象コアを選択します。画面下のバーの3つ目をクリックするとCore2がデバッグ対象に切り替わります。

この時、Cortex-A55×2は何をしているのか疑問に思われるかもしれませんが、彼らはフリーラン状態ですので、前回作ったSDカードのLinuxを動かしていると思われます。
プログラムのダウンロード
では、Cortex-M33にプログラムをダウンロードします。ファイルロードのボタンを押してDebugのフォルダに移動し、「test.elf」を選択します。

プロジェクトに保存する場合は、[プロジェクトから起動したときにロードする]のチェックは外しておきます。
次に[詳細設定]ボタンを押してデバッグ情報の管理をCore2のみにチェックします。

OKボタンを押せば設定完了です。
ダウンロードボタンを押してファイルをダウンロードします。

ロード完了後、コードウィンドウとコマンドウィンドウを開いた状態です。

ここでコマンドウィンドウに以下のコマンドを入力します。
@SetSYS_CM33_CFG __Secure_Vectors,__Vectors
これはSYS_CM33_CFG2とSYS_CM33_CFG3 のレジスタの設定を行います。このレジスタはベクタのアドレスを設定するもので、セキュアベクタと非セキュアベクタの2つを設定する必要があります。__Secure_Vectorsと__Vectorsはプログラム側で用意したセキュアと非セキュアのベクタ配列です。この2つを@SetSYS_CM33_CFGコマンドに渡すことで、ベクタのアドレスが設定されます。
ここまでの手順は「RZ/G2L Evaluation Board Kitセットアップ説明書」に書かれている内容を手動でやってみたものです。説明書通りに設定すれば、ツールバーの再ロードボタンをクリックするだけの操作にまで自動化できます。
プログラムの実行確認
とりあえず、main関数まで実行できることを確認します。Ctrl+uを押して、「main」と入力すればmain関数まで実行して停止します。

ここからhal_entry関数が呼ばれてますので、トレース実行して確認してみましょう。

ざっと見たところ割込みハンドラを登録しているみたいです。おそらくタイマ割り込みでLチカを実現しているのでしょう。ではその先のタイマ割込みハンドラ「timer_isr」を見てみましょう。先頭にブレークポイントを設定するとすぐに止まりますので、ステップ実行で数行進めます。

なるほど、R_BSP_PinWrite関数でLEDポートに出力を反転させて点滅をおこなっているようです。それでは、実行させてLチカを確認してみましょう。ツールバーの実行ボタンを押します。

ん・・・変化しません。そもそも、どのLED?
Getting Startedマニュアルの「4.2 What Does Blinky Do?」を確認してみますと、なんと「注意:SRMAC EVKボードにはLEDがありません。」と書かれています。Lチカがやりたければ拡張LEDボードが必要だそうです。こんな高輝度のLEDが搭載されているのにLチカできないとは・・・。
とりあえず今回の目的はサブコアでプログラムが実行できることですので、目的は達成されたということでお茶を濁しておきます。