Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

CodeVisionAVR 2.60

Непрочитано 23.01.2014, 11:14  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от Godzilla82 Посмотреть сообщение
А причём тут volatile? Компилятор сам без всяких volatile разместит в памяти, если нет свободных регистров.
Да над вами смеются в голос, а вы даже не замечаете.
Приведу пример.
Согласно приведённой вырезке (пост #50) из руководства: Все глобальные переменные расположены в ОЗУ.
Теперь представим кусок текста программы с какими-то глобальными переменными. Например вычисления с анализом в цикле. Надо понимать, что мы говорим об AVR, которая не имеет команд работы с памятью кроме загрузки/ выгрузки. Соответственно для ускорения работы необходимо предварительно загрузить глобальную переменную в регистры и только потом с ней работать. Только так можно обеспечить эффективность. Но таким образом мы не узнаем что переменная изменилась. Для того чтобы это узнать надо компилировать другим образом, обновлять переменную после каждой операции, что значительно замедляет программу. Например, исходя из того что операция с регистром 1 такт и 2 команды загрузки выгрузки по 2 такта, то в 5 раз. (В каждом конкретном случае разные цифры будут, потому как есть загрузка адреса хранения, переменные могут быть многобайтовые и так далее, но всё равно разница будет в разы).
Поэтому, если вы утверждаете, что volatile не нужен, то как бы автоматом признаёте, что компилятор дико не оптимально работает со всеми глобальными переменными. А глобальных переменных может быть вагон и маленькая тележка, при этом volatile может стоять лишь на паре переменных, которые связывают независимые участки программы между собой. Например флаг, что выполнено измерение АЦП, указание двигателю, что изменилась координата и так далее ...
Реклама:
SasaVitebsk вне форума  
Непрочитано 23.01.2014, 13:21  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: CodeVisionAVR 2.60

Сообщение от SasaVitebsk Посмотреть сообщение
Согласно приведённой вырезке (пост #50) из руководства: Все глобальные переменные расположены в ОЗУ.
Теперь представим кусок текста программы ... но всё равно разница будет в разы).
Не совсем так. При наличии свободных регистров, он в них помещает глобальные переменные, сколько поместятся.

Сообщение от SasaVitebsk Посмотреть сообщение
Поэтому, если вы утверждаете, что volatile не нужен, то как бы автоматом признаёте, что компилятор дико не оптимально работает со всеми глобальными переменными. А глобальных переменных может быть вагон и маленькая тележка, при этом volatile может стоять лишь на паре переменных, которые связывают независимые участки программы между собой. Например флаг, что выполнено измерение АЦП, указание двигателю, что изменилась координата и так далее ...
А вот тут что-то бессвязное и нелогичное.

volatile принудительно заставляет компилятор хранить переменную в памяти. То есть, говоря вашими словами, "дико неоптимально работать" с такой переменной.

Вопрос - зачем его ставить? Если без него всё работает в разы быстрее.
Godzilla82 вне форума  
Непрочитано 23.01.2014, 14:24  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию 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.
SasaVitebsk вне форума  
Непрочитано 23.01.2014, 14:41  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: CodeVisionAVR 2.60

Сообщение от SasaVitebsk Посмотреть сообщение
Вы заблуждаетесь, либо цитата не соответствует действительности."
Значит цитата не соответствует действительности. Я довольно часто работаю с CV, смотрю результаты в .asm файле, поэтому и говорю, что при любой возмжности CV раполагает глобальные переменные в регистрах.

Сообщение от SasaVitebsk Посмотреть сообщение
я могу разместить глобальную переменную, в том числе volatile, в регистре в IAR компиляторе.
С IAR не работал. Но я так пытался сделать в WinAVR. У меня не получилось. Как результат - медленный код. Или при оптимизации - выкидывание участков кода.

Сообщение от SasaVitebsk Посмотреть сообщение
Вы же утверждаете, что CV со всеми переменными так работает.
Я уже много раз говорил, что CV работает не так.

Сообщение от SasaVitebsk Посмотреть сообщение
Речь не об оптимизации идёт. Речь идёт о том, что данная ячейка может измениться внешним образом по отношению к программе! А вы говорите убрать!
Я никогда не говорил что его убрать. Я говорил, что в CV квалификатор volatile не актуален. Другими словами, использование квалификатора volatile в CV не принесёт никакой выгоды.
Godzilla82 вне форума  
Непрочитано 23.01.2014, 14:49  
EagleB3
Вид на жительство
 
Регистрация: 03.05.2006
Сообщений: 312
Сказал спасибо: 30
Сказали Спасибо 144 раз(а) в 52 сообщении(ях)
EagleB3 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Если раздача не закончилась, я бы тоже бы очень бы!
[email protected]
Заранее спасибо!
EagleB3 вне форума  
Непрочитано 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  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Вопрос Re: CodeVisionAVR 2.60

Сообщение от _Артём_ Посмотреть сообщение
Чушь порете...Или CV превзошёл сам себя и всех остальных?
Троллить, так троллить А что же он тогда делает в CV? Ну и для кучности - в WinAVR?
Godzilla82 вне форума  
Непрочитано 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  
IOPA4
Почётный гражданин KAZUS.RUN
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Поделитесь лекарством и со мной, пожалуйста!
[email protected]
IOPA4 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CodeVisionAVR selevo Embedd С 11 26.02.2016 22:16
SD и CodeVisionAvr 2.04.4a sersne Микроконтроллеры, АЦП, память и т.д 29 24.03.2010 18:39
CodeVisionAVR V2.03.2 dimonbest Микроконтроллеры, АЦП, память и т.д 253 29.09.2009 22:37
New CodeVisionAVR 1.25.8 dimonbest Микроконтроллеры, АЦП, память и т.д 15 07.02.2008 12:56
Help CodeVisionAVR Serg79 Микроконтроллеры, АЦП, память и т.д 3 15.12.2005 23:32


Часовой пояс GMT +4, время: 16:54.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.