C-STyleでコンパス活用(その2)補足

id:ohguma:20150620#p1 の補足。
Facebook経由で次のコメントを頂いたので紹介。

      • -

実はIF中で方位判定は使わないほうがいいです^_^ 特にelseifで判定が繰り返し続くと判定のたびにコンパス読みに行くので、どこにも当てはまらなくなったりしますし、すごく時間を食います。判定前にコンパス値を変数に代入してから判定回す方がいいです^_^

      • -

先の記事の方式で if〜 elseif を繰り返すと、方向チェックのたびに「get_hmc()」が実行されることになり、その処理にすごい時間かかるのは事実で、実際に「get_hmc()」の処理時間を調べるとこんな感じ。

1000回のget_hmc()に約2秒=1回約2ミリ秒も掛かるため(A=Bのような変数代入だと1000回で0.2ミリ秒=1回0.002ミリ秒)、elseifで方向チェックを繰り返した分だけプログラムが遅くなるので、方向チェックの多用には注意する。

C-Codeが理解できれば、get_hmc()を使わない方向チェック関数を自作することも可能なので、興味がある方は調べて見て欲しい。



Teratermに出力する部分が見づらいので、csyファイルも掲載する。
下の枠内をテキストエディタに貼り付けて「時間計測.csy」というファイル名で保存すれば、C-Styleで開ける。Teratermの設定方法については id:ohguma:20150425 に記載した。

sprintf()の第2引数の「%ld」はパーセント、小エル、小ディ。
C-Codeで利用するC言語の詳細はこちら。

Title:Main - [ 時間計測 ] DAISEN C-Style for TJ3B  [ Ver.20141024 ] - [Main - [ 時間計測 ]]
CN01:Ball
CN02:Line
CN03:L-Touch
CN04:R-Touch
CN05:C-Touch
CN06:
CN07:
CN08:
CN09:RED3
CN10:RED2
[0000]:sno:08,cno:07,val:111111-110010-000020,cmt:
[0001]:sno:33,cno:33,val:000000-000000-000000,cmt:char str[16+1];  	// sprintf() tx_puts() で使う変数strは最初に定義する
[0002]:sno:33,cno:33,val:000000-000000-000000,cmt:  	// 何も実行しない1000回ループの時間計測
[0003]:sno:30,cno:30,val:000000-000000-000000,cmt:
[0004]:sno:05,cno:05,val:000010-000000-000000,cmt:
[0005]:sno:05,cno:05,val:000100-000000-000000,cmt:
[0006]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0007]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0008]:sno:31,cno:31,val:250270-000000-000000,cmt:
[0009]:sno:33,cno:33,val:000000-000000-000000,cmt:  	// 方向取得の1000回ループの時間計測
[0010]:sno:30,cno:30,val:000000-000000-000000,cmt:
[0011]:sno:05,cno:05,val:000010-000000-000000,cmt:
[0012]:sno:05,cno:05,val:000100-000000-000000,cmt:
[0013]:sno:31,cno:31,val:000410-000000-000000,cmt:
[0014]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0015]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0016]:sno:31,cno:32,val:240272-000026-000000,cmt:A=Dir(HMC)の処理以外に掛かった時間を引く
[0017]:sno:33,cno:33,val:000000-000000-000000,cmt:sprintf (str,"[Y]%ld ", gV[VAR_Y]);
[0018]:sno:33,cno:33,val:000000-000000-000000,cmt:tx_puts(str);
[0019]:sno:33,cno:33,val:000000-000000-000000,cmt:  	// 変数代入の1000回ループの時間計測
[0020]:sno:31,cno:31,val:010000-000000-000000,cmt:
[0021]:sno:30,cno:30,val:000000-000000-000000,cmt:
[0022]:sno:05,cno:05,val:000010-000000-000000,cmt:
[0023]:sno:05,cno:05,val:000100-000000-000000,cmt:
[0024]:sno:31,cno:31,val:000020-000000-000000,cmt:
[0025]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0026]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0027]:sno:31,cno:32,val:230272-000026-000000,cmt:A=B の処理以外に掛かった時間を引く
[0028]:sno:33,cno:33,val:000000-000000-000000,cmt:sprintf (str,"[X]%ld\r\n", gV[VAR_X]);  	// \r\nで改行
[0029]:sno:33,cno:33,val:000000-000000-000000,cmt:tx_puts(str);