Intereting Posts
Что такое современный термин для «эквивалентности массива / указателя»? C с использованием сигналов для остановки дочерних процессов Лучший алгоритм для разбиения ведущих и конечных пробелов в C Почему calloc требует два параметра, а malloc – один? Вызовите void * как функцию без объявления указателя функции Функции препроцессора, оцененные во время компиляции в C Сплит Связанный список FLOPS Ядро Intel и тестирование его с помощью C (internalproduct) Visual-C ++ встроенная ассемблерная разница двух смещений Обнаружение присутствия или отсутствия аргументов в макросе C GetVolumeInformation () не сообщает FILE_READ_ONLY_VOLUME для заблокированной SD-карты без какой-либо файловой системы Какие замены доступны для ранее поддерживаемых моделей поведения, не определенных стандартом C Использование strtol для проверки целочисленного ввода в ANSI C Сфера, скрывающаяся в C Буфер RECV пуст, но возвращает значение> 1

Где использовать летучие?

Я читал о volatile ключевом слове, но я не знаю, в каких ситуациях я должен его использовать.

Когда память (переменная) обновляется, и процесс не знает об этом?

В каких случаях драйверы должны использовать изменчивые переменные?

Самый распространенный случай в моем мире – это когда вы программируете микроcontrollerы, которые используют ввод-вывод с отображением памяти. Значение в регистре может меняться из-за внешних цифровых входов, но если вы не объявляете переменную как volatile , компилятор может полностью оптимизировать код, и вам будет интересно, почему ничего не работает.

Мэтт предположил, что я приукрашиваю заявление о том, что код «оптимизирован». Доступ к карте памяти ввода / вывода осуществляется через код через указатели. Если вы хотите проверить состояние кнопки, вы, как правило, побитовое И значение регистра с битовой маской для кнопки. Если вы не укажете volatile, компилятор скажет: «Эй, ваш код никогда не меняет значение этого указателя, поэтому я просто удалю этот оператор, где вы побитовое ANDed, потому что значение всегда тот же самый!”.

Надеюсь, это немного облегчит мое заявление. Спасибо за предложение, Мэтт.

Поскольку вы отметили это тегом linux-device-driver , некоторые конкретные рекомендации для кодирования в ядре Linux, возможно, в порядке.

В общем, вам не нужно писать volatile в вашем коде ядра Linux. В случаях, когда может потребоваться volatile , его использование завершается в основных функциях ядра, которые вы должны вызвать вместо этого. Например, если вы делаете ввод-вывод с ioremap() , тогда вы должны использовать ioremap() , writel() , readl() и т. Д.

Помимо того, что говорили другие, ключевое слово volatile обычно предотвращает форматирование компилятора. В некоторых записанных в память регистры, где значение регистров хранится в chinagin, как и значение времени rtc, используется изменчивое ключевое слово. Взгляните на этот пример:

 RTC_CLOCK _time; TIME _currentTime = _time ; while(_currentTime - _time >= 100) { //Do something } //rest of the code 

Если мы не добавим ключевое слово volatile до TIME, этот код будет выглядеть следующим образом: _currentTime – _time = 0, и компилятор не будет рассматривать цикл while ниже него.

 RTC_CLOCK _time; TIME _currentTime = _time ; //rest of the code 

для предотвращения этого мы должны использовать ключевое слово volatile с TIME.

Это может быть полезно для вас

http://www.kcomputing.com/volatile.html

Неустойчивые переменные – это переменные, которые могут быть изменены в любой момент, если программа не знает об этом.

Я не могу придумать никакого использования ключевого слова volatile в повседневном программировании, но это может произойти.

Насколько мне известно, в C следует использовать ключевое слово volatile где выполняются параллельные несинхронизированные операции над переменной из нескольких источников (процесса). Если переменная объявлена volatile , то все процессы всегда будут напрямую обращаться к переменной из ее местоположения памяти, в отличие от копирования этой переменной в кэш микропроцессора и доступа к ней оттуда.
Обратите внимание, что это значительно снизит производительность для этой конкретной переменной. Время доступа для переменных в памяти составляет миллисекунды, тогда как для 1-го уровня или 2-го уровня кеш-переменных оно составляет около десятых долей наносекунд, поэтому используйте их только тогда, когда будут рассмотрены все другие варианты.