GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
GR-SAKURA は 96MHz のクロックで動作しているので 1秒間に 96Mクロック分の命令を実行できる筈、ということで下記のスケッチを作成実行し、計測した。
/* GR-SAKURA Sketch Template V2.13 */ #include <Arduino.h> void setup() { Serial.begin(9600); delay(1000); } void loop() { unsigned long start = micros(); __asm __volatile( "1: sub #1, %0 \n" " bne.b 1b \n" : : "r"(F_CPU / (1/*sub*/ + 3/*bne*/)) ); unsigned long time = micros() - start; Serial.println(time); }
スケッチの内容は 96Mクロック分のループ処理を行った際に CPU とは別に動作しているタイマーで掛かった時間を計測するというのもので、実行結果は以下の通り。
1392020 1392232 1392029 1392029 1392231 1392028 1392233 1392029 1392029 1392029
96Mクロック分のループ処理に 1.4秒近く掛かっており、明らかに遅い。遅すぎる。
これの主な原因はソフトウェア PWM の処理が重すぎることにある。
確認として、ソフトウェア PWM の処理を行っている gr_common/rx63n/util.c の INT_Excep_TPU2_TGI2A() の 内容をコメントアウトして先のスケッチを実行した結果が以下。
1016341 1016349 1016348 1016349 1016350 1016348 1016348 1016349 1016342 1016347
ソフトウェア PWM の処理を外すと前述の 96Mクロック分のループ処理が約 1秒となることが分かる。
取り敢えず暫定として、INT_Excep_TPU2_TGI2A() の内容を下記に書き換えてみた。
#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) void INT_Excep_TPU2_TGI2A() { int i; for (i = 0; i < MaxSoftwarePwmChannels; i++) { volatile SoftwarePwm* p = &softwarePwmTable[i]; if (unlikely(p->valid)) { if (p->count == p->term) { BCLR(p->out, p->bit); } else if (p->count == 0) { BSET(p->out, p->bit); } if (p->length > 0 && --p->length == 0) { p->valid = false; } if (++p->count >= p->period) { p->count = 0; } } } }
結果は以下の通り。
1247418 1247427 1247608 1247424 1247425 1247425 1247609 1247424 1247426 1247426
1.4秒 → 1.25秒 と改善はしたものゝそも〃の話としてソフトウェア PWM を使用していない状態でこれだけ負荷が掛かっているのは問題であり、実装等を見直す必要がある。
そんなわけで、抜本的に改善した版を数日中に投稿する予定。