我正在尝试更改 lpc2138 的 IAR 特定头文件,以便它可以与 Visual Studio 2008 一起编译(以启用兼容的单元测试)。
我的问题涉及将寄存器定义转换为独立于硬件(不在内存地址)
“IAR 安全宏”是:
#define __IO_REG32_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT) \
volatile __no_init ATTRIBUTE union \
{ \
unsigned long NAME; \
BIT_STRUCT NAME ## _bit; \
} @ ADDRESS
//declaration
//(where __gpio0_bits is a structure that names
//each of the 32 bits as P0_0, P0_1, etc)
__IO_REG32_BIT(IO0PIN,0xE0028000,__READ_WRITE,__gpio0_bits);
//usage
IO0PIN = 0x0xAA55AA55;
IO0PIN_bit.P0_5 = 0;
这是我可比较的“硬件独立”代码:
#define __IO_REG32_BIT(NAME, BIT_STRUCT)\
volatile union \
{ \
unsigned long NAME; \
BIT_STRUCT NAME##_bit; \
} NAME;
//declaration
__IO_REG32_BIT(IO0PIN,__gpio0_bits);
//usage
IO0PIN.IO0PIN = 0xAA55AA55;
IO0PIN.IO0PIN_bit.P0_5 = 1;
这可以编译并且可以工作,但很明显我的“硬件独立”用法与“IAR 安全”用法不匹配。
如何更改宏,以便可以像在 IAR 中一样使用 IO0PIN?我觉得这是一个简单的匿名工会问题,但多次尝试和变体已被证明是不成功的。也许 IAR GNU 编译器支持匿名联合,而 vs2008 不支持。
谢谢你。