Amazon FreeRTOS Qualification Program - renesas/amazon-freertos GitHub Wiki

はじめに

  • 本稿ではAmazon FreeRTOSのテストを実行するために必要な情報をまとめます。
  • 以降説明では「ですます調」でなくなります。
  • 本ページはRX65N RSK環境について説明します
    • 他に認証OKになった、RX65N Cloud Kitの情報は別ページに載せています
  • RX65N RSK はルネサス環境で唯一Amazon FreeRTOSのmainブランチに登録されたチャンピオンケースです
  • RX65N RSK 以外はルネサス側のフォークにてコードを管理しています

メモを書いている人

認証取得済みボードリスト

RX65N RSKのハードウェア環境

準備するもの

  1. RX65N RSK (2MB) + 電源ACアダプタ
  2. インターネット接続可能なルータ
  3. Windows PC (RX MCUsの開発環境一式が入っていること(e2 studio/CC-RX/Renesas Flash Programmer))
  4. Ethernet HUB
  5. LANケーブル × 3本

接続方法

RX65N RSK (2MB) ---+---Ethernet HUB---インターネット接続可能なルータ
 |(*)              |
PC-----------------+
 |(ACアダプタ)
電源

(*)RX65N RSK (2MB)とPCは別途以下2接続が成されていること。
・RX65N RSK (2MB)のE1/E2 Liteコネクタ---E1/E2 Liteエミュレータ---PC(USB)
・RX65N RSK (2MB)のG1CUSBコネクタ---PC(USB)

ソフトウェア環境

RX65N RSK (2MB)

ソフトウェア環境@Windows PC

  • Amazon Web Services の doc サイトから、AWS IoT Device Tester for FreeRTOS のサポートされているバージョン を入手
    • 動作確認済みのバージョン: IDT v4.0.3 with test suite FRQ_1.5.0 for Windows ★日本語版ページに掲載のバージョンは少し古い場合がある。最新版を使いたい場合は英語版ページから入手すべし
      • Linux用、macOS用、Windows用と3個並んでいる。Windows用で動作確認を行った。
        • IDT for Amazon FreeRTOS: Windows
          • IDT = IoT Device Tester (以下『デバイステスタ』と呼称)
  • AWS CLI を入手しインストール
  • Java
    • e2 studio でJavaランタイムを32bit/64bit両方抱えていて適切な方が呼ばれるので追加インストール要らないが、もしデバイステスタ実行中にエラーが出る場合は、PCにインストールされている Java を32bit版にすれば直る可能性あり。(調査中)
  • python 3.8.5
  • e2 studio 7.8 ★旧バージョンであり要注意★
    • 2020-07だとヘッドレスビルドの仕様が変わっている。
      • -application org.eclipse.cdt.managedbuilder.core.headlessbuild -> -application org.eclipse.ease.listEngines ★要調査 -> ルネサス内部的には対策発見済
  • CC-RX V3.01 を使用すること ★旧バージョンであり要注意★
  • Renesas Flash Programmer 3.06.01

デバイステスタ実行手順

  1. デバイステスタをダウンロードし解凍。解凍後のフォルダをCドライブ直下にコピーする
    • C:\idt
      • このフォルダを「デバイステスタのルートフォルダ」とする
      • もしこのフォルダを変更したい場合は、デバイステスタのファイル群を全文"idt"でgrep検索し、パスを書き換えること
  2. gitでAmazon FreeRTOSリポジトリをクローンする。クローン後のフォルダをデバイステスタのルートフォルダにコピーする
    • C:\idt\amazon-freertos
  3. gitでAmazon FreeRTOS Toolsリポジトリをクローンする。クローン後のフォルダをデバイステスタのルートフォルダにコピーする
    • C:\idt\Amazon-FreeRTOS-Tools
  4. opensslでテスト用の鍵を作る
  5. ファームウェア検証にECDSA+SHA256を使用するため、ブートローダに署名検証用の公開鍵=secp256r1.publickeyを仕込む
    • 以下は仕込む先のパス
    • 以下は実際に仕込むソースコード例。\ や " の入れ方に注意。鍵データ自体は自分で生成したものに置き換えること。
#define CODE_SIGNENR_PUBLIC_KEY_PEM \
"-----BEGIN PUBLIC KEY-----"\
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWiAlaCQGEgIKoP+qk7Uqc/ME/hjw"\
"amq1v/z/LWx15CKig59Pd3+ar2RFOlMMOhIfkYgS+Ha7tH+w0ggnKDrUug=="\
"-----END PUBLIC KEY-----"\
  1. 以下ブートローダのプロジェクトをe2 studioでビルドする
    • C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\boot_loader
      • ビルド後、\HardwareDebug\boot_loader.mot が存在することを確認
  2. e2 studioを閉じておく
  3. Windows環境変数に以下を追加する
    • AWS_ACCESS_KEY_ID
      • AWSのアクセスキーID:AKIARLZC6.................XG のような文字列
    • AWS_SECRET_ACCESS_KEY
      • AWSのシークレットアクセスキー:U6FyF/...................GxJw のような文字列
    • AWSのアクセスキーIDとシークレットアクセスキーはAWS IAMにてユーザ毎に作成可能
      • 前提条件: AWSルートアカウントを所有していること、AWS IAMにてアクセスキーIDとシークレットアクセスキーを生成済であること
  4. デバイステスタのconfigsフォルダのコンフィグファイル例例を参考に更新する
    • C:\idt\configs\config.json
  5. デバイステスタのconfigsフォルダのデバイスファイル例を参考に更新する
    • C:\idt\configs\device.json
  6. デバイステスタのconfigsフォルダのユーザデータ例を参考に更新する
    • C:\idt\configs\userdata.json
  7. デバイステスタのconfigs\script_templatesフォルダのビルドファイル例を参考に更新する
  8. デバイステスタのconfigs\script_templatesフォルダのフラッシュファイル例を参考に更新する
  9. コマンドプロンプトで"c:\idt\bin"に移動し以下のように実行する
■テスト全件実行する場合
$ devicetester_win_x86-64.exe run-suite --userdata userdata.json
■OTAテストだけ実行する場合
$ devicetester_win_x86-64.exe run-suite --userdata userdata.json --group-id OTADataplaneMQTT
  • デバイステスタのresultsフォルダにテスト結果が記録されていく
    • \results\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx\logs\test_manager.log の最後に全テストの結果のサマリが書き込まれる
      • Amazon FreeRTOS 202012.00 の状態では以下ログにあるテストFailedの2件「OTATestTwoUpdatesCancelFirst」「OTATestUnsignedImage」が不安定のようだ。エラーになったりならなかったりするのでAWS社に確認中。
========== Test Summary ==========
Execution Time: 	1h37m36s
Tests Completed: 	132
Tests Passed: 		128
Tests Failed: 		3
Tests Skipped: 		1
----------------------------------
Test Groups:
    FullPKCS11_ECC: 		PASSED
    FullSecureSockets: 		PASSED
    FullPKCS11_Core: 		PASSED
    FullMQTT: 			PASSED
    FreeRTOSVersion: 		PASSED
    FreeRTOSIntegrity: 		FAILED
    FullTLS: 			PASSED
Optional Test Groups:
    OTACore: 			PASSED
    OTADataplaneMQTT: 		FAILED
----------------------------------
Failed Tests:
    Group Name: FreeRTOSIntegrity
        Test Name: FreeRTOSSourceIntegrity
            Reason: Following files are modified : C:\idt\amazon-freertos\tests\common\aws_test_runner.c, C:\idt\amazon-freertos\tests\include\aws_test_tcp.h, C:\idt\amazon-freertos\tests\common\aws_test_framework.c, C:\idt\amazon-freertos\tests\include\aws_clientcredential.h, C:\idt\amazon-freertos\tests\include\aws_clientcredential_keys.h, C:\idt\amazon-freertos\libraries\freertos_plus\standard\tls\test\iot_test_tls.h,  

If you are having trouble with the FreeRTOSIntegrity check, please visit our troubleshooting page here: https://docs.aws.amazon.com/freertos/latest/userguide/dt-afr-troublshooting.html
    Group Name: OTADataplaneMQTT
        Test Name: OTATestTwoUpdatesCancelFirst
            Reason: Failed to run test with error: OTA job finished before it could be canceled.: Please refer to C:\idt\results\da79e4dd-c485-11eb-9096-1c872c605805\logs\OTADataplaneMQTT__OTATestTwoUpdatesCancelFirst.log for more information. 
        Test Name: OTATestUnsignedImage
            Reason: Failed to run test with error: ResourceNotFoundException: Job execution for thing idt-2593874503625632109 cannot be found within job AFR_OTA-idt-5033170816659051645.: Please refer to C:\idt\results\da79e4dd-c485-11eb-9096-1c872c605805\logs\OTADataplaneMQTT__OTATestUnsignedImage.log for more information. 
----------------------------------
Skipped Tests:
    Group Name: OTADataplaneMQTT
        Test Name: OTATestIncorrectWiFiPassword
            Reason: OTAE2EIncorrectWiFiPassword test is only applicable for WiFi enabled boards
----------------------------------
Path to AWS IoT Device Tester Report: C:\idt\results\da79e4dd-c485-11eb-9096-1c872c605805\awsiotdevicetester_report.xml
Path to Test Execution Logs: C:\idt\results\da79e4dd-c485-11eb-9096-1c872c605805\logs
Path to Aggregated JUnit Report: C:\idt\results\da79e4dd-c485-11eb-9096-1c872c605805\FRQ_Report.xml
==================================

デバイステスタ実行時の注意事項

RX65N RSK

  • build.bat から呼び出されるヘッドレスビルド実行時にmakeのパスが通らずエラーになる場合はmake.exeの存在するe2 studioインストールフォルダのUtilitiesフォルダを環境変数PATHに登録すること

config.json の例

  • "awsRegion" を使用しているリージョンに変更
{
  "log": {
    "location": "../logs/"
  },
  "configFiles": {
    "root": "../configs",
    "device": "../configs/device.json"
  },
  "testPath": "../tests/",
  "reportPath": "../results/",
  "certificatePath": "../certificates/",
  "awsRegion": "ap-northeast-1",
  "auth": {
    "method": "environment"
  }
}

device.json の例

  • "serialPort"は使用しているPCで認識しているCOMポートに変更する。(COMポートの先にはRX65N RSKのG1CUSBポートが接続されていること)
[
  {
    "id": "<renesas-pool-id-1>",
    "sku": "<RX65N Starter Kit>",
    "features": [
      {
        "name": "WIFI",
        "value": "No"
      },
      {
        "name": "Cellular",
        "value": "No"
      },
      {
        "name": "OTA",
        "value": "Yes",
        "configs": [
          {
            "name": "OTADataPlaneProtocol",
            "value": "MQTT"
          }
        ]
      },
      {
        "name": "BLE",
        "value": "No"
      },
      {
        "name": "TCP/IP",
        "value": "On-chip"
      },
      {
        "name": "TLS",
        "value": "Yes"
      },
      {
        "name": "PKCS11",
        "value": "ECC"
      },
      {
        "name": "KeyProvisioning",
        "value": "Import"
      }
    ],
    "devices": [
      {
        "id": "<renesas-pool-id-1>>",
        "connectivity": {
          "protocol": "uart",
          "serialPort": "COM4"
        },
        "identifiers": [
          {
            "name": "serialNo",
            "value": "<serialNo-value>"
          }
        ]
      }
    ]
  }
]

userdata.json の例

  • "clientWifiConfig", "testWifiConfig" は RX65N RSK(Ether)環境において設定不要(だがとりあえず以下のように指定だけはしておく)
  • "awsSignerCertificateArn"はブートローダに仕込んだ公開鍵をAWS Certification Managerに登録したものを指定
  • "awsUntrustedSignerCertificateArn"はブートローダに仕込んだ公開鍵をAWS Certification Managerに登録したもの以外を指定
{
  "sourcePath": "C:/idt/amazon-freertos",
  "vendorPath": "C:/idt/amazon-freertos/vendors/renesas/boards/rx65n-rsk",
  "buildTool": {
    "name": "e2studio",
    "version": "7.8",
    "command": [
      "C:/idt/configs/script_templates/build.bat {{enableTests}}"
    ]
  },
  "flashTool": {
    "name": "RFPV3",
    "version": "v3.06",
    "command": [
      "C:/idt/configs/script_templates/flash.bat {{buildImageName}}"
    ],
    "buildImageInfo": {
      "testsImageName": "test",
      "demosImageName": "demo"
    }
  },
  "clientWifiConfig": {
    "wifiSSID": "xxxxxx",
    "wifiPassword": "xxxxxx",
    "wifiSecurityType": "eWiFiSecurityWPA2"
  },
  "testWifiConfig": {
    "wifiSSID": "xxxxxx",
    "wifiPassword": "xxxxxx",
    "wifiSecurityType": "eWiFiSecurityWPA2"
  },
  "echoServerCertificateConfiguration": {
    "certificateGenerationMethod": "Automatic",
    "customPath": {
      "clientCertificatePath":"<C:/path/to/clientCertificate>",
      "clientPrivateKeyPath": "<C:/path/to/clientPrivateKey>",
      "serverCertificatePath":"<C:/path/to/serverCertificate>",
      "serverPrivateKeyPath": "<C:/path/to/serverPrivateKey>"
    },
    "eccCurveFormat": "P256"
  },
  "echoServerConfiguration": {
    "securePortForSecureSocket": 33333,
    "insecurePortForSecureSocket": 33334,
    "insecurePortForWiFi": 33335
  },
  "otaConfiguration": {
    "otaDemoConfigFilePath": "C:/devicetester_afreertos_win/amazon-freertos/vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/aws_demo_config.h",
    "otaFirmwareFilePath": "C:/idt/amazon-freertos/projects/renesas/rx65n-rsk/e2studio/aws_demos/HardwareDebug/userprog.rsu",
    "deviceFirmwareFileName": "userprog.rsu",
    "codeSigningConfiguration": {
      "signingMethod": "AWS",
      "signerHashingAlgorithm": "SHA256",
      "signerSigningAlgorithm": "ECDSA",
      "signerCertificate": "arn:aws:acm:ap-northeast-1:094025684215:certificate/19e68e65-2a0e-4c47-a9ad-09b9903d458d",
      "signerCertificateFileName": "secp256r1.crt",
      "compileSignerCertificate": true,
      "signerPlatform": "AmazonFreeRTOS-Default",
      "untrustedSignerCertificate": "arn:aws:acm:ap-northeast-1:094025684215:certificate/f7bf6fc9-4f70-4c5c-a09e-724f81c677cb"
    }
  }
}

build.bat の例

  • <<C:\Renesas\e2_studio_v780\eclipse>> は使用している e2 studioのパスで置き換える
  • <<C:\idt\sample_keys\secp256r1.privatekey>> は作成したテスト用鍵が存在するパスで置き換える
@echo off
set message =  Hello Build
IF %1 == 0 GOTO demo_build
IF %1 == 1 GOTO test_build

echo %message%
GOTO END

:demo_build
python C:\idt\Amazon-FreeRTOS-Tools\section_OTA\OTAsection.py --path-aws "C:\idt" --path-project "rx65n-rsk"
C:\Renesas\e2_studio_v780\eclipse\eclipsec.exe -nosplash -debug -consolelog -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data C:\idt\idt\builddemos -import C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos -cleanBuild all
"C:\idt\Amazon-FreeRTOS-Tools\Renesas Secure Flash Programmer.exe" CUI Initial "RX65N(ROM 2MB)/Secure Bootloader=256KB" "sig-sha256-ecdsa" 1 "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\boot_loader\HardwareDebug\boot_loader.mot" "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\aws_demos.mot" "C:\idt\sample_keys\secp256r1.privatekey" "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\userprog.mot"
"C:\idt\Amazon-FreeRTOS-Tools\Renesas Secure Flash Programmer.exe" CUI Update "RX65N(ROM 2MB)/Secure Bootloader=256KB" "sig-sha256-ecdsa" 1 "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\aws_demos.mot" "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\userprog.rsu"
GOTO END

:test_build
C:\Renesas\e2_studio_v780\eclipse\eclipsec.exe -nosplash -debug -consolelog -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data C:\idt\buildtest -import C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests -cleanBuild all
copy /y C:\idt\amazon-freertos\demos\include\aws_clientcredential_keys.h C:\idt\amazon-freertos\tests\include\aws_clientcredential_keys.h
GOTO END

:END
  • 注意事項
    • デバイステスタに同梱される同名ファイルの改行コードがLFであるのに対し、Windows上で実行する際は改行コード=CRLFである必要があることに注意

flash.bat の例

  • <<C:\Renesas\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06>> は使用している はRenesas Flash Programmerのパスで置き換える
  • GitHubに登録されているプロジェクトはE2 Lite設定なので、E1やE2など他のエミュレータ使用者はプロジェクトファイルを開いてデバッガ設定変更が必要
@echo off
set message =  Hello Flash
IF %1== demo GOTO demo_flash
IF %1 == test GOTO test_flash

GOTO END

:demo_flash
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\erase_from_bank1\erase.rpj" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\test.log"
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\flash_project.rpj" /file "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\userprog.mot" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\test.log"
GOTO END

:test_flash
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\erase_from_bank1\erase.rpj" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\HardwareDebug\test.log"
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\flash_project.rpj" /file "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\HardwareDebug\aws_tests.mot" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\HardwareDebug\test.log"
GOTO END

:END
  • 注意事項
    • デバイステスタに同梱される同名ファイルの改行コードがLFであるのに対し、Windows上で実行する際は改行コード=CRLFである必要があることに注意

RX65N Cloud Kit

  • build.bat から呼び出されるヘッドレスビルド実行時にmakeのパスが通らずエラーになる場合はmake.exeの存在するe2 studioインストールフォルダのUtilitiesフォルダを環境変数PATHに登録すること

config.json の例

  • "awsRegion" を使用しているリージョンに変更
{
  "log": {
    "location": "../logs/"
  },
  "configFiles": {
    "root": "../configs",
    "device": "../configs/device.json"
  },
  "testPath": "../tests/",
  "reportPath": "../results/",
  "certificatePath": "../certificates/",
  "awsRegion": "ap-northeast-1",
  "auth": {
    "method": "environment"
  }
}

device.json の例

  • "serialPort"は使用しているPCで認識しているCOMポートに変更する。
[
  {
    "id": "<renesas-pool-id-1>",
    "sku": "<RX65N Starter Kit>",
    "features": [
      {
        "name": "WIFI",
        "value": "Yes"
      },
      {
        "name": "OTA",
        "value": "Yes",
        "configs": [
          {
            "name": "OTADataPlaneProtocol",
            "value": "MQTT"
          }
        ]
      },
      {
        "name": "TCP/IP",
        "value": "On-chip"
      },
      {
        "name": "TLS",
        "value": "Yes"
      },
      {
        "name": "PKCS11",
        "value": "ECC"
      },
      {
        "name": "KeyProvisioning",
        "value": "Import"
      },
      {
        "name": "BLE",
        "value": "No"
      }
    ],
    "devices": [
      {
         "id": "<renesas-pool-id-1>",
        "connectivity": {
          "protocol": "uart",
          "serialPort": "COM3"
        },
    "secureElementConfig": {
        "publicKeyAsciiHexFilePath": "<absolute-path-to-public-key>",
        "secureElementSerialNumber": "<optional: serialnumber-of-secure-element>"
		},	
        "identifiers": [
          {
            "name": "serialNo",
            "value": "<serialNo-value>"
          }
        ]
      }
    ]
  }
]

userdata.json の例

  • "clientWifiConfig", "testWifiConfig" は 設定必要
  • "awsSignerCertificateArn"はブートローダに仕込んだ公開鍵をAWS Certification Managerに登録したものを指定
  • "awsUntrustedSignerCertificateArn"はブートローダに仕込んだ公開鍵をAWS Certification Managerに登録したもの以外を指定
{
  "sourcePath": "C:/idt/amazon-freertos",
  "vendorPath": "C:/idt/amazon-freertos/vendors/renesas/rx_mcu_boards/boards/rx65n-cloud-kit-uart-sx-ulpgn",
  "buildTool": {
    "name": "e2studio",
    "version": "7.8",
    "command": [
      "C:/idt/configs/script_templates/build.bat {{enableTests}}"
    ]
  },
  "flashTool": {
    "name": "RFPV3",
    "version": "v3.06",
    "command": [
      "C:/idt/configs/script_templates/flash.bat {{buildImageName}}"
    ],
    "buildImageInfo" : {
      "testsImageName": "test",
      "demosImageName": "demo"
    }
  },
  "clientWifiConfig": {
    "wifiSSID": "xxxxxx",
    "wifiPassword": "xxxxxx",
    "wifiSecurityType": "eWiFiSecurityWPA2"
  },
  "testWifiConfig": {
    "wifiSSID": "xxxxxx",
    "wifiPassword": "xxxxxx",
    "wifiSecurityType": "eWiFiSecurityWPA2"
  },
  "echoServerConfiguration": {
    "securePortForSecureSocket": 33333,
    "insecurePortForSecureSocket": 33334,
    "insecurePortForWiFi": 33335
  },
  "otaConfiguration": {
    "otaFirmwareFilePath": "C:/idt/amazon-freertos/projects/renesas/rx65n-cloud-kit-uart-sx-ulpgn/e2studio/aws_demos/HardwareDebug/userprog.rsu",
    "deviceFirmwareFileName": "userprog.rsu",
    "otaDemoConfigFilePath": "C:/idt/amazon-freertos/vendors/renesas/rx_mcu_boards/boards/rx65n-cloud-kit-uart-sx-ulpgn/aws_demos/config_files/aws_demo_config.h",
    "codeSigningConfiguration": {
      "signingMethod": "AWS",
      "signerHashingAlgorithm": "SHA256",
      "signerSigningAlgorithm": "ECDSA",
      "signerCertificate": "arn:aws:acm:ap-northeast-1:094025684215:certificate/19e68e65-2a0e-4c47-a9ad-09b9903d458d",
      "signerCertificateFileName": "secp256r1.crt",
      "compileSignerCertificate": true,
      "signerPlatform": "AmazonFreeRTOS-Default",
      "untrustedSignerCertificate": "arn:aws:acm:ap-northeast-1:094025684215:certificate/f7bf6fc9-4f70-4c5c-a09e-724f81c677cb"
    }
	}
}

build.bat の例

@echo off
set message =  Hello Build
IF %1 == 0 GOTO demo_build
IF %1 == 1 GOTO test_build

echo %message%
GOTO END

:demo_build
python C:\idt\Amazon-FreeRTOS-Tools\section_OTA\OTAsection.py --path-aws "C:\idt" --path-project "rx65n-cloud-kit-uart-sx-ulpgn"
C:\Renesas\e2_studio_v780\eclipse\eclipsec.exe -nosplash -debug -consolelog -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data C:\idt\idt\builddemoscloudkit -import C:\idt\amazon-freertos\projects\renesas\rx65n-cloud-kit-uart-sx-ulpgn\e2studio\aws_demos -cleanBuild all
"C:\idt\Amazon-FreeRTOS-Tools\Renesas Secure Flash Programmer.exe" CUI Initial "RX65N(ROM 2MB)/Secure Bootloader=256KB" "sig-sha256-ecdsa" 1 "C:\idt\amazon-freertos\projects\renesas\rx65n-cloud-kit-uart-sx-ulpgn\e2studio\boot_loader\HardwareDebug\boot_loader.mot" "C:\idt\amazon-freertos\projects\renesas\rx65n-cloud-kit-uart-sx-ulpgn\e2studio\aws_demos\HardwareDebug\aws_demos.mot" "C:\idt\sample_keys\secp256r1.privatekey" "C:\idt\amazon-freertos\projects\renesas\rx65n-cloud-kit-uart-sx-ulpgn\e2studio\aws_demos\HardwareDebug\userprog.mot"
"C:\idt\Amazon-FreeRTOS-Tools\Renesas Secure Flash Programmer.exe" CUI Update "RX65N(ROM 2MB)/Secure Bootloader=256KB" "sig-sha256-ecdsa" 1 "C:\idt\amazon-freertos\projects\renesas\rx65n-cloud-kit-uart-sx-ulpgn\e2studio\aws_demos\HardwareDebug\aws_demos.mot" "C:\idt\amazon-freertos\projects\renesas\rx65n-cloud-kit-uart-sx-ulpgn\e2studio\aws_demos\HardwareDebug\userprog.rsu"
GOTO END

:test_build
C:\Renesas\e2_studio_v780\eclipse\eclipsec.exe -nosplash -debug -consolelog -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data C:\idt\buildtestcloudkit -import C:\idt\amazon-freertos\projects\renesas\rx65n-cloud-kit-uart-sx-ulpgn\e2studio\aws_tests -cleanBuild all
copy /y C:\idt\amazon-freertos\demos\include\aws_clientcredential_keys.h C:\idt\amazon-freertos\tests\include\aws_clientcredential_keys.h
GOTO END

:END
  • 注意事項
    • デバイステスタに同梱される同名ファイルの改行コードがLFであるのに対し、Windows上で実行する際は改行コード=CRLFである必要があることに注意

flash.bat の例

  • <<C:\Renesas\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06>> は使用している はRenesas Flash Programmerのパスで置き換える
  • GitHubに登録されているプロジェクトはE2 Lite設定なので、E1やE2など他のエミュレータ使用者はプロジェクトファイルを開いてデバッガ設定変更が必要
@echo off
set message =  Hello Flash
IF %1== demo GOTO demo_flash
IF %1 == test GOTO test_flash

GOTO END

:demo_flash
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\erase_from_bank1\erase.rpj" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\rfp_flash_erase.log"
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\flash_project.rpj" /file "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug\userprog.mot" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\rfp_flash_write.log"
GOTO END

:test_flash
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\erase_from_bank1\erase.rpj" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\rfp_flash_erase.log"
"C:\Program Files (x86)\Renesas Electronics\Programming Tools\Renesas Flash Programmer V3.06\RFPV3.exe" /silent "C:\idt\amazon-freertos\vendors\renesas\boards\rx65n-rsk\aws_tests\flash_project\flash_project.rpj" /file "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\HardwareDebug\aws_tests.mot" /log "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\rfp_flash_write.log"
GOTO END

:END
  • 注意事項
    • デバイステスタに同梱される同名ファイルの改行コードがLFであるのに対し、Windows上で実行する際は改行コード=CRLFである必要があることに注意
    • テストが動作していない(test_manager.log)様子であればフラッシュへの書き込みが失敗していないかをRFPのログを確認するとよい
      • RFPのログは以下に格納される
        • "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\rfp_flash_erase.log"
        • "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_demos\rfp_flash_write.log"
        • "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\rfp_flash_erase.log"
        • "C:\idt\amazon-freertos\projects\renesas\rx65n-rsk\e2studio\aws_tests\rfp_flash_write.log"
      • 本システム(RX65N)はデュアルバンク構成となっており、OTAの実施回数により実行バンクがどちらになるかは不定である
      • 従ってwriteの前にeraseをすることで実行バンクを初期化している
      • rfp_flash_erase.log がしばしば失敗しているのは、フラッシュ初期化用のRFPプロジェクトが記憶するバンク面と実際のデバイスのバンク面が食い違ったときにRFPが「デバイス情報が一致しない」というエラーを出力するためである
        • このとき、eraseする必要はないので、これはこれで期待動作である

build.bat と flash.bat の役割

  • メカニズム
    • 概要
      • IDTを起動するとIDTがAmazon FreeRTOSのコンフィグ値をテスト用に書き換えてビルドを実行する
      • IDTがビルドを実行する際にbuild.batが呼び出される
      • build.batの中身はマイコンベンダが用意するものであり、マイコンに応じたビルドコマンドを書くことでIDTによる自動ビルド環境に任意のマイコン環境を組み込むことができる
        • RXマイコンでは、e2 studioのヘッドレスビルド(GUI無しで動作するビルドモード)を用いてビルドを行う
      • IDTによるbuild.batの呼び出しとその実行が完了すると、続いてflash.batが呼び出される
        • RXマイコンでは、Renesas Flash ProgramerをCUIモードで起動しコマンドライン上からフラッシュ書き込みを行う
        • 2回Renesas Flash Programerが起動されるのは、オプション設定メモリを初期状態に戻すために1回目起動時に必ずEraseしたいためである
        • 2回目の起動時にWriteされる
    • システム全体の動作説明
      • ファームウェアアップデートを含むシステムとなっており、システムは以下2プロジェクトにより構成されている
        • ブートローダ(ファームウェアの正当性検証やライフサイクル管理等)
        • ユーザアプリケーション
      • ブートローダとユーザアプリケーションは個別のプロジェクトとなっておりそれぞれ独立している
      • リセット解除時はブートローダが起動され、ユーザアプリケーションの正当性が確認できた場合にユーザアプリケーションにプログラムカウンタが引き渡される仕組み
      • ファームウェアはMOT変換ツール により以下のように変換される
        • ファームウェアアップデート時はユーザアプリケーション部分のみをバイナリ(userprog.rsu)として配信するべく構築される
        • 初期ファームウェアインストール時はブートローダとユーザアプリケーションが合成され1枚のテキスト(userprog.mot)として構築される
    • build.batの説明
      • IDTからはbuild.batは引数 0 or 1 を伴って呼び出される
        • 0 の場合は、aws_demos プロジェクトを用いた実際のAWSとの通信における挙動を確認するテストが行われる
        • 1 の場合は、aws_tests プロジェクトを用いたAWS作成のテストベクタを用いた詳細動作確認するテストが行われる
      • aws_demos
        • aws_demosはOTAを利用しないユーザ向けに、通常のセクション配置設定となっているが、OTAのテストを実行する際はセクション配置を切り替えなければならない
          • そのため、OTAsection.py を用いてセクション配置を保持する.cprojectを書き換える動作を行う
          • さらに、OTAsection.py を用いてaws_demosの起動デモ設定を aws_demo_config.h にて CONFIG_MQTT_DEMO_ENABLED -> CONFIG_OTA_UPDATE_DEMO_ENABLEDへの切り替えを行う
        • この調整が完了すると、ヘッドレスビルドを用いてaws_demosのビルドが行われる
        • ヘッドレスビルドが終わるとMOT変換ツールを用いて、ブートローダとユーザアプリケーション(aws_demos)のMOTファイルの結合を行う
          • その際、MOT変換ツールには署名付加用の秘密鍵(secp256r1.privatekey)が指定される
        • ヘッドレスビルドが終わるとMOT変換ツールを用いて、ユーザアプリケーション(aws_demos)のRSUファイルへの変換を行う
          • その際、署名はAWS側が付与するため、MOT変換ツールには署名付加用の秘密鍵(secp256r1.privatekey)が指定されない
      • aws_tests
        • ヘッドレスビルドを用いてaws_testsのビルドが行われる
        • 以下ファイルにテスト用の鍵が追記され続けるため、デバイステスタを複数回実行するとビルドエラーになることがある
          • C:\idt\amazon-freertos\tests\include\aws_clientcredential_keys.h
            • 毎回以下からクリーンなaws_clientcredential_keys.hをコピーしてテスト用鍵を消せばよい
              • C:\idt\amazon-freertos\demos\include\aws_clientcredential_keys.h
                • build.bat の:TESTでビルド完了後にaws_clientcredential_keys.hをクリーンすることで対策とした
    • flash.batの説明
      • IDTからはflash.batは引数 0 or 1 を伴って呼び出される
        • 0 の場合は、aws_demos プロジェクトを用いた実際のAWSとの通信における挙動を確認するテストが行われる
        • 1 の場合は、aws_tests プロジェクトを用いたAWS作成のテストベクタを用いた詳細動作確認するテストが行われる

ヘッドレスビルドとCMakeの話

  • build.batは、e2 studioのヘッドレスビルド機能(コマンドライン起動GUI無し)を用いたGUI無しでのビルド手法を活用している
    • cc-rxなどのコンパイラのコマンドを使ってコンパイルしていく方法も採れるがmakefile作成等が面倒である。
      • 通常GUIでプロジェクトを組み立てて手動デバッグ時はそのままGUIでビルド・デバッグする
      • 通常テストフェーズに移り自動テスト環境にプロジェクトを組み込みたい際にコマンドラインからビルド制御できた方が都合が良いが、makefile作成などが面倒であるため手動デバッグ時に作ったプロジェクトをそのまま流用したくなる
      • このユースケースを救うのがヘッドレスビルドである
      • また、「ひとつのソフトウェア」が「複数のコンパイラでコンパイルされるユースケース」の場合にコンパイラ毎のビルド手順の作り込みが必要になり大変な工数となる
        • このユースケースはヘッドレスビルドでは救えず、これをを救うための世の中の流れはCMakeである。Amazon FreeRTOSもMicrosoft AzureもCMake。皆CMake。ならば俺もCMakeとならなければならない。
      • ちなみに「ひとつのソフトウェア」が「複数のコンパイラでコンパイルされるユースケース」の代表例は「ゲーム」である
        • 1回の開発でiPhone/Android/PS4/XBOX/Switch などの複数のゲーム機に同一のゲームが同時期に発売できるのはこのあたりの仕掛けが洗練されているからである
      • 組み込みマイコンの場合は、ユーザによって使用するコンパイラが「MCUベンダ純正」「IAR」「GCC」と大別される
        • コンパイラ毎にソフトウェアを個別に開発するのは論外であり、コンパイラ依存しないコードと依存するコードを分離し、コードの再利用性を高めることがセオリーとなる
          • RX Driver Package においては、r_rx_compiler.h でコンパイラ差分を吸収し、ドライバ本体ではコンパイラ依存の機能はr_rx_compler.hに定義される差分吸収後の関数を呼び出すことで一切のコンパイラ依存を断ち切ることができ、マルチコンパイラ対応を実現している
          • これにより、RX Driver Packageは1回の開発で「MCUベンダ純正」「IAR」「GCC」の3種類のコンパイラを利用するユーザに向けてリリース可能
            • ただし、開発時にCMakeを使いこなしていないため、コンパイラ毎に評価環境を構築し手動評価を行っており、場合によっては「CC-RXで評価したから他のコンパイラでは評価しない」という妥協策がとられることもある。
              • さらなる開発効率向上、品質向上に向け、CMakeを活用して自動化を推し進めていかなければならない
                • 自動化により浮いた開発費はアプリケーション開発に再投資されるべきだ