- 締切済み
8個のビットを1バイトとして扱う方法
1バイトをビット扱いする方法は、 union un_p1dr { unsigned char one_byte ; struct { unsigned char b7:1 ; unsigned char b6:1 ; unsigned char b5:1 ; unsigned char b4:1 ; unsigned char b3:1 ; unsigned char b2:1 ; unsigned char b1:1 ; unsigned char b0:1 ; } bit ; } ; #define pt_da_p1dr (*(volatile union un_p1dr *)0xffffd0) と宣言すれば、pt_da_p1dr.bit.b7 = 1 ;の様にビット扱いが出来ます。 この反対を行える宣言方法は、あるでしょうか? つまり、任意の1ビットを8ビット集め、プログラムでバイトにてアクセスしたいのですが・・・・ ARMなどは、ビットの扱いが容易に可能です。しかし、CPUの周辺関係事情より、バイトでのアクセスが 可能なように、ハード割り当てが出来ません。 従って、現在は、プログラムにて、ビットを集め、バイトにして、アクセスしています。 なにか良い宣言方法があれば、ご伝授していただけないでしょうか? 宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- _kappe_
- ベストアンサー率68% (1581/2304)
「任意の1ビットを8ビット集め、バイトにてアクセス」っていうのは、例の中のb7は0x1000番地の3ビット目に対応、b6は0x1020番地の5ビット目、…みたいに指定して、one_byteに値を代入すると指定した各番地のビットが書き換わるみたいな仕組みが欲しいということでしょうか。 C言語の標準にはそういうものはないので、安心してこれまで通りのやり方を続けてください。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
普通は、 #define pt_da_p1dr(*(volatile union un_p1dr *)0xffffd0) のあとに、たとえば、 #define aPort pt_da_p1dr.bit.b7 と定義するだけですが。 「プログラムにて、ビットを集め、バイトにして、アクセスしています」の具体的なコードでもあれば、何かわかるかもしれませんが。 ただ、Cのレベルで、ビットアクセスできても、CPUがビット単位でアクセスしているかどうかは、また、別の話ではあります。
補足
すいません。解りづらいので、補足させて頂きます。 ARMの場合、下記の通りポートAの0ビット宣言は、 #define PORTA_0 *((volatile unsigned int*)(0x42668080UL)) と宣言されています。 この様なポートを8ビットにまとめたいのですが・・・ 出力プログラムを組むと下記の様に成ります。 void bit_byte(char data) { if( data & 0x01 ) PORTA_0 = 1 ; //ポートAの0ビットに出力 else PORTA_0 = 0 ; if( data & 0x02 ) PORTC_5 = 1 ; //ポートCの5ビットに出力 else PORTC_5 = 0 ; if( data & 0x04 ) PORTD_1 = 1 ; //ポートDの1ビットに出力 else PORTD_1 = 0 ; . .(3~6ビットは、省略) . if( data & 0x80 ) PORTA_7 = 1 ; //ポートAの7ビットに出力 else PORTD_7 = 0 ; } void main(void) { bit_byte(0x26) ; //0x26を出力する } このbit_byte関数を、宣言でバイトに各任意のビット指定をし、 下記の様に組めないでしょうか? abc = 0x26 ; bit_byteの関数は、一見で解かる様に書いたので、 この関数の組み方での指摘は、しないでください。 ご存知でしたら、是非、教えて頂きたいと思います。 宜しくお願いいたします。