ロボコン用プログラムの高速化と軽量化を実施中。
高速化は、マイコン1個で二つのセンサとモータ類を動かさないといけないので、
かなり絞り上げないときつい。
一応、マイコンのスペックは以下の通り。
SH7125(SH/Tiny)
内部クロック:50MHz(1クロック約20ns、基本命令は1クロックで実行可)、5段パイプライン
周辺クロック:25MHz(1クロック約40ns)
内蔵ROM:128KB(だったはず・・・もしかしたら、64KBかも)
内蔵RAM:8KB
(クロックの設定は、ソフトウェアで切り替えを行う)
既に、マイコン講習会で配布されたマイコン用ソフトウェアがあるので
それを手直しする形で修正を行った。
まぁ、どうせ、ロボコンに出場する人でここを見ている人は、このソフトウェアを
使うことはなさそうなので、どうすれば高速化されるか書いておく。
一応、ロボコンが終わったらサークルの方に報告しておきますかね。
手始めにAD変換の高速化をやってみた。
ハードウェアマニュアルを見ながら、AD変換の変換にかかる時間を計算。
まず、割り込みを使って常時取得するようになっていたので、これを削除。
マニュアルを見てみるとわかるんだけど、1回のスキャンで200ステート(約8μs)とか
かかるので、処理としてはかなり重たい処理になる。
(おそらく、1回のスキャンで8μsかかって、8個のAD変換ポート全部行った場合、64μsかかるはず)
連続スキャンモードで、全部のポートをスキャンする必要は無いので、シングルモードに変更して、
個々に値を取ることにした。
関数呼び出しのオーバーヘッドを気にするのであれば、一度の処理で必要なポートだけ
スキャンしてしまって、大域変数に放り込んでおいた方がいいかもしれない。
(たぶん、一回関数を呼び出すと20ステップくらいになる?
引数はないけど、ローカル変数があって、戻り値がある)
試しにinline修飾詞をつけてみた。しかし、HEW付属のコンパイラがinlineに対応していない。
設定をよくよく見てみたら、案の定、C++が使える。拡張子をcppに変えて、inline使ったら
コンパイルが通った。
「全部cppにすればいいんじゃない?」って思ったけど、C言語とC++って速度的にどうなんだろう。
自分の中では、classとか使わなければそこまで遅くならない感じもする。
次に、クロックの設定を確認。
リザーブの値が間違っていたのを修正。たぶん、間違っていても動くだろうけど。。。一応。
SCIに対してのprintf関数の調子がおかしい。
何故か、ヘッダを追加したら解決。
いや、コンパイルエラーとか特に出てなかったし、objファイルは生成されていたから
リンクされていると思ったんだけどなぁ・・・。
コンペアマッチタイマー(CMT)の1が正常に動かない。
いろいろと探っていたら、割り込みの値が設定されてないわな・・・。
AD変換のチェック機能の実装完了。とりあえず、ラインセンサのチェックはできるようになった。
後は、モータの動かし方とかを考えながら寝るとしようか。