Доступ к отображенному в памяти регистру

Предположим, что устройство с отображенной памятью находится по адресу 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
}

Правильный ли этот подход? Большое спасибо.

0

Решение

Ваш подход почти правильный. Единственная недостающая часть — как указано в комментариях к вопросу — это добавление volatile к типу указателя так:

volatile unsigned char * control_register_ptr = ...

Я также сделал бы это unsigned char, поскольку это обычно лучше подходит, но это, в принципе, не так сильно отличается (единственное значимое отличие будет при смещении значения вниз).

volatile ключевое слово сигнализирует компилятору о том, что значение по этому адресу может измениться извне программы (т. е. из-за кода, который компилятор не видит и не знает.) Это сделает компилятор более консервативным в оптимизации загрузки и хранения, для пример.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]