RX65N Cloud KitのFreeRTOS OTA(Over-The-Air)サンプルプログラムをデバッグする

# 環境準備
Renesas RX65N Cloud KitでFreeRTOS OTA(Over-The-Air)サンプルプログラムをデバッグする方法を確認してみました。

* FreeRTOS OTAサンプルプログラムを動作させるためにはルネサス公式サイトの以下のアプリケーションノートが参考になります。
* しかし、以下のアプリケーションノートはRenesas Flash ProgrammerでOTAサンプルプログラムをフラッシュメモリに書き込んで、プログラムを起動させるだけなので、OTAサンプルプログラムをe<sup>2</sup> studioを使用してプログラムをデバッグすることができません。
* e<sup>2</sup> studioの機能でブートローダとファームウェアのプログラムを同時にRenesas RX65N Cloud Kitにダウンロードする機能もありますが、ブートローダがファームウェアを起動するために必要な署名検証データはRenesas Secure Flash Programmerを使用して付加されるものなので、同じくデバッグすることはできません (署名検証でFailします)。
* そのため、今回は以下のアプリケーションノートの手順を変更してOTAサンプルプログラムをデバッグする方法を検討しました。

[RX ファミリ RX65N における Amazon Web Services を利用したFreeRTOS OTA の実現方法](https://www.renesas.com/jp/ja/document/apn/rx-family-how-implement-freertos-ota-using-amazon-web-services-rx65n-rev101?language=ja)
[Renesas ルネサス MCU におけるファームウェアアップデートの設計方針](https://www.renesas.com/us/ja/document/apn/renesas-mcu-firmware-update-design-policy-rev100)

準備した環境は以下の通りです。
1. Renesas RX65N Cloud Kit (評価ボード)
2. e<sup>2</sup> studio 2021-07 (統合開発環境)
3. GCC for Renesas 8.3.0.202004-GNURX Windows (RXマイコン用コンパイラ)
4. Win64 OpenSSL v3.0.1 (署名検証に必要)
5. Renesas Secure Flash Programmer = mot-file-converter v1.0.1 (署名検証データの付加に必要) 
6. RX版 FreeRTOS v202002.00-rx-1.0.5

# ファームウェアの初期バージョンを作成する
下記アプリケーションノートの**Page.26**まで進めてRenesas Secure Flash Programmerを使用して、**userprog.mot**を作成します。
この時点で**userprog.mot**に署名検証データが付加されます。

[RX ファミリ RX65N における Amazon Web Services を利用したFreeRTOS OTA の実現方法](https://www.renesas.com/jp/ja/document/apn/rx-family-how-implement-freertos-ota-using-amazon-web-services-rx65n-rev101?language=ja)

アプリケーションノートはCC-RXコンパイラで説明されていますが、GCCコンパイラでも手順はほぼ同じです。
セクション設定の手順のみ異なるので、linker_script.ldを開き、linker_script.ldタブで以下のように設定します。

![image_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/626b5a8b-d2df-e981-880b-12895c86748b.png)

# ファームウェアの初期バージョンをデバッグ可能な形式に変換する
ここからアプリケーションノートとは手順が異なります。
作成した**userprog.mot**をe<sup>2</sup> studioでデバッグ可能なファイル形式に変換します。
コマンドプロンプトを起動して、e<sup>2</sup> studioから出力されたデバッグサポート用のファイルが格納されているディレクトリに移動します。
通常であれば、``C:\Users\%Username%\.eclipse\com.renesas.platform_xxxxxxxxxx\Utilities\ccrx``に格納されています。

:::note info
com.renesas.platform_xxxxxxxxxxのxxxxxxxxxはe<sup>2</sup> studioのバージョンに依存すると思います。
:::

移動したディレクトリに**userprog.mot**をコピーしておき、エンディアンによって以下のコマンドを実行します。

```bash:リトルエンディアンの場合
rx-elf-objcopy.exe userprog.mot -O elf32-rx-le -I srec userprog.elf
```

```bash:ビッグエンディアンの場合
rx-elf-objcopy.exe userprog.mot -O elf32-rx-be -I srec userprog.elf
```

もしCC-RXコンパイラを使用している場合は、追加で以下のコマンドを実行します。

```bash:CC-RXコンパイラを使用している場合
renesas_cc_converter.exe userprog.elf userprog.x
```

# e<sup>2</sup> studioを使用してデバッグを開始する
e<sup>2</sup> studioの「デバッグ構成」からboot_loader HardwareDebugを選択して、以下のように設定を変更します。

* 「メイン」タブで「C/C++アプリケーション」の参照を押して「userprog.elf」を指定する。
![image_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/f969e2c2-15a3-06b3-f604-bd098348ce6f.png)

:::note info
CC-RXコンパイラを使用している場合は、「userprog.x」を指定してください。
:::

* 「Debugger」タブの「Connection Setting」で「起動バンク」を「バンク0」に設定する。
* 「デバッグツール設定」で「内蔵プログラムROMを書き換えるプログラムをデバッグする」を「はい」に設定する。
* 「Startup」タブを開いて「イメージとシンボルをロード」を以下のように変更する。
    * 「userprog.elf」の「ロード・タイプ」を「イメージのみ」に変更する。
    * 「追加」から「aws_demos.elf」を追加して「ロード・タイプ」を「シンボルのみ」に変更する。
    * 「追加」から「boot_loader.elf」を追加して「ロード・タイプ」を「シンボルのみ」に変更する。

![image_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/15307756-cfe2-3875-d5a6-a974a5aa3c1c.png)

:::note info
CC-RXコンパイラを使用している場合は、それぞれ.xファイルを指定してください。
:::

デバッグボタンを押してデバッグを開始してください。
ブートローダの「boot_loader.c」のファームウェアを起動する処理でブレークポイントを貼って、プログラムを実行させると設定したブレークポイントでプログラムが停止することを確認します。
これでブートローダが署名検証データを使用して、ファームウェアの署名検証をPASSされたことが確認できます。

![image_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/ac67a880-f439-3794-333c-1415969a1b82.png)

次にファームウェアの「main.c」内のmain関数にブレークポイントを貼って、プログラムを実行させると設定したブレークポイントでプログラムが停止することを確認します。
これでブートローダが正常にファームウェアを起動したことがわかります。

![image_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/b9e6d749-8593-ac66-20fe-60e175a74fd2.png)

# ファームウェア更新後の更新ファームウェアをデバッグする
最後にアプリケーションノートの**Page.32以降**の作業を進めて、ファームウェア更新後の更新ファームウェアをデバッグします。
ブートローダの「boot_loader.c」のファームウェアを起動する処理でブレークポイントを貼っておきます。

![image_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/ac67a880-f439-3794-333c-1415969a1b82.png)

ファームウェア更新後に設定したブレークポイントでプログラムが停止することを確認したら、下記GDBコマンドを実行します。
GDBコマンドの実行はe<sup>2</sup> studio下部の「Debugger Console」で実施します。
本GDBコマンドを実行することで、更新ファームウェアのシンボル情報がロードされます。

```bash:実行するGDBコマンド(更新ファームウェアの.elfファイルがTempフォルダ内にある場合)
symbol-file C:\/Temp\/aws_demos.elf -readnow
```

![image_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/f8baa844-91c0-e12c-8760-917b3a2893dc.png)

:::note info
CC-RXコンパイラを使用している場合は、.xファイルを指定してください。
:::

これでプログラムを再開させると更新ファームウェアのソースコードにプログラムカウンタが停止するはずです。

# さいごに
今回はルネサスエレクトロニクス社が提供しているOTAサンプルプログラムをデバッグする方法について検討しました。
RXファミリのFreeRTOSにOTA機能を実装したい場合に参考になると思います。