Предположим, что устройство с отображенной памятью находится по адресу 0x1ffff670. Регистр устройства имеет только 8 бит. Мне нужно получить значение в этом регистре, увеличить его на единицу и записать обратно.
Вот мой подход к этому,
В памяти я думаю, что так выглядит сценарий.
void increment_reg(){
int c;//to save the address read from memory
char *control_register_ptr= (char*) 0x1ffff670;//memory mapped address. using char because it is 8 bits
c=(int) *control_register_ptr;// reading the register and save that to c as an integer
c++;//increment by one
*control_register_ptr=c;//write the new bit pattern to the control register
}
Правильный ли этот подход? Большое спасибо.
Ваш подход почти правильный. Единственная недостающая часть — как указано в комментариях к вопросу — это добавление volatile
к типу указателя так:
volatile unsigned char * control_register_ptr = ...
Я также сделал бы это unsigned char
, поскольку это обычно лучше подходит, но это, в принципе, не так сильно отличается (единственное значимое отличие будет при смещении значения вниз).
volatile
ключевое слово сигнализирует компилятору о том, что значение по этому адресу может измениться извне программы (т. е. из-за кода, который компилятор не видит и не знает.) Это сделает компилятор более консервативным в оптимизации загрузки и хранения, для пример.
Других решений пока нет …