Отключение оптимизации устраняет проблему, но в этом нет необходимости. Более безопасная альтернатива - запретить компилятору оптимизировать хранилище с помощью спецификатора типа volatile
.
// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];
Спецификатор типа volatile
указывает компилятору строго соблюдать требования к хранению и загрузке памяти. Одна из целей volatile
- дать компилятору понять, что доступ к памяти имеет побочные эффекты и поэтому должен быть сохранен. В этом случае у хранилища есть побочный эффект, вызывающий ошибку страницы, и вы хотите, чтобы компилятор сохранил ошибку страницы.
Таким образом, окружающий код все еще может быть оптимизирован, а ваш код переносим на другие компиляторы, которые не понимают синтаксис GCC #pragma
или __attribute__
.