はじめに
ルネサス製Armマイコンを搭載したArduinoが出たと聞いたので、早速、買ってみました。本当は、WiFi版が欲しかったのですが、技適認証に時間がかかるらしく、国内ではまだ販売されていません。Arduinoのプログラム開発は、通常、Arduino IDEを使用しますが、今回は、コマンドラインのarduino-cliツールを使用します。これは、VLXから直接呼び出すことができるので便利です。
仕様
項目 | 仕様 | 備考 |
---|---|---|
ターゲットボード | Arduino UNO R4 Minima | |
MCU | RA4M1 | RAM:32kB/ROM:256kB |
FPU | 内蔵 | 単精度浮動小数点 |
開発環境 | arduino-cli | |
RTOS | 使用しない | |
ツールチェイン | arduino-cliに内蔵 | |
エミュレータ | 使用しない | アップロードはUSB経由 |
文献
[1]Arduino UNO R4 Minima Product Reference Manual SKU:ABX00080
[2]Renesas RA4M1 グループ ユーザーズマニュアル ハードウエア編
プログラムの構成
通常、VLXのターゲットでは、ステップ実行は、タイマー割り込みやアナログ入力割り込みなどのハードウエア割り込みにより駆動します。しかし、ハードウエア割り込みは低水準の実装が必要になるうえ、Arduinoの標準のライブラリが割り込みハンドラの中から安全に使えるかという疑問があります。そのため、loop()関数の中から周期的に呼び出すことにします。処理の概要はおよそ下記のようです。これを実現するには、正確に現在時刻を取得する必要があります。Arduinoには、millis()とmicros()と言うライブラリ関数によりそれぞれミリ秒とマイクロ秒単位で現在時刻を取得できます。しかし、実際にやってみるmicros()は後述するように、ごくまれに1ミリ秒の誤差が生じることがありました。
void loop()
{
開始時刻 = 現在時刻を取得
<<モデルのステップ処理を実行>>
終了時刻 = 現在時刻を取得
実際のステップ処理時間 = 終了時刻ー開始時刻
if (実際のステップ処理時間>ステップ時間) {
オーバランが発生
} else {
待ち時間 = ステップ時間ー実際のステップ処理時間
待ちループで待つ
}
}
苦労したところ
前述したようにmicros()はまれに誤差が生じます。原因を調べるために、モジュールコアーのソースコードを見てみました。millis()とmicros()の実装は16ビットのAGTタイマー1個を使用しているようです。ミリ秒部分は1ミリ周期の割り込みによりカウントアップ、マイクロ秒部分(time_us)は下記式で計算しています。
マイクロ秒=((再ロード値ーカウンタ値)/再ロード値+ミリ秒)✖1000
問題はこの式の前で割り込み禁止になっていることです。割り込み禁止後にAGTカウンタがアンダーフローをすると、カウンタ読値=0からカウンタ読値=再ロード値にジャンプしますが、割り込み禁止になっているのでミリ秒はカウントアップされないままです。この結果、マイクロ秒部分は0となり、マイクロ秒=ミリ秒✖1000となります。
C:\\Users\ユーザ名\AppData\Local\Arduino\...\time.cpp
からの抜粋
unsigned long micros()
{
// Convert time to us
NVIC_DisableIRQ(main_timer.get_cfg()->cycle_end_irq);
uint32_t time_us = ((main_timer.get_period_raw() - main_timer.get_counter()) * 1000 / main_timer.get_period_raw()) + (agt_time_ms * 1000);
NVIC_EnableIRQ(main_timer.get_cfg()->cycle_end_irq);
return time_us;
}
対策1
連続して1ミリ秒の割り込みが発生することはないので、micros()を2回呼び出し、大きい方を選択します。デメリットは、オーバヘッドが大きくなることです。
対策2
micros()は諦めて、SysTickを使用します。SysTickはArm系マイコンの標準の機能です。プロセッサベンダーの実装には依存しません。RA4M1マイコンにも搭載されています。本ターゲットでは、この方法をデフォールトにしています。実装の詳細は、target.inoを御覧ください。
おわりに
最後まで読んでいただいてありがとうございます。ご感想などあれば、どんなことでも結構です、Mailをください。