123
45678910
11121314151617
18192021222324
25262728293031
<< July 2010 >>

Arduinoは遅いか?

2009.12.01 Tuesday

こんにちは。開発スタッフのsugaです。

巷で噂されていることで気になっていたのですが、ワークショップに参加いただく方からも質問がありましたので調べてみました。

「ArduinoはPICより処理速度が遅いらしいが、実際にはどのくらいか?」

Arduinoに使われているAVRマイコンは「多くの命令は1サイクルで実行」されるという、比較的高速な部類のCPUです。
(CPUのクロックサイクルが16MHzなら、1秒に1600万回命令を実行できる)

ArduinoのスケッチはベースがC言語(gcc)なのですが、マイコンを扱うと最初に出くわすI/Oやレジスタ制御の部分をArduinoライブラリが肩代わりしてくれて、ユーザーにとって分かりやすく使いやすい表記で使えるようになっています。
このライブラリの部分が、ユーザーに代わってややこしい処理をやってくれているため、その分の処理を食われてしまうのです。
 
以下に調べたデータを示しますが、単純なI/O制御について、C言語だけでプログラムを組んだ時に比べると、Arduinoのライブラリを使った場合は、CPUクロックサイクルを10倍くらい消費しています。
これは「AVRマイコンのマニュアルを読んでマイコンのレジスタを制御して入出力をしなくて済む」コストなのでしょうね。

Arduino(スケッチ)という環境で使っているので、単純にPICと比べると遅いのですが、そもそもの条件が違うので、速さ競争をするなら素のAVRマイコンと比べないといけないのでしょうけども……。
Arduinoは簡単に扱えるマイコンボードですが、処理能力を求める用途にはAVRマイコンを使うほうがいいでしょう。
幸い、Arduinoの開発環境は、AVRマイコン用のライブラリを使うことができ、Arduinoのライブラリを使わずに、直接I/Oなどを制御することが可能です。
Arduinoのベースを使いながら早い処理も可能になります。AVRマイコンへのステップアップへの道にもなるでしょう。
(C言語の標準的なライブラリも使えますよ。 string.h とか文字列を扱うのに便利)


以下、調べた結果。

AVR Studio(AVRの開発環境)についているシミュレーターでプログラムをステップ実行してプログラムカウンターの進みを数えました。
(1 CPUクロックサイクル → 16MHz → 62.5ナノ秒)


<デジタル出力>

digitalWrite(10, HIGH)  …Arduinoの出力
→ 44 CPUクロックサイクル

PORTD = i; …AVRのレジスタ直接操作による出力
→ 3 CPUクロックサイクル

<デジタル入力>

i = digitalRead(10)  …Arduinoの入力
→ 30 CPUクロックサイクル

i = PIND; …AVRのレジスタ直接操作による入力
→ 3 CPUクロックサイクル

※変数 i は volatile unsigned char i; として初期化しています。
※数値は実測値で、状況によって変わるかもしれません。
※厳密に同じ処理になっていませんが、簡易的なチェックということで、ご容赦ください。


<アナログ入力>

アナログについては、Arduinoのコアプログラムを読み砕いてみました。
マイコン中のADコンバーターへ送られるAD変換クロックというのがあり、それは125KHzに設定されていました。
AD変換には、通常13 AD変換クロック(初回25 AD変換クロック)必要なので9.6kSPS(1秒に9600回)の速度で変換できる計算です。
→ CPUクロックサイクルになおすと 1664
 (この他にライブラリの処理もある)

AVRマイコン(たとえばATmega168)のスペックとして、AD変換クロックを変更すれば(精度に影響がありますが)76.9kSPSまで上げることは可能です。
これをCPUクロックサイクルになおすと 208 となります。


<その他>

ちなみに、コアプログラムは
arduino-0017¥hardware¥cores¥arduino¥
にあります。
C言語でいうmain()関数は main.cxx というファイルに書かれていて、ここから setup() と loop() が呼び出されていました。
マイコンの初期化や上記のAD変換クロックの設定もここにあるファイルの中に書かれています。
delay() のためのタイミング生成に使うタイマー割り込みなども設定されているので、ユーザーのプログラムを動かしているときでも、絶えず割り込みが発生して処理を食っているようです。


<参考>

有志の方が翻訳されたAVRマイコン(ATmega168/328)のマニュアル。
http://moon.gmobb.jp/hero/PDF/mega88.pdf
http://moon.gmobb.jp/hero/PDF/mega88PA.pdf
これを読解できるようになればArduinoは不要!

posted by: 研究開発スタッフ | 開発スタッフ | 18:00 | comments(0) | trackbacks(0) |

コメント










この記事のトラックバックURL
http://blog.galileo-7.com/trackback/86932
トラックバック