3

私はそのように定義されたビットフィールドを持っています (これはマイクロコントローラライブラリからのものなので、少し異なって見えます):

typedef union {
    byte Byte;
    struct {
        byte PTAD0       :1;
        byte PTAD1       :1;                                       
        byte PTAD2       :1;
        byte PTAD3       :1;
        byte PTAD4       :1;
        byte PTAD5       :1;
        byte             :1;
        byte             :1;
    } Bits;
} PTADSTR;
extern volatile PTADSTR _PTAD @0x00000000;
#define PTAD                            _PTAD.Byte
#define PTAD_PTAD0                      _PTAD.Bits.PTAD0
#define PTAD_PTAD1                      _PTAD.Bits.PTAD1
#define PTAD_PTAD2                      _PTAD.Bits.PTAD2
#define PTAD_PTAD3                      _PTAD.Bits.PTAD3
#define PTAD_PTAD4                      _PTAD.Bits.PTAD4
#define PTAD_PTAD5                      _PTAD.Bits.PTAD5

そう。次のように、ビットを設定する関数が必要だとしましょう。

void setbit(bit Bit) {
     Bit = 1;
}

もちろん、「ビット」宣言は機能しません。使用できる宣言が欲しい

setbit(PTAD_PTAD5)

そして、このビットを設定します。私はそれをできた

void setbit(byte Byte, byte number) {
     Byte |= 1<<(number);
}

そして送る

setbit(PTAD,5);

それは完全に機能しますが...それは私が望んでいるものではありません.Arduinoのライブラリのようなことをしたいからです. 私が好む方法でそれを行う方法を知っている人はいますか?

4

4 に答える 4

0

これはどう?static const 修飾子を使用すると、メモリ オーバーヘッドがほぼゼロになります。

typedef struct
{
    uint8_t* reg;
    uint8_t bitnum;
}bit;

void setbit(bit b)
{
    *b.reg |= (1 << b.bitnum);
}

void clrbit(bit b)
{
    *b.reg &= ~(1 << b.bitnum);
}

static const bit PTAD_PTAD0 = {&PTAD, 0};
static const bit PTAD_PTAD1 = {&PTAD, 1};
static const bit PTAD_PTAD2 = {&PTAD, 2};
static const bit PTAD_PTAD3 = {&PTAD, 3};
static const bit PTAD_PTAD4 = {&PTAD, 4};
static const bit PTAD_PTAD5 = {&PTAD, 5};
static const bit PTAD_PTAD6 = {&PTAD, 6};
static const bit PTAD_PTAD7 = {&PTAD, 7};

int main()
{
    printf("PTAD: %02X\n", PTAD);
    setbit(PTAD_PTAD0);
    printf("PTAD: %02X\n", PTAD);
    clrbit(PTAD_PTAD0);
    printf("PTAD: %02X\n", PTAD);

}
于 2016-09-16T15:05:07.297 に答える