2013-04-17 50 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); 

} 
相關問題