Стандарт C ничего не знает о кеш-памяти.Они относятся к конкретному приложению и выходят за рамки языка C.
Ключевое слово volatile
относится только к оптимизации, выполняемой компилятором.Компилятор должен убедиться, что операции с volatile
-квалифицированными переменными упорядочены в определенном порядке и не оптимизированы.
При чтении аппаратного регистра вы всегда должны использовать volatile
, иначе компилятор может принятьчто содержимое регистра никогда не изменяется с момента предыдущего использования.
Так что если в вашем примере ADDRESS_IN_MEMORY
- это число, соответствующее адресу, у вас есть ошибка, поскольку вы читаете его как *(uint32_t *)(ADDRESS_IN_MEMORY);
.Эта ошибка не имеет ни малейшего отношения к кеш-памяти.
Обработка кеш-памяти обрабатывается предсказанием ЦП / ветвления, а не компилятором и языком Си.И поэтому вы не можете влиять на него непосредственно из кода приложения, если вы не обращаетесь к регистрам MMU, где вы можете указать поведение.Это, конечно, очень специфично для системы.Настройка звуковой системы не загружает доступ к отображаемому в памяти аппаратному регистру доступа в кэш данных.
Однако вы можете написать код, удобный для кэша, последовательно обращаясь к памяти, всегда читая следующий соседний адрес сверху вниз, без каких-либоветви, которые могут изменить порядок доступа.