const
означает, что переменная не может быть изменена кодом c, но не может быть изменена.Это означает, что никакая инструкция не может записать в переменную, но ее значение все еще может измениться.
volatile
означает, что переменная может измениться в любое время и, следовательно, кэшированные значения не могут использоваться;каждый доступ к переменной должен выполняться по ее адресу в памяти.
Поскольку вопрос помечен как «встроенный», и предполагается, что temp
является объявленной пользователем переменной, а не аппаратным регистром (так как обычно этообрабатывается в отдельном файле .h), рассмотрим:
Встроенный процессор, который имеет как энергозависимую память для чтения-записи (RAM), так и энергонезависимую постоянную память для данных, например, FLASH-память в von-Neumannархитектура, в которой данные и пространство программ совместно используют общую шину данных и адресов.
Если вы объявляете const temp
значением (по крайней мере, если оно отличается от 0), компилятор назначит переменную адресу вFLASH-пространство, поскольку даже если он был назначен адресу RAM, ему все еще требуется флэш-память для хранения начального значения переменной, что делает адрес RAM пустой тратой пространства, поскольку все операции доступны только для чтения.
В результате:
int temp;
- это переменная, хранящаяся в ОЗУ, инициализируемая в 0 при запуске (cstart), кэшированные значения могут бытьused.
const int temp;
- переменная, хранящаяся во флэш-памяти (только для чтения), инициализированная значением 0 во время компиляции, могут использоваться кэшированные значения.
volatile int temp;
- переменная, хранящаяся вОЗУ, инициализированное в 0 при запуске (cstart), кэшированные значения НЕ будут использоваться.
const volatile int temp;
- переменная, хранящаяся во флэш-памяти (только для чтения), инициализированная в 0 во время компиляции, кэшированные значения НЕ будутиспользоваться
Вот полезная часть:
В настоящее время большинство встроенных процессоров имеют возможность вносить изменения в свою постоянную память только для чтения с помощью специального функционального модуля, в этом случаеconst int temp
можно изменить во время выполнения, но не напрямую.Другими словами, функция может изменить значение по адресу, где хранится temp
.
Практическим примером будет использование temp
для серийного номера устройства.При первом запуске встроенного процессора значение temp
будет равно 0 (или объявленному значению), и функция может использовать этот факт для запуска теста во время производства, а в случае успеха попросить присвоить серийный номер и изменить значение.temp
с помощью специальной функции.Некоторые процессоры имеют специальный диапазон адресов с OTP (одноразовой программируемой) памятью только для этого.
Но здесь возникает разница:
Если const int temp
является изменяемым идентификатором вместо одноразового программируемого серийного номера и НЕ объявляется volatile
, может использоваться кэшированное значениедо следующей загрузки, это означает, что новый идентификатор может быть недействительным до следующей перезагрузки, или, что еще хуже, некоторые функции могут использовать новое значение, в то время как другие могут использовать более старое кэшированное значение до перезагрузки.Если const int temp
IS объявлено voltaile
, изменение идентификатора вступит в силу немедленно.