RGB565におけるRGBtoBGRの高速化(2)

それでは、16bit環境における高速化されたコードを示そう。

void rgb2bgr(WORD& data) {
data = data xor (data<<11);
data = data xor (data>>11);
data = data xor (data<<11);
}

9 step/pixel
0 work memory

ただし、シフトは論理シフトでないといけない。
C言語の場合はシフトが論理シフトか算術シフトかが決まっていない。(環境依存)
算術シフトの場合(data>>11)が((data>>11)&0x1F)となり1step増えるが、環境に依存しなくなる。
さらにもう一つ環境依存関連だが、ビッグエンディアンを想定して書いているので注意。

さて、最近は32bitのコントローラが多い。(ex.ARM7-TDMI,SH-2)
この場合は2pixel同時処理が可能である。

void rgb2bgr(DWORD& data) {
data = data xor ( (data<<11) & 0xF800F800) );
data = data xor ( (data>>11) & 0x001F001F) );
data = data xor ( (data<<11) & 0xF800F800) );
}
12 step/2pixel = 6step/pixel
0 work memory

はじめは14step/pixelだったのが、6step/pixelとなった。2倍以上速くなっている。

さてこれはハードウェアで実装するとアホみたいに安くできる。
ただ単に配線を入れ替えればいいだけだからだ。

RGB565におけるRGBtoBGRの高速化

画像処理関係は大量のデータを扱うため重い処理である。
そのため重点的に高速化する必要がある。
多くの場合、こう書くであろう。
void rgb2bgr(WORD& data) {
WORD r,g,b;
r = (data >> 11) & 0x1F;
g = (data >> 5) & 0x3F;
b = (data >> 0) & 0x1F;

data = (r << 11) | (g<<5) | (b<<5);
}

Step:14 [/pixel]
Memory:6 [byte]

高速化するにはどうすればよいのであろうか?
よく見てみるとrとbを入れ替えているだけである。
つまり、異なる2つの領域を3ステップ0ワークメモリで入れ替える有名な方法がつかえる。
X = X xor Y
Y = X xor Y
X = X xor Y

【証明】
X1=X0 xor Y0
Y1=X1 xor Y0 = (X0 xor Y0) xor Y0 = X0
X2=X1 xor Y1 = (X0 xor Y0) xor X0 = Y0

次回につづく

SH-2Aの秘密機能

SH7262の公開版マニュアルを読んでみると守秘契約を結ばないとおしえてくれない項目がある。

SDホストコントローラとデコンプレッションユニットである。
それぞれ代替の手法があるものの折角あるアクセラレータを使わないのは、消費エネルギーを増大し地球に優しくない

さて、サンプルコードのiodefine.hを読んでみるとマニュアルには書いていない機能レジスタが1つある。9191行目に

#define DCU (*(volatile struct st_dcu *)0xFFFF5000) /* DCU Address */
とある。
7504行目から見るとRGBCとか書いてある。
多分デコンプレッションユニット関連だろう。

EJとSH-2A

木曜日、久しぶりに寝坊してしまい1限の電機機器学をサボってしまった。
2限の波動工学の途中から出たわけである。
ところで、波動工学の教官は「OK?」が口癖である。
友人がその回数を数えていたそうだが10分で10回を超えて数えるのをやめたそうだ。

昼食後、本屋に寄ったときInteface誌4月号をみかけた。表紙にはSH-2A基板付と書かれていた。
ざっと読んでみて、安藤P's「OK?」Counterを作ろうと思った。
音声認識し学習するカウンタである。

SH-2Aは前からほしかった一品である。
4年前のInterface6月号にSH-2基板が付いていた号があるが、そこにSH-2Aの紹介記事が書かれていた。どういう訳かSH-2Aがほしくなってしまった。

それから4年、いつになったらSH-2Aが使えるようになるかずっと待っていた。人生の25パーセントという長い期間である。
そしていつか入手する日に備えて勉強をしていた。

その後、10パーセント引きの生協で残りの1冊を購入した。
そして、図書館で音声認識関連の本を借りた。
帰り道途中の秋葉原コンデンサマイクを購入した。ついでにはんだぬぐい器と白色のキャラクタディスプレイを購入した。

AVRの企画はお休みとなりそうだが、そこで紹介しようと思っていたこともこの企画で紹介することになるだろう。

マイコンはじめました(車輪の再発明編)

部屋を整理したらちょっと前に買ったAVRマイコンがでてきた。

標準モデルのATTINY2313と小型&ADC付のATTINY13Aだ。
atmelのサイトをみるとATTINY2313Aという新型モデルがある。
application noteをみると省電力化とそれに伴う電気特性の変化と機能レジスタの一部変更と割り込みベクタの追加と書いてある。

つぎに書き込み装置の調達だが、いきなり壁にぶち当たる。
今のパソコンにはUSBポートしかない。デスクトップならMBの内部コネクタにシリアルがある場合があるのだが…。
というわけで今のパソコンから書く場合はUSB経由の書き込み装置が必要だ。
USB-RS232Cの変換ケーブルを使いAVRをコントローラとした書き込み機を作ることにしよう。
ところが、そのAVRに書き込む装置が要る。
というわけで、基本ロジックを組み合わせて書き込み機をつくってみよう。
と書いたものの実は秋月で売っている変換基板(\980)のチップには直接ポートを制御する機能があるのでそれを使うことにしたほうが正しいと思う。書き込みソフトも誰かが公開していた気がする。

しかしこの企画では敢えて苦しい道を行ってみよう。
機械語で開発したり、アセンブラコンパイラを作ったりすることで得られる物があるはずだからだ。