Я пытаюсь изменить специальный заголовочный файл IAR для lpc2138, чтобы он мог компилироваться с 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-safe» использованию.
Как изменить макрос, чтобы я мог использовать IO0PIN так же, как в IAR? Я чувствую, что это простое анонимное объединение, но многочисленные попытки и варианты оказались безуспешными. Возможно, компилятор IAR GNU поддерживает анонимные объединения, а vs2008 - нет.
Спасибо.