首页 > 技术文章 > IAR中 C语言位定义

noble 2014-06-12 14:36 原文



__IO_REG8_BIT( SYS,             0xFFFFF802, __READ_WRITE )

#define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE)                 \

                      __near __no_init volatile ATTRIBUTE union \

                        {                                       \

                          unsigned char NAME;                   \

                          __BITS8 NAME ## _bit;                 \ // ## _bit ?? ## 可以连接前后

                                                                               //比如 NAME 是 a,这句就//是    __BITS8   a_bit;

                        } @ ADDRESS;

typedef struct

{

    unsigned char no0:1;

    unsigned char no1:1;

    unsigned char no2:1;

    unsigned char no3:1;

    unsigned char no4:1;

    unsigned char no5:1;

    unsigned char no6:1;

    unsigned char no7:1;

} __BITS8;

__near

Syntax Follows the generic syntax rules for memory type attributes that can be used on data

objects, see Type attributes, page 193.

Description The __near memory attribute overrides the default storage of variables given by the

selected data model and places individual variables and constants in near memory. You

can also use the __near attribute to create a pointer explicitly pointing to an object

located in the near memory.

Storage information Address range: 0x0-07FFF and 0xFFFF8000-0xFFFFFFFF (64 Kbytes)

Example __near int x;

See also Memory types, page 13.

__no_init

Syntax Follows the generic syntax rules for object attributes, see Object attributes, page 195.

Description Use the __no_init keyword to place a data object in non-volatile memory. This means

that the initialization of the variable, for example at system startup, is suppressed.

Example __no_init int myarray[10];

#define PRERR             SYS_bit.no0

以下转自http://renesasrulz.spaces.eepw.com.cn/articles/article/item/69883

在stdbool.h中,定义了一个位宏,如果需要变量定义,就是如下:
bool abit;
abit就是一个位变量了,这种方法简单,但是在多个位的时候不好处理,比如需要一批位变量
初始化的时候。
还可以采用如下方法:
typedef struct
{
    unsigned char no0:1;
    unsigned char no1:1;
    unsigned char no2:1;
    unsigned char no3:1;
    unsigned char no4:1;
    unsigned char no5:1;
    unsigned char no6:1;
    unsigned char no7:1;
} __BIT8 ;
volatile union { unsigned char strack; __BIT8 strack_bit; } ;
union { unsigned char sk; __BIT8 sk_bit; } ;
定义位:
#define mflag        strack_bit.no0

volatile union { unsigned char strack; __BIT8 strack_bit; } ;
中加上VOLATILE,如果发现给编译器优化掉,就一定要加上,
strack 就是一个可按位操作的变量,
strack=0;就可以把所有8个位全部清零,比起BOOL方便一些。

推荐阅读