Я использую ядро на базе x86 для управления 32-битным регистром отображения памяти. Мое оборудование работает правильно только в том случае, если ЦП генерирует 32-битные операции чтения и записи в этот регистр. Регистр выровнен по 32-битному адресу и не может быть адресован с байтовой гранулярностью.
Что я могу сделать, чтобы гарантировать, что мой компилятор C (или C99) будет генерировать только полные 32-разрядные операции чтения и записи во всех случаях?
Например, если я выполняю операцию чтения-изменения-записи следующим образом:
volatile uint32_t* p_reg = 0xCAFE0000;
*p_reg |= 0x01;
Я не хочу, чтобы компилятор понимал, что изменяется только нижний байт и генерирует чтение / запись шириной 8 бит. Поскольку машинный код для 8-битных операций на x86 часто бывает более плотным, я опасаюсь нежелательных оптимизаций. Отключение оптимизации вообще не вариант.
----- РЕДАКТИРОВАТЬ -------
Интересный и очень актуальный документ: http://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf