ARMでC言語を使用しています。
ARMのビット操作は、メモリマップで行っていますが、この任意ビットを8個集め、unionとstructを使用して、バイトアクセスをしたいのですが、可能でしょうか?
もし可能ならば、その宣言方法を教えてください。下記にこんな感じに組みたいプログラムを記述させて頂きます。ただし、コンパイルエラーが出たり、正常動作しませんが
参考にして頂ければ、幸いです。
code=c
union {
unsigned char byte_data ;
struct {
volatile unsigned int *b0:1 ;
volatile unsigned int *b1:1 ;
volatile unsigned int *b2:1 ;
volatile unsigned int *b3:1 ;
volatile unsigned int *b4:1 ;
volatile unsigned int *b5:1 ;
volatile unsigned int *b6:1 ;
volatile unsigned int *b7:1 ;
} bit_data = { &(bFM3_GPIO_PDOR3_P1),
&(bFM3_GPIO_PDOR3_P2),
&(bFM3_GPIO_PDOR3_P3),
&(bFM3_GPIO_PDOR3_PA),
&(bFM3_GPIO_PDOR3_PB),
&(bFM3_GPIO_PDOR3_PC),
&(bFM3_GPIO_PDOR3_PD),
&(bFM3_GPIO_PDOR3_PF) } ;
} data ;
void sub(void)
{
data.bit_data = 0x12 ;
}
/code
こんな感じで宣言したいのですが???
現在は、下記の様なプログラムを組んで対処していますが上記の様な方法がありませんか?
code=c
void bit_bytes( unsigned char data )
{
bFM3_GPIO_PDOR3_P1 = data ; data >>= data ;
bFM3_GPIO_PDOR3_P2 = data ; data >>= data ;
bFM3_GPIO_PDOR3_P3 = data ; data >>= data ;
bFM3_GPIO_PDOR3_PA = data ; data >>= data ;
bFM3_GPIO_PDOR3_PB = data ; data >>= data ;
bFM3_GPIO_PDOR3_PC = data ; data >>= data ;
bFM3_GPIO_PDOR3_PD = data ; data >>= data ;
bFM3_GPIO_PDOR3_PF = data ; data >>= data ;
{
/code
コンパイルは、keilを使用しています。
ご存知に方、ご回答宜しくお願いいたします。
ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。
Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。
ARM ではどうなるかわかりませんが、Intel なら、
実行結果
ビットフィールドの順序は処理系依存ですが、ARM ではどうなりますか?
#include <stdio.h>
union U {
unsigned char byte;
struct S {
unsigned int b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
} bits;
};
int main(void)
{
union U data;
while (printf(">> "), scanf("%hhx", &data.byte) == 1) {
printf(" %d", data.bits.b7);
printf(" %d", data.bits.b6);
printf(" %d", data.bits.b5);
printf(" %d", data.bits.b4);
printf(" %d", data.bits.b3);
printf(" %d", data.bits.b2);
printf(" %d", data.bits.b1);
printf(" %d\n", data.bits.b0);
}
return 0;
}
Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。
>この任意ビットを8個集め、unionとstructを使用して、バイトアクセスをしたいのですが、可能でしょうか?
ビットが連続していないということでしょうか?
ビットが連続していないということでしょうか?
non
Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。
おっしゃる通り、ビットが連続していないので、バイトでアクセルをしたいのが主旨です
Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。
16ビットのメモリ中の不連続なビットとバイトとの変換を、テック さんが書きました:おっしゃる通り、ビットが連続していないので、バイトでアクセルをしたいのが主旨です
シフト演算はでなく、ビットフィールドを使って行う例です。
いかがでしょうか?
#include <stdio.h>
union U {
unsigned char byte;
struct {
unsigned int b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
} bits;
};
#define X(data) ((union U *)&data)
unsigned char mem[2];
#define bFM3_GPIO_PDOR3_P1 (X(mem[0])->bits.b1)
#define bFM3_GPIO_PDOR3_P2 (X(mem[0])->bits.b2)
#define bFM3_GPIO_PDOR3_P3 (X(mem[0])->bits.b3)
#define bFM3_GPIO_PDOR3_PA (X(mem[1])->bits.b2)
#define bFM3_GPIO_PDOR3_PB (X(mem[1])->bits.b3)
#define bFM3_GPIO_PDOR3_PC (X(mem[1])->bits.b4)
#define bFM3_GPIO_PDOR3_PD (X(mem[1])->bits.b5)
#define bFM3_GPIO_PDOR3_PF (X(mem[1])->bits.b7)
void set_bits(unsigned char data) // byte -> bits
{
bFM3_GPIO_PDOR3_P1 = X(data)->bits.b7;
bFM3_GPIO_PDOR3_P2 = X(data)->bits.b6;
bFM3_GPIO_PDOR3_P3 = X(data)->bits.b5;
bFM3_GPIO_PDOR3_PA = X(data)->bits.b4;
bFM3_GPIO_PDOR3_PB = X(data)->bits.b3;
bFM3_GPIO_PDOR3_PC = X(data)->bits.b2;
bFM3_GPIO_PDOR3_PD = X(data)->bits.b1;
bFM3_GPIO_PDOR3_PF = X(data)->bits.b0;
}
unsigned char get_bits(void) // bits -> byte
{
union U x;
x.bits.b7 = bFM3_GPIO_PDOR3_P1;
x.bits.b6 = bFM3_GPIO_PDOR3_P2;
x.bits.b5 = bFM3_GPIO_PDOR3_P3;
x.bits.b4 = bFM3_GPIO_PDOR3_PA;
x.bits.b3 = bFM3_GPIO_PDOR3_PB;
x.bits.b2 = bFM3_GPIO_PDOR3_PC;
x.bits.b1 = bFM3_GPIO_PDOR3_PD;
x.bits.b0 = bFM3_GPIO_PDOR3_PF;
return x.byte;
}
int main(void)
{
int data, data2;
while (printf(">> "), scanf("%x", &data) == 1) {
set_bits(data);
printf(" bFM3_GPIO_PDOR3_P1 = %d\n", bFM3_GPIO_PDOR3_P1);
printf(" bFM3_GPIO_PDOR3_P2 = %d\n", bFM3_GPIO_PDOR3_P2);
printf(" bFM3_GPIO_PDOR3_P3 = %d\n", bFM3_GPIO_PDOR3_P3);
printf(" bFM3_GPIO_PDOR3_PA = %d\n", bFM3_GPIO_PDOR3_PA);
printf(" bFM3_GPIO_PDOR3_PB = %d\n", bFM3_GPIO_PDOR3_PB);
printf(" bFM3_GPIO_PDOR3_PC = %d\n", bFM3_GPIO_PDOR3_PC);
printf(" bFM3_GPIO_PDOR3_PD = %d\n", bFM3_GPIO_PDOR3_PD);
printf(" bFM3_GPIO_PDOR3_PF = %d\n", bFM3_GPIO_PDOR3_PF);
data2 = get_bits();
printf(" get_bits() = 0x%02x\n", data2);
}
return 0;
}
Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。
かずまさん有難う御座います。
かずまさんの方法を使わせていただきます。
かずまさんの方法を使わせていただきます。