Хочешь ты "разместить переменные по фиксированным адресам". Но это - тот путь, который ты выбрал для решения своей задачи. А что за задача?
Так как слова про memory-mapped IO наводят на мысль, что *переменные* по фиксированным абресам располагать тебе не надо. А надо заставить сгенерировать обращения по неким адресам.
memory mapped IO во все времена во всех С делалось в одинаковом духе:
или так
#define CSR *((volatile unsigned char*)0xFE00)
#define DBR *((volatile unsigned char*)0xFE01)
...
while( !(CSR & 0x80) ) {}
data = DBR;
или сяк
#define CSR 0
#define DBR 1#define DEVICE1 ((volatile unsigned char*)0xFE00)
#define DEVICE1 ((volatile unsigned char*)0xFE80)
while( !(DEVICE1[CSR] & 0x80) ) {}
DEVICE2[DBR] = DEVICE1[DBR];
короче, насколько фантазии хватит