2016-11-23 10 views
1

Я использую процессор nrf52 microcontroller (CORTEX 34F). У меня есть переменная проверка основного цикла, которая модифицируется как в основном цикле, так и в процедуре прерывания таймера.- ключевое слово volatile действительно необходимо, когда переменная изменена в процедуре прерывания

  1. главная проверка цикла, если переменная является истинным:

    • выполнение кода условия

    • набор переменной ложной

  2. таймера прерывания рутинного набора переменных к истине каждый 10 мс

без volatile ключевого слова, код кажется не работает, но когда я установил переменную volatile, кажется, работает, но я не уверен, потому что:

  1. первый я думаю кора M4f не содержит кэш данных память
  2. второй: этот случай handeld компилятором (рука Keil)

любой ответ пожалуйста;

если верно выполнить код тела 2. Элемент списка

+0

Да, это необходимо – Fredrik

+1

Ответ здесь http://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c – dkolmakov

+2

@dkolmakov: Это более или менее дубликат, но принципиально, возможно, не устраняет непонимание между аппаратной функцией * кэш-памяти * и программным способом * «кэширования значения в регистре» *. – Clifford

ответ

10

У вас есть недоразумение относительно volatile ключевого слова; в частности, это не, связанный с кешированием - согласованность кеша полностью обрабатывается аппаратными средствами, а volatile не влияет на это.

Целью volatile является предотвращение создания компилятором кода, предполагающего, что значение не может быть изменено. Язык C не обеспечивает поддержку потоков выполнения, и код генерируется так, как если бы существовал один поток; если компилятор может наблюдать в одном потоке выполнения, что переменная не была явно изменена, она может удалить явное чтение и использовать уже известное значение (например, хранится в регистре).

Код в вашей функции main() «не осознает», что прерывание может возникать между чтением и поэтому может оптимизировать чтение. Ключевое слово volatile инструктирует компилятор генерировать код для явного чтения памяти. Не имеет значения, так или иначе, является ли это чтение результатом использования кеша или промаха или если кеша вообще нет - это проблема с оборудованием.

Вы можете извлечь выгоду из чтения Introduction to the volatile keyword на Embedded.com. Он покрывает точно эта проблема.

0

Добавляя к вышеуказанному комментарию, большинство разработчиков приложений путаются о действительности следующего оператора. Смятение возникает из-за существования волатильности и ключевого слова const в декларации. Как может быть переменная const, но нестабильная?

volatile const char * const ptr = 0x4000;

Важно понимать, что volatile указывает, что переменная может изменяться вне рамок программы. Вышеуказанный оператор/аналогичный оператор полезен для сопоставления аппаратных регистров устройства.