PICAXEの速度を測ってみました
PICAXEが実に簡単に使えるのは前回確認しました。
次は速さはどうなんだろう?というのが気になりますよね。そこで、今回はベンチマークテスト、というと大げさですが一番簡単なIOパタパタの周期をオシロでとってみました。
簡単なものなので、ソースをコピペします。
main:
high C.1 ; Switch on output C.1
low C.1 ; Switch off output C.1
goto main ; Loop back to start
さあ、どうでしょう。インタプリタ内蔵PICの実力とやらを、オシロで見てみました。
パタパタのLOOP一周期が1.36msです。。。。。。usじゃないですよ。
Dutyが50%でないのは、Goto命令があるためですね。これで見るとIO命令の時間を1とするとGoto命令が3くらいかかっているようです。
それは良いとして、周期1.36msってどうなんでしょう?ちょっと計算してみましょう。
・PICAXE08M2はベースがPIC12F1840(32MHz)だそうです。
・PICは1サイクル(分岐は2サイクル)で1命令実行。1サイクルは4クロック周期。
・32MHz動作なら1サイクルは4*1/(32*10^6)=125nsのはず。
・もし同じIOぱたぱたをアセンブラで組んだらBSF,BCF,GOTOの3命令で
合計4サイクル(GOTOが分岐なので2)=500nsつまり0.5us。
・1.36msってことは、その2,720倍の時間がかかっている?
インタプリタが動いているにしてもちょっと大きいような?インタプリタといっても中間コードで動いているだろうから、解釈にそんなにかかるとも思えないし。
もしかしたら意図的に、例えば実行時間を一律にするために、実行周期をあえて大きくとっているとか?
インタプリタで動かしているものをプリミティブな命令と比較するのは意味がないとは思います。通信等の速度が要求される処理はコマンドになっているから問題ないということもあると思います。
しかしIO操作に数100usかかるというのは実際の制御系だとちょっと間に合わないケースが多そうな気がします。学習用ということでしたら全く問題ないでしょうが。
あとはもしかしたらPICAXEの方の設定にデバッグモードとか何か実際より遅くなる要因があって本当はもっと早いとか?
とりあえず、何も考えずに、デフォルト設定のままやってみたらこういう結果になりました、ということで、今回はここまで。
こんにちは。やっぱり遅いですよね。
PICは内部設定でシステムクロックを自由に変えられますので、ご考察のように実は32MHzより遅いクロックで動いているのかもしれないですね。
そういえば32MHzというのは実力最大であって、その速度で動かす義務はないわけですし。
あえて低速で動かす理由があるとしたら、例えば消費電流低減のためでしょうか。
それならそれでユーザが速度と消費電流のトレードオフで速度を選べるようにしておけばいいような気がしますが、そういうことをやりだすと「学習用で簡単」というコンセプトから外れるのかもしれないですね。
投稿 見習職人 | 2013/05/25 12:04
そうですよね。
picは発振周波数の1/4の動作クロックに成ると解説書に書いてあるから8MHzだとマシンサイクルは125nsですよね、私はソフトは殆ど分かりませんのでこれ以上書くとボロが出ますので止めます。
でもmsオーダーの動作では用途が限られてくるようにも思えます。
でも何でしょうね、発信のクロックは32MHzですよね。
オーバートーン発振子だったら、32MHzでは無くて基本波の発振で動いていたりして?
そんな事は無いですよね。
投稿 ezekiel | 2013/05/24 17:49