2013-04-17 49 views
3

我有这样的定义(这是从微控制器库,所以它看起来有点不同)位字段:C - 如何从位域接收一个位作为函数中的参数?

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的库。任何人都有想法如何以我喜欢的方式做到这一点?

回答

3
  1. C是一个传递价值的语言,所以即使你可以这样做:

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

    这将是一个空操作。

  2. 你可以做你用函数样的宏尝试什么:

    #define setbit(x) do { (x) = 1; } while(0) 
    

    如果调用此宏与PTAD_PTAD5,它应该像你期望的那样。

+0

是的,这就是我第一次做的。不幸的是,这个宏在嵌入式系统中的使用是有限的。但是,一个好主意! –

+1

限于什么意义? –

0

在C中,我不相信这是可以访问的位字段为一个数组。一个想法是传递枚举类型或常量,并将其值切换为8个不同的集合函数。不是最干净的方式,但我相信它会起作用。


#define PTAD5 5 
... 

void setbit(PTADSTR byte, int bit) 
{ 
    switch(bit) 
    { 
     ... 
     case PTAD5 : byte.PTAD5 = 1; break; 
     default: ASSERT_ALWAYS(); break; 
    } 
} 
2

因为你可以访问你的位域位单独设置一个位是很容易的:

_PTAD_PTAD5 = 1; 

这会,感谢#define _PTAD_PTAD5,评估为

_PTAD.Bits.PTAD5 = 1; 

注意由于C是一个传递由值语言,

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

doen't做你的期望。相反,它将(函数)局部变量Bit设置为1,将您发送给它的变量保持不变。

通常你会使用一个指针到您想要的功能来改变一个变量,而是因为你不能把一个位的地址位域,你不能这样做,在这种情况下。

0

这个怎么样? 使用静态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); 

} 
相关问题