CodeVisionAVR 2.60
23.01.2014, 11:14
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
|
А причём тут volatile? Компилятор сам без всяких volatile разместит в памяти, если нет свободных регистров.
|
Да над вами смеются в голос, а вы даже не замечаете.
Приведу пример.
Согласно приведённой вырезке (пост #50) из руководства: Все глобальные переменные расположены в ОЗУ.
Теперь представим кусок текста программы с какими-то глобальными переменными. Например вычисления с анализом в цикле. Надо понимать, что мы говорим об AVR, которая не имеет команд работы с памятью кроме загрузки/ выгрузки. Соответственно для ускорения работы необходимо предварительно загрузить глобальную переменную в регистры и только потом с ней работать. Только так можно обеспечить эффективность. Но таким образом мы не узнаем что переменная изменилась. Для того чтобы это узнать надо компилировать другим образом, обновлять переменную после каждой операции, что значительно замедляет программу. Например, исходя из того что операция с регистром 1 такт и 2 команды загрузки выгрузки по 2 такта, то в 5 раз. (В каждом конкретном случае разные цифры будут, потому как есть загрузка адреса хранения, переменные могут быть многобайтовые и так далее, но всё равно разница будет в разы).
Поэтому, если вы утверждаете, что volatile не нужен, то как бы автоматом признаёте, что компилятор дико не оптимально работает со всеми глобальными переменными. А глобальных переменных может быть вагон и маленькая тележка, при этом volatile может стоять лишь на паре переменных, которые связывают независимые участки программы между собой. Например флаг, что выполнено измерение АЦП, указание двигателю, что изменилась координата и так далее ...
|
|
|
|
23.01.2014, 13:21
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
Согласно приведённой вырезке (пост #50) из руководства: Все глобальные переменные расположены в ОЗУ.
Теперь представим кусок текста программы ... но всё равно разница будет в разы).
|
Не совсем так. При наличии свободных регистров, он в них помещает глобальные переменные, сколько поместятся.
Сообщение от SasaVitebsk
|
|
Поэтому, если вы утверждаете, что volatile не нужен, то как бы автоматом признаёте, что компилятор дико не оптимально работает со всеми глобальными переменными. А глобальных переменных может быть вагон и маленькая тележка, при этом volatile может стоять лишь на паре переменных, которые связывают независимые участки программы между собой. Например флаг, что выполнено измерение АЦП, указание двигателю, что изменилась координата и так далее ...
|
А вот тут что-то бессвязное и нелогичное.
volatile принудительно заставляет компилятор хранить переменную в памяти. То есть, говоря вашими словами, "дико неоптимально работать" с такой переменной.
Вопрос - зачем его ставить? Если без него всё работает в разы быстрее.
|
|
|
|
23.01.2014, 14:24
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
|
Не совсем так. При наличии свободных регистров, он в них помещает глобальные переменные, сколько поместятся.
|
Вы заблуждаетесь, либо цитата не соответствует действительности. В последнем абзаце первое предложение я бы дословно перевёл так: " Все глобальные переменные, не располагаются в регистрах, и сохраняются в Glodal Variables области оперативной памяти."
Если у вас есть другой перевод этого предложения, то приведите его.
Кстати, попутно вам отмечу, что я могу разместить глобальную переменную, в том числе volatile, в регистре в IAR компиляторе. Не скажу, что это распространённая практика, но я так делал когда делал бутлоадер под малый кристалл ( atmega8/88 ) впихивая, невпихуемое.
Сообщение от Godzilla82
|
|
А вот тут что-то бессвязное и нелогичное. ... То есть, говоря вашими словами, "дико неоптимально работать" с такой переменной.
|
Не знаю, может быть у вас что-то с логикой? Исходя из первой части моего ответа, глобальная переменная находится в RAM. Поэтому, чтобы следить за ней, вам придётся постоянно её обновлять. Что является неоптимальным. Компилятор который видит слово volatile работает так только с переменными, объявленными этим квалификатором. С остальными переменными работает оптимально. Учитывая, что соотношение volatile переменных к общему числу переменных будет 1 к 50 и выше, то всё понятно. Вы же утверждаете, что CV со всеми переменными так работает. Не улавливаете разницы?
Чтобы вам ещё яснее было, поясню ещё один момент.
AVR не единственный процессор на земле. Возьмём MSP430 или ARM. В этих процессорах, всё находится в едином адресном пространстве. То есть, например регистр результата АЦП, будет выглядеть для компилятора как ячейка ОЗУ. Учитывая что различные версии этих (ARM) процессоров клепают разные производители, то вообще трудно угадать что где находится. В одном CPU это АЦП, в другом - ОЗУ, в третьем флэш. Разрулевается всё это только хидером на конкретный процессор.
Теперь представим программу. Например я обрабатываю сигнал АЦП в цикле. Что видит компилятор? Он видит что я в цикле дёргаю ячейку ОЗУ. Он постарается вынести эту операцию за цикл. Как указать, что этого делать нельзя? В хидере на конкретный МК указывается volatile на данную ячейку. Также объявляются, кстати и порты AVR.
Речь не об оптимизации идёт. Речь идёт о том, что данная ячейка может измениться внешним образом по отношению к программе! А вы говорите убрать!
Если вы суть не поймёте, то рано или поздно столкнётесь с хомутом даже в своём любимом CV. Так как суть не имеет отношения к конкретному компилятору либо процессору. Это базовые понятия. Даже не языковые. Они надъязыковые.
Последний раз редактировалось SasaVitebsk; 23.01.2014 в 14:27.
|
|
|
|
23.01.2014, 14:41
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
|
Вы заблуждаетесь, либо цитата не соответствует действительности."
|
Значит цитата не соответствует действительности. Я довольно часто работаю с CV, смотрю результаты в .asm файле, поэтому и говорю, что при любой возмжности CV раполагает глобальные переменные в регистрах.
Сообщение от SasaVitebsk
|
|
я могу разместить глобальную переменную, в том числе volatile, в регистре в IAR компиляторе.
|
С IAR не работал. Но я так пытался сделать в WinAVR. У меня не получилось. Как результат - медленный код. Или при оптимизации - выкидывание участков кода.
Сообщение от SasaVitebsk
|
|
Вы же утверждаете, что CV со всеми переменными так работает.
|
Я уже много раз говорил, что CV работает не так.
Сообщение от SasaVitebsk
|
|
Речь не об оптимизации идёт. Речь идёт о том, что данная ячейка может измениться внешним образом по отношению к программе! А вы говорите убрать!
|
Я никогда не говорил что его убрать. Я говорил, что в CV квалификатор volatile не актуален. Другими словами, использование квалификатора volatile в CV не принесёт никакой выгоды.
|
|
|
|
23.01.2014, 14:49
|
|
|
Вид на жительство
Регистрация: 03.05.2006
Сообщений: 312
Сказал спасибо: 30
Сказали Спасибо 144 раз(а) в 52 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Если раздача не закончилась, я бы тоже бы очень бы!
[email protected]
Заранее спасибо!
|
|
|
|
23.01.2014, 14:53
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
volatile принудительно заставляет компилятор хранить переменную в памяти.
|
Чушь порете...Или CV превзошёл сам себя и всех остальных?
|
|
|
|
23.01.2014, 14:55
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
|
Я говорил, что в CV квалификатор volatile не актуален. Другими словами, использование квалификатора volatile в CV не принесёт никакой выгоды.
|
То есть тогда CodeVision должен генерить заведомо неоптимальный код. Либо вы что-то в CV не понимаете...
|
|
|
|
23.01.2014, 15:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от _Артём_
|
|
Чушь порете...Или CV превзошёл сам себя и всех остальных?
|
Троллить, так троллить  А что же он тогда делает в CV? Ну и для кучности - в WinAVR?
|
|
|
|
23.01.2014, 17:16
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Троллить, так троллить А что же он тогда делает в CV?
|
Потроллим, ладно...
Из мануала на CV:
|
Цитата:
|
|
The volatile modifier must be used to warn the compiler that it may be subject to outside change during evaluation.
|
Переводить надо? Примерно так получается: модификатор volatile должен быть использован, чтобы предупредить компилятор о том что переменная может быть изменена помимо выражения (перевод примерный - я не статью или книгу пишу).
А значит и работать с volatile-переменной надо по-особому.
Сообщение от Godzilla82
|
|
Ну и для кучности - в WinAVR?
|
Да та же фигня...Как и для Иара и других.
Это вот (из мануала на CodeVision):
|
Цитата:
|
|
Variables declared as volatile will not be allocated to registers.
|
- просто особенности CV (а может и не только CV), не суть.
|
|
|
|
23.01.2014, 20:54
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Поделитесь лекарством и со мной, пожалуйста!
[email protected]
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:54.
|
|