<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Как использовать ключевое слово volatile</title>
		<description>Discuss Как использовать ключевое слово volatile</description>
		<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html</link>
		<lastBuildDate>Tue, 28 Apr 2026 17:32:37 +0000</lastBuildDate>
		<generator>JComments</generator>
		<atom:link href="https://chipenable.ru/index.php/component/jcomments/feed/com_k2/60.html" rel="self" type="application/rss+xml" />
		<item>
			<title>Crystaly says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-3434</link>
			<description><![CDATA[Да согласен атомарный доступ и volatile это разные вещи. Но я бы сказал, что они параллельны, а не перпендикулярны . Часто они взаимосвязаны и используются одновременно. Например, в вашем примере переменную count если она много-байтная, надо обеспечить не только volatile, но и атомарный доступ. Вот тут http://chipenable.ru/index.php/programming-avr/item/16-atomarnyy-dostup-k-peremennym нашел статью на эту тему. А если быть точнее, надо говорить не об атомарном доступе к переменным, а об атомарном исполнении (блоков) команд. Например, однобайтовая переменная может изменяться за три команды чтение-модифика ция-запись, и эти три команды должны быть выполнены все сразу, без прерывания.]]></description>
			<dc:creator>Crystaly</dc:creator>
			<pubDate>Thu, 14 Nov 2013 16:38:41 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-3434</guid>
		</item>
		<item>
			<title>САБ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-3433</link>
			<description><![CDATA[Это вопрос атомарного доступа. Он несколько перпендикулярен к volatile. Да, и на Си и на ассемблере этого можно достичь запретом прерываний. При чтении многобайтовой переменной можно обойтись без запрета - считать старший байт, затем считать младший, снова считать старший и сравнить с результатом предыдущего чтения. Если они равны - можно использовать результат. Если не равны - снова считать младший, старший, сравнить. Это несколько сложнее, чем запрещать прерывания, потому и используется очень редко, когда прерывания запрещать ну никак нельзя. В процессорах Cortex есть специальные инструкции LDREX/STREX для организации атомарного доступа, а в компиляторах Си для этих ядер - спец. функции для работы с этими инструкциями.]]></description>
			<dc:creator>САБ</dc:creator>
			<pubDate>Tue, 12 Nov 2013 10:40:42 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-3433</guid>
		</item>
		<item>
			<title>Crystaly says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-3430</link>
			<description><![CDATA[ Я подозреваю, что тут еще другая проблема - одновременный доступ к "ресурсам общего доступа". В данном случае это структура кольцевого буфера. Может так случиться, что доступ к буферу захотят два прерывания. Например, сount будет 2-байтовым, и команда count++ превратится как минимум в 2 команды ассемблера. Если во время выполнения count++ сработает прерывание между этими двумя командами, в котором выполнится count-- то значение count может оказаться испорченным. Правильное решение в ассемблере - запретить прерывания, поменять "переменные общего доступа", разрешить прерывания. А как это на Си сделать? Так-же временным запретом прерывания? А есть ли статьи здесь на эту тему?]]></description>
			<dc:creator>Crystaly</dc:creator>
			<pubDate>Mon, 11 Nov 2013 11:21:19 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-3430</guid>
		</item>
		<item>
			<title>DIMA says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-1547</link>
			<description><![CDATA[ВО_ВО моя проблема. Когда разрешаю глобально прерывания прога при определенной комбинации мигания диодами останавливается , даже на ресет не сбрасывается. Хотя локально все прерывания отключены и обработчики прерываний отсутствуют пока еще. И volatile не помогает. Разная оптимизация тоже не помогает. Не знаю куда еще рыть?]]></description>
			<dc:creator>DIMA</dc:creator>
			<pubDate>Wed, 22 Jun 2011 14:28:26 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-1547</guid>
		</item>
		<item>
			<title>Saxel says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-1277</link>
			<description><![CDATA[Спасибо за статью, при написании проектов на AVR с таким не сталкивался ни разу, а вот пришлось писать под PIC, возник затык. Код, который работает в эмуляторе, абсолютно не работает в процессоре. Volatile сильная штука, которая позволяет заставить код работать в железе.]]></description>
			<dc:creator>Saxel</dc:creator>
			<pubDate>Mon, 28 Feb 2011 09:14:01 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-1277</guid>
		</item>
		<item>
			<title>037 says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-730</link>
			<description><![CDATA[Ни разу не использовал volotile, в программе много функций, есть прерывание, использую максимальную оптимизацию, а программы все равно работают, блин, хотя есть много глобальных переменных, которые используются то там, то тут.]]></description>
			<dc:creator>037</dc:creator>
			<pubDate>Tue, 19 Oct 2010 14:51:27 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-730</guid>
		</item>
		<item>
			<title>Guest says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-495</link>
			<description><![CDATA[Пашганчик,здрав ия желаю!А про шину i2c не планируете ли начать повествование?]]></description>
			<dc:creator>Guest</dc:creator>
			<pubDate>Tue, 13 Jul 2010 17:00:12 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-495</guid>
		</item>
		<item>
			<title>Guest says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-479</link>
			<description><![CDATA[Приводите пример, обсудим. Обычно этим самым гамном оказывается уровень знаний программиста, у которого оптимизатор "тупо игнорирует". А если оптимизатор чуть-чуть не доработал, то он сразу превращается в "тупой компилятор, который не может соптимизировать такую простую конструкцию". А написать гамнокод можно хоть на ассемблере, хоть в кодах.]]></description>
			<dc:creator>Guest</dc:creator>
			<pubDate>Mon, 28 Jun 2010 13:15:22 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-479</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-459</link>
			<description><![CDATA[Это переводная статья и не мои похвалы. Я тоже считаю, что программист должен полагаться на свое знание языка и компилятора.]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Sun, 20 Jun 2010 05:57:05 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-459</guid>
		</item>
		<item>
			<title>Guest says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-458</link>
			<description><![CDATA[Добрый день, не смотря на ваши похвалы оптимизаторам, я считаю, что программист - сам должен оптимизировать код. А тупое игнорирование инструкции оптимизатором - это действительно тупо. Оптимизаторы - гамно. Простите за выражение - за то правдивое]]></description>
			<dc:creator>Guest</dc:creator>
			<pubDate>Sat, 19 Jun 2010 23:23:13 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-458</guid>
		</item>
		<item>
			<title>Guest says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-440</link>
			<description><![CDATA[Создание с нуля было бы довольно интересно, например под AVRProg.]]></description>
			<dc:creator>Guest</dc:creator>
			<pubDate>Tue, 08 Jun 2010 13:48:50 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-440</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-431</link>
			<description><![CDATA[Планирую. Вас интересует создание бутлоадера с нуля или использование готового?]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Mon, 31 May 2010 19:27:31 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-431</guid>
		</item>
		<item>
			<title>Guest says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-426</link>
			<description><![CDATA[Отличный сайт у вас, спасибо! За один вечер освоил написание простеньких программ (решил сделать восьмиразрядный счетчик с динамической индикацией для начала). Не планируете ли вы сделать описание для бут лоадера через com порт ПК? Было бы очень хорошим дополнением к статье про UART.]]></description>
			<dc:creator>Guest</dc:creator>
			<pubDate>Sun, 30 May 2010 10:04:50 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-426</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-417</link>
			<description><![CDATA[Спасибо за дельный комментарий. Каждый раз от вас узнаю что-нибудь новое.]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Mon, 24 May 2010 16:00:24 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-417</guid>
		</item>
		<item>
			<title>Guest says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-415</link>
			<description><![CDATA["очень длинный комментарий", бью на два сообщения: Неочевидно, но если cycleBuf, count и tail будут объявлены без volatile, то компилятор может как минимум переставить местами последние три строки Примерно так: uint8_t idx = tail; count++; tail++; cycleBuf[idx] = sym; И если после count++ случится прерывание - оно считает из cycleBuf совсем не то, что мы ожидаем.]]></description>
			<dc:creator>Guest</dc:creator>
			<pubDate>Mon, 24 May 2010 10:22:39 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-415</guid>
		</item>
		<item>
			<title>Guest says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-414</link>
			<description><![CDATA[Можно еще упомянуть о порядке доступа к volatile-переме нным (что компилятор не имеет права менять местами подобные обращения) и вытекающем из этого предупреждении, гененрируемом компилятором при использовании нескольких volatile-переме нных в одном выражении (из-за неопределнности порядка вычисления подвыражений). Из этого вытекает еще один случай, не рассмотренный вами в "На практике так ведут себя только три типа переменных". Есть еще четвертый - переменные, изменяемые в основном цикле и используемые в прерываниях. Вот пример из вашего кода для UART и кольцевого буфера: //кольцевой (циклический) буфер unsigned char cycleBuf[SIZE_B UF]; unsigned char tail = 0; unsigned char head = 0; unsigned char count = 0; void PutChar(unsigne d char sym) { if (count < SIZE_BUF){ cycleBuf[tail] = sym; count++; tail++;]]></description>
			<dc:creator>Guest</dc:creator>
			<pubDate>Mon, 24 May 2010 10:19:00 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html#comment-414</guid>
		</item>
	</channel>
</rss>
