У меня простой интерфейс с отображением памяти, и я хотел бы написать через
это значения для двух регистров, а затем прочитать их обратно. Следующий код
пример отлично работает:
volatile int *reg1 = (int *) 0x80000000;
volatile int *reg2 = (int *) 0x80000004;
*reg1 = 12; *reg2 = 23;
printf("reg1 = %i\n", *reg1);
printf("reg2 = %i\n", *reg2);
Вместо "жесткого кодирования" адресов, я хотел бы, чтобы адрес был
собрать из базового адреса и смещения. Используя какой-то препроцессор
заявления, я хочу иметь некоторые определения.
НАЧАЛО ОБНОВЛЕНИЯ
#define WriteReg(BaseAddress, RegOffset, Data) \
*((volatile int *)((char*)BaseAddress + RegOffset)) = (unsigned int)(Data)
#define ReadReg(BaseAddress, RegOffset, Data) \
(unsigned int)(Data) = *((volatile int *)((char*)BaseAddress + RegOffset))
WriteReg((int *) 0x80000000, 0, 18);
WriteReg((int *) 0x80000000, 4, 29);
WriteReg((int *) 0x80000000, 4, res);
printf("Reg2 = %i\n", res);
WriteReg((int *) 0x80000000, 0, res);
printf("Reg1 = %i\n", res);
КОНЕЦ ОБНОВЛЕНИЯ
Вывод теперь в любом случае 1073804536 вместо 12 и 23 соответственно.
Итак, я полагаю, что я сделал что-то ужасное с указателями, кто угодно
комментарий, как я могу правильно построить этот адрес с помощью оператора define?