8 years ago.

コンパイラのビット順序反転オプションの使用可否について

プレステのコントローラーをmbedに繋ごうと思い、こちらのプログラムを参考に作りました。 https://developer.mbed.org/users/okini3939/code/PS_PAD/

Nucleo F446REではピンアサインを変えるだけで問題なくコンパイルが通るものの、LPC1114FN28では "_rbit is undefined"とエラーが発生します。

プレステのコントローラーはLSBファースト書き込みとのことで、ビット順序を反転しているのだと思いますが、 これが通らないとそのままのプログラムを使えず難儀しているところです。

これは、Cortex-M0とM4の違いで、サポートされている関数が違うとか、そんなことでしょうか?

rev関数などもあるみたいですが、使用目的とはちょっと違うみたいですし、他にサポートされている 関数 or 他の方法で書き直した場合についても、ご教示いただけたらと思います。

以上、宜しくお願いします。

1 Answer

8 years ago.

こんばんは。

ご指摘のように __rbit はビット反転を行うコンパイラの組み込み関数なので、rbit 命令のない Cortex-M0 (ARMv6-M)ではサポートされていません。 自前でビット反転関数を記述するしか無いと思います。

参考:http://tama012.blogspot.jp/2012/10/blog-post_13.html

Accepted Answer

Wataraiさん、コメントありがとうございます。

なるほど、このような手法を用いることで、ビットが逆転できるのですね。

参考例のように、

int PS_PAD::reverseBits(int v)
{
 v = (v >> 16) | (v << 16);
 v = ((v & 0xff00ff00) >> 8) | ((v & 0x00ff00ff) << 8);
 v = ((v & 0xf0f0f0f0) >> 4) | ((v & 0x0f0f0f0f) << 4);
 v = ((v & 0xcccccccc) >> 2) | ((v & 0x33333333) << 2);
 v = ((v & 0xaaaaaaaa) >> 1) | ((v & 0x55555555) << 1);
 return v;
}

という関数をPS_PAD.cpp内に作成し、ヘッダファイルで宣言してあげたら rbit関数と同じ動作をすることが確認できました。

これで何とかなりそうです。ありがとうございます。

posted by Ko hei 23 Apr 2016