реклама на сайте
подробности

 
 
> Вопрос по volatile
Alt.F4
сообщение Jan 14 2017, 09:00
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Здравствуйте.
В очередной раз начитался про volatile + чудные компиляторы и насмотревшись "глупых" примеров родился вопрос: стоит ли указывать переменные и/или кольцевые буферы, используемые в прерывании, как volatile, если ни одна из переменных при объявлении не принимает значение, все необходимые начальные значения прописываются в отдельной функции (все изменения таких переменных в любом случае делаются атомарно, с запретом прерываний)?
Т.е. компилятор при работе с такими переменными (например, байтом флагов) в принципе не располагает информацией о их значениях, чтобы как-то вырезать условия с их проверкой, как изображается в примерах с неиспользованием volatile.
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Jan 16 2017, 13:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Alt.F4 @ Jan 14 2017, 12:00) *
В очередной раз начитался про volatile + чудные компиляторы и насмотревшись "глупых" примеров родился вопрос: стоит ли указывать переменные и/или кольцевые буферы, используемые в прерывании, как volatile, если ни одна из переменных при объявлении не принимает значение, все необходимые начальные значения прописываются в отдельной функции (все изменения таких переменных в любом случае делаются атомарно, с запретом прерываний)?

Атомарность тут не при чём.
Компилятор может например перенести значение переменной в регистр. И будете Вы в неё писать хоть атомарно, хоть нет, обработчик прерывания этого не знает когда захочет её прочитать из памяти где осталось старое значение.
Go to the top of the page
 
+Quote Post
Укушенный воблой
сообщение Jan 18 2017, 16:14
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 197
Регистрация: 8-07-16
Пользователь №: 92 484



Цитата(jcxz @ Jan 16 2017, 14:19) *
Атомарность тут не при чём.
Компилятор может например перенести значение переменной в регистр. И будете Вы в неё писать хоть атомарно, хоть нет, обработчик прерывания этого не знает когда захочет её прочитать из памяти где осталось старое значение.

Если переменная не объявлена как регистЕр, то никуда компилятор её не перенесёт. Не вводите людей в заблуждение.

А если я работаю с переменной через указатель на неё, то что?
Я должен такую переменную объявлять как волатайл?

Цитата(gerber @ Jan 16 2017, 17:55) *
Компилятор (и примкнувший к нему линкер) вообще ничего не знают про прерывания. Есть только функции, расположенные по определенным адресам. А то, что эти функции могут обрабатывать прерывания, и прерывать другие функции в любом месте, знает только разработчик на основе архитектуры контроллера, под который он пишет программу.
А в вашем примере и volatile не спасет, так как суммирование x и чисел N1,N2,N3 неатомарно.

Есть такая штука, называется "сохранение контекста прерванной задачи".
Хотя конечно есть двухбайтовые команды работы напрямую с РВВ, обращение к которым должно происходить в соседних тактах процессора.
Тогда ой. Нужно запрещать прерывания перед такой критической последовательностью команд.
Иначе вообше может произойти катастрофа если прерывание разорвет двухбайтовую последовательность команд

Цитата(Alt.F4 @ Jan 17 2017, 22:45) *
jcxz, вот именное такие: "например можете в цикле ждать когда установится некий флажок" (цитирую Вас же).

RobFPGA, по идее вообще без разницы, где эта переменная будет изменяться, что-то мы ходим по кругу...

Проблема: компилятор оптимизируя вырезает кусок кода считая его лишним.
На основании чего он это делает? Он знает, что некая переменная имеет в текущий момент определенное состояние.
Значит, если на входе функции мы не присваиваем ей какое либо значение и затем не проверяем эту переменную на другие значения (что для компилятора кажется безумным и он это режет), то и volatile не нужен.

Именно так. Именно для этого введен волатйл. Чтобы запретить компилятору "оптимизировать" (чаще всего просто удалять) куски кода, которые содержат якобы не изменяемые и не используемые переменные
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alt.F4   Вопрос по volatile   Jan 14 2017, 09:00
- - Lagman   Для 51 в кейле такое объяснение http://www.keil.co...   Jan 14 2017, 18:17
- - XVR   Чтения этих переменных делается напрямую или тоже ...   Jan 15 2017, 20:39
- - Alt.F4   Если вообще смотреть на проблемы в примерах, то он...   Jan 15 2017, 21:05
|- - zltigo   Цитата(Укушенный воблой @ Jan 18 2017, 18...   Jan 18 2017, 17:06
|- - Baser   Цитата(zltigo @ Jan 18 2017, 19:06) Никак...   Jan 18 2017, 18:09
- - SlavaV   Тогда и я своё видение изложу В документацию не л...   Jan 16 2017, 14:43
|- - jcxz   Цитата(SlavaV @ Jan 16 2017, 17:43) PS а ...   Jan 16 2017, 15:00
- - SlavaV   Переменная не "путешествует" во время вы...   Jan 16 2017, 15:14
|- - jcxz   Цитата(SlavaV @ Jan 16 2017, 18:14) Перем...   Jan 16 2017, 15:41
- - SlavaV   int x; void f() { x += N1; //1 ... x += N2; //2...   Jan 16 2017, 15:55
|- - Сергей Борщ   QUOTE (SlavaV @ Jan 16 2017, 17:55) вы сч...   Jan 16 2017, 16:44
|- - gerber   Цитата(SlavaV @ Jan 16 2017, 18:55) вы сч...   Jan 16 2017, 16:55
|- - jcxz   Цитата(gerber @ Jan 16 2017, 19:55) А в в...   Jan 16 2017, 17:40
- - Alt.F4   Снова приведен пример, как и во всех статьях. В ре...   Jan 16 2017, 17:10
- - XVR   Пример (https://gcc.godbolt.org/) Код (компилятор ...   Jan 16 2017, 19:03
- - Alt.F4   Цитата... Дальше например можете в цикле ждать ког...   Jan 17 2017, 07:57
|- - jcxz   Цитата(Alt.F4 @ Jan 17 2017, 10:57) Если ...   Jan 17 2017, 14:01
- - RobFPGA   Приветствую! Не забывайте о том что не только...   Jan 17 2017, 14:20
- - Alt.F4   jcxz, вот именное такие: "например можете в ц...   Jan 17 2017, 21:45
|- - jcxz   Цитата(Alt.F4 @ Jan 18 2017, 00:45) Значи...   Jan 18 2017, 08:39
- - Kabdim   А если включить lto то оптимизироваться будет совс...   Jan 18 2017, 08:44
- - Alt.F4   jcxz, сейчас я тоже начну вас оскорблять Изменять...   Jan 18 2017, 10:53
|- - jcxz   Цитата(Alt.F4 @ Jan 18 2017, 13:53) jcxz,...   Jan 18 2017, 11:12
|- - RobFPGA   Приветствую! Цитата(Alt.F4 @ Jan 18 2017...   Jan 18 2017, 11:23
- - Alt.F4   jcxz, читаю "на входе в эту функцию, компилят...   Jan 18 2017, 11:24
|- - RobFPGA   Приветствую! Цитата(Alt.F4 @ Jan 18 2017,...   Jan 18 2017, 11:49
|- - Baser   Цитата(Alt.F4 @ Jan 18 2017, 13:24) jcxz,...   Jan 18 2017, 11:52
|- - jcxz   Цитата(Alt.F4 @ Jan 18 2017, 14:24) И как...   Jan 18 2017, 14:05
- - Alt.F4   RobFPGA, думаю, если буфер объявлен глобально, то ...   Jan 18 2017, 12:33
|- - Baser   Цитата(Alt.F4 @ Jan 18 2017, 14:33) Ну ка...   Jan 18 2017, 14:06
|- - RobFPGA   Приветствую! Цитата(Baser @ Jan 18 2017, ...   Jan 18 2017, 15:08
- - aiwa   Цитата(Alt.F4 @ Jan 17 2017, 23:45) RobFP...   Jan 18 2017, 13:54
- - DASM   Господа никогда не понимал таких споров. Процесс в...   Jan 18 2017, 14:32
- - Baser   Цитата(RobFPGA @ Jan 18 2017, 17:08) Прос...   Jan 18 2017, 16:38
- - Укушенный воблой   А если я работаю с переменной через указатель на н...   Jan 18 2017, 18:31
|- - jcxz   Цитата(Укушенный воблой @ Jan 18 2017, 21...   Jan 19 2017, 07:37
- - aiwa   Цитата(Укушенный воблой @ Jan 18 2017, 20...   Jan 18 2017, 22:36
|- - Укушенный воблой   Цитата(aiwa @ Jan 18 2017, 22:36) Правила...   Jan 19 2017, 04:18
|- - XVR   Цитата(Укушенный воблой @ Jan 19 2017, 07...   Jan 19 2017, 06:34
|- - Укушенный воблой   Цитата(XVR @ Jan 19 2017, 06:34) Нет. Ком...   Jan 19 2017, 17:24
|- - XVR   Цитата(Укушенный воблой @ Jan 19 2017, 20...   Jan 19 2017, 19:21
|- - Укушенный воблой   Цитата(XVR @ Jan 19 2017, 20:21) Так не б...   Jan 19 2017, 19:42
|- - XVR   Цитата(Укушенный воблой @ Jan 19 2017, 22...   Jan 19 2017, 19:52
- - Alt.F4   jcxz, а мне Ваши примеры напоминают троллинг, повт...   Jan 19 2017, 06:54
|- - jcxz   Цитата(Alt.F4 @ Jan 19 2017, 09:54) jcxz,...   Jan 19 2017, 07:09
|- - jcxz   Цитата(Alt.F4 @ Jan 19 2017, 09:54) Да и ...   Jan 19 2017, 07:18
- - Сергей Борщ   QUOTE (Alt.F4 @ Jan 19 2017, 08:54) Пока ...   Jan 19 2017, 07:11
- - Alt.F4   ЦитатаОчевидно что Вы и читать исходники не умеете...   Jan 19 2017, 07:32
- - Укушенный воблой   Вы ошибаетесь. Просто я не хочу обсуждать вкус уст...   Jan 19 2017, 20:30
|- - XVR   Цитата(Укушенный воблой @ Jan 19 2017, 23...   Jan 20 2017, 09:40
|- - AHTOXA   Цитата(XVR @ Jan 20 2017, 14:40) Требую п...   Jan 20 2017, 11:19
|- - zltigo   Цитата(AHTOXA @ Jan 20 2017, 13:19) Ну вы...   Jan 20 2017, 20:21
- - aiwa   Цитата(Alt.F4 @ Jan 19 2017, 09:32) Я не ...   Jan 20 2017, 04:17
|- - jcxz   Цитата(aiwa @ Jan 20 2017, 07:17) res_yes...   Jan 20 2017, 10:03
|- - Укушенный воблой   Цитата(aiwa @ Jan 20 2017, 05:17) 2. втор...   Jan 21 2017, 09:09
|- - XVR   Цитата(Укушенный воблой @ Jan 21 2017, 12...   Jan 23 2017, 10:13
- - ViKo   Побейтесь еще за пустой мешок!   Jan 20 2017, 09:57
- - aiwa   Цитата(jcxz @ Jan 20 2017, 12:03) Здесь к...   Jan 20 2017, 10:28
- - sigmaN   Цитата(Сергей Борщ @ Jan 19 2017, 10:11) ...   Jan 22 2017, 17:59
- - Укушенный воблой   Нет. Если с умом подходить к разработке программ...   Jan 25 2017, 15:51


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 22:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016