--/--/--  --:--    スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
今日は、ちょっと気になったことをひとつ。
_BV()で指定したレジスタのビットをセットできるのは
AVRを使用している人なら承知のことだとは思いますが、
実際に実行速度とかどうなんだろうとふと思いました。
適当に、PORTレジスタのbit0をセットするプログラムを書いて、
命令数を比較してみました。

今回比較したのは、
通常のレジスタをいじる方法の「PORTA = 0x01;」
_BV()を使用した「PORTA = _BV(0);」
H8ライクで使えるように自分で作ったライブラリのバイト単位「PA.PORT.BYTE = 0x01;」
同上のライブラリのビット単位「PA.PORT.BIT.B0 = 1;」
の4つです。

まず、最適化をかけていないO0でコンパイルした時のリストファイルがこちら。

PORTA = 0x01;
d8: eb e3 ldi r30, 0x3B ; 59
da: f0 e0 ldi r31, 0x00 ; 0
dc: 81 e0 ldi r24, 0x01 ; 1
de: 80 83 st Z, r24

PORTA = _BV(0);
d8: eb e3 ldi r30, 0x3B ; 59
da: f0 e0 ldi r31, 0x00 ; 0
dc: 81 e0 ldi r24, 0x01 ; 1
de: 80 83 st Z, r24

PA.PORT.BYTE = 0x01;
d8: e9 e3 ldi r30, 0x39 ; 57
da: f0 e0 ldi r31, 0x00 ; 0
dc: 81 e0 ldi r24, 0x01 ; 1
de: 82 83 std Z+2, r24 ; 0x02

PA.PORT.BIT.B0 = 1;
d8: e9 e3 ldi r30, 0x39 ; 57
da: f0 e0 ldi r31, 0x00 ; 0
dc: 82 81 ldd r24, Z+2 ; 0x02
de: 81 60 ori r24, 0x01 ; 1
e0: 82 83 std Z+2, r24 ; 0x02

上3つは4命令で実行していますが、
自作ライブラリのビット指定では5命令つかっています。
まぁ最適化をかけないとこんなもんですかね?

さて、次にOsで最適化したものがこちら。

PORTA = 0x01;
d0: 81 e0 ldi r24, 0x01 ; 1
d2: 8b bb out 0x1b, r24 ; 27

PORTA = _BV(0);
d0: 81 e0 ldi r24, 0x01 ; 1
d2: 8b bb out 0x1b, r24 ; 27

PA.PORT.BYTE = 0x01;
d0: 81 e0 ldi r24, 0x01 ; 1
d2: 8b bb out 0x1b, r24 ; 27

PA.PORT.BIT.B0 = 1;
d0: d8 9a sbi 0x1b, 0 ; 27

最適化してみると、自作ライブラリのBITが1命令に対して、
普通の代入文と、_BV()と自作ライブラリのBYTEは2命令使っていることがわかります。
個人的には、普通の代入文よりも_BV()の方がかかる気がしたのですが、
結果的に一緒みたいですね。
あと、自作ライブラリが意外とおいしいことがわかりました。
わかりやすく便利になって、さらに命令数がすくなくて済むのはいいことですね!

意外と、よく使っているけれども、知らないことってまだまだありますね。
またそのうち命令数の違いを他の処理でも比較してみたいと思います。


追記:09/03/14
最適化後の自作ライブラリのBYTEの記述に誤りがあったので訂正。
Secret

TrackBackURL
→http://amenotiyukizora.blog76.fc2.com/tb.php/281-1662f2fe
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。