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