ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
テック
記事: 3
登録日時: 8年前

ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

#1

投稿記事 by テック » 8年前

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を使用しています。
ご存知に方、ご回答宜しくお願いいたします。

かずま

Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

#2

投稿記事 by かずま » 8年前

ARM ではどうなるかわかりませんが、Intel なら、

コード:

#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;
}
実行結果

コード:

>> 12
 0 0 0 1 0 0 1 0
>> a7
 1 0 1 0 0 1 1 1
>> 5d
 0 1 0 1 1 1 0 1
>> .
ビットフィールドの順序は処理系依存ですが、ARM ではどうなりますか?

non
記事: 1097
登録日時: 13年前

Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

#3

投稿記事 by non » 8年前

>この任意ビットを8個集め、unionとstructを使用して、バイトアクセスをしたいのですが、可能でしょうか?

ビットが連続していないということでしょうか?
non

テック
記事: 3
登録日時: 8年前

Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

#4

投稿記事 by テック » 8年前

おっしゃる通り、ビットが連続していないので、バイトでアクセルをしたいのが主旨です

non
記事: 1097
登録日時: 13年前

Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

#5

投稿記事 by non » 8年前

私は思いつきません。もっと詳しい方の、返事を待って下さい。
non

かずま

Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

#6

投稿記事 by かずま » 8年前

テック さんが書きました:おっしゃる通り、ビットが連続していないので、バイトでアクセルをしたいのが主旨です
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;
}

テック
記事: 3
登録日時: 8年前

Re: ARMにて、ビット操作をバイト操作に変換する定義方法を教えてください。

#7

投稿記事 by テック » 8年前

かずまさん有難う御座います。
かずまさんの方法を使わせていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る