Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
21.08.2011, 18:58
|
|
Прописка
Регистрация: 27.10.2010
Сообщений: 133
Сказал спасибо: 24
Сказали Спасибо 53 раз(а) в 41 сообщении(ях)
|
Re: Когда нужно volatile?
testerplus знаете дело в чем! Я просто пытаюсь понять когда стоит писать volatile а когда это ошибка.читаю сейчас это http://crossplatform.ru/node/183есть вопрос можно ли достоверно назвать код с несколькими функциями "многопоточная программа"?
__________________
- Слово на "б" знаешь ? - ??? - "Береги себя"...
|
|
|
|
21.08.2011, 19:00
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Когда нужно volatile?
Сообщение от testerplus
|
Пройдет год или 2 - и выйдет новая версия CV с улучшенной оптимизаций, и Ваша программа начнет падать.
|
Добавлю... чуток...
Или закинуть исходник в другой компилятор... и долго думать, почему прога не работает... или работает не так...
Как в посту #1 ...
|
|
|
|
21.08.2011, 19:10
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Когда нужно volatile?
Сообщение от neox-neox
|
можно ли достоверно назвать код с несколькими функциями "многопоточная программа"?
|
Уффф... Ну и навернули вопросик, даже не знаю, как ответить, чтобы кратко Ибо статейку Вы выбрали, ну, скажем так, не совсем для микроконтроллеров.
В первом приближении могопоточной программа для авр'а становится тогда, когда в ней появляются обработчики прерываний. Т.е. когда функция (не важно, много их в программе или всего одна main) может быть прервана в произвольном месте без ее ведома. Если она сама вызывает другие функции, то это не многопоточность. Ваша программа в первом посте - многопоточная, а в 8-м - нет.
Другой вариант многопоточности - работа под управлением многозадачной ОС (операционной системы) (часто называют RTOS), когда несколько функций работают параллельно, прерывая друг друга.
|
|
|
|
21.08.2011, 19:14
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Когда нужно volatile?
Сообщение от neox-neox
|
Я просто пытаюсь понять когда стоит писать volatile а когда это ошибка.
|
Лишний волатайл - это не ошибка. Отсутствующий - ошибка. Все аспекты проблем, возникающих из-за отсутствия volatile там, где надо, описаны в статье, которую я Вам дал.
|
|
|
|
21.08.2011, 19:20
|
|
Прописка
Регистрация: 27.10.2010
Сообщений: 133
Сказал спасибо: 24
Сказали Спасибо 53 раз(а) в 41 сообщении(ях)
|
Re: Когда нужно volatile?
ААА testerplus теперь все ясно!!! большое спасибо!!! последний ваш ответ расставил все точки!А не могли бы вы показать примерчик когда несколько функций работают параллельно, так для общего образования? хоть под какую плутформу
__________________
- Слово на "б" знаешь ? - ??? - "Береги себя"...
Последний раз редактировалось neox-neox; 21.08.2011 в 19:23.
|
|
|
|
21.08.2011, 19:24
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Когда нужно volatile?
Сообщение от neox-neox
|
Я просто пытаюсь понять когда стоит писать volatile а когда это ошибка.
|
Не так это всё просто... к сожалению... На пальцах все нюансы не объяснишь...
Есть правила в каких случаях обязательно нужен volatile, а есть случаи, когда volatile, как выход из сложившейся ситуации...
У меня был случай, когла компилятор тупо убивал параметр простой функции... Функция выполнялась один раз... и на этом всё...
|
|
|
|
21.08.2011, 19:37
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Когда нужно volatile?
Сообщение от neox-neox
|
А не могли бы вы показать примерчик когда несколько функций работают параллельно, так для общего образования?
|
Вот пример, не вникайте в содержание темы, оно там боком, но две функции task1 и task2 будут работать параллельно. Там нет RTOS, только чисто Си-шные приемы.
|
|
|
|
22.08.2011, 13:08
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Когда нужно volatile?
Сообщение от testerplus
|
Лишний волатайл - это не ошибка. Отсутствующий - ошибка.
|
Отсутствующий - ошибка, а лишний - некорректность. По сути вы запретите компилятору выполнять оптимизацию в части данной переменной. И это неправильно! Иначе у вас возникнет желание все переменные так объявить.
С другой стороны вам тут напустили тумана ... а на самом деле берёте учебник по Си и читаете определение ... По памяти примерно выглядит так: квалификатор для переменной, которая может быть изменена внешним образом, по отношению к описываемому процессу.
Типичный пример
for( ;; )
{
if(iii›N) break;
.....
}
Если переменная не volatile, нормальный компилятор вынесет if за цикл.
Очевидно что помещение в цикл данной переменной имеет смысл только тогда, когда переменная может измениться "внешним образом" по отношению к написанной проге. В цикле то она не меняется!
Когда это возможно? Ну например это порт ввода или переменная которая меняется в прерывании ...
То есть вы это должны автоматом видеть прямо в момент написания программы. Вы её пишите уже с расчётом этого.
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
23.08.2011, 12:40
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Когда нужно volatile?
Я бы не советовал в таких сложных вопросах, как volatile (тут и профессионалы бывает ошибаются), обращаться к учебникам. То, что Вы процитировали из учебника, - это одно из применений volatile. А вообще этот квалификатор просто запрещает выполнять оптимизацию при работе с объектами (в основном с переменными, но не только).
Вот пример за рамками Вашего определения:
Код:
|
unsigned char i;
// Ищем нулевой элемент в массиве
for (i = 0; i ‹ 64; i++) if (Data[i] == 0x00) break;
if (i == 64) ...; // Если не нашли, то ... |
В этом коде есть ошибка: компилятор запросто может развернуть порядок счета, если посчитает, что так будет эффективнее, и тогда при отсутствии 0x00 в массиве i будет равна не 64, а 0xFF (или 0, в зависимости от реализации).
P.S.
Сообщение от SasaVitebsk
|
Отсутствующий - ошибка, а лишний - некорректность
|
Это не некорректность. Программа будет работать абсолютно правильно., просто немного снизится эффективность оптимизации.
Последний раз редактировалось testerplus; 23.08.2011 в 22:43.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:55.
|
|