ロボコン用プログラムの高速化 + 軽量化

ロボコン用プログラムの高速化と軽量化を実施中。

高速化は、マイコン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変換のチェック機能の実装完了。とりあえず、ラインセンサのチェックはできるようになった。
後は、モータの動かし方とかを考えながら寝るとしようか。

Posted at : 2008-09-22 04:25:52 / Category : none

コメント

まだコメントはありません

コメントを投稿


お名前


メールアドレス(返信を通知する場合のみ記入)


認証コード(220521 と記入してください)