##_##'freescale codewarrior的PE中生成的宏定义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
##_##'freescale codewarrior的PE中生成的宏定义(2010-10-09 21:49:14)转载▼
标签:杂谈分类:C
在使用freescale codewarrior的PE功能自动生成的project中会生成好像这样的宏,例:#define setRegBit(reg, bit) (reg |= reg##_##bit##_##MASK)
其中'##_##'这个符号比较奇怪,在C语言中,我从来没见过...(哈哈,可能是我见识太少了,请各位见谅)。
之后,我结合,芯片的header file一起看,发现'##'的作用就像是连接符号一样,就是说,(reg |= reg##_##bit##_##MASK) == reg |=reg_bit_MASK(寄存器名_位号_MASK)。
原因如下:
寄存器在header file中的定义格式如下:
typedef union {
byte Byte;
struct {
byte PE0 :1;
byte PE1 :1;
byte PE2 :1;
byte PE3 :1;
byte PE4 :1;
byte PE5 :1;
byte PE6 :1;
byte PE7 :1;
} Bits;
} PORTESTR;
extern volatile PORTESTR _PORTE @(REG_BASE + 0x00000008);
#define PORTE _PORTE.Byte
#define PORTE_PE0 _PORTE.Bits.PE0
#define PORTE_PE1 _PORTE.Bits.PE1
#define PORTE_PE2 _PORTE.Bits.PE2
#define PORTE_PE3 _PORTE.Bits.PE3
#define PORTE_PE4 _PORTE.Bits.PE4
#define PORTE_PE5 _PORTE.Bits.PE5
#define PORTE_PE6 _PORTE.Bits.PE6
#define PORTE_PE7 _PORTE.Bits.PE7
#define PORTE_PE0_MASK 1
#define PORTE_PE1_MASK 2
#define PORTE_PE2_MASK 4
#define PORTE_PE3_MASK 8
#define PORTE_PE4_MASK 16
#define PORTE_PE5_MASK 32
#define PORTE_PE6_MASK 64
#define PORTE_PE7_MASK 128
其中,红色部分就相当于(寄存器名_位号_MASK);所以,暂且将,'##'理解为连接符号,才疏学浅,还望大家指教。
高手解答:
##是C里的宏连接符
#define setReg8Bit(RegName, BitName) (RegName |= RegName##_##BitName##_##MASK)
则:
setReg(thisReg,thisBit);
等效于:
thisReg |= thisReg_thisBit_MASK;
转自:/s/blog_6471e1bb0100mo9r.html。