| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
AVRStudio косяк :(
26.04.2010, 11:32
|
|
|
Временная регистрация
Регистрация: 13.10.2009
Сообщений: 81
Сказал спасибо: 2
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от st_1
|
|
Один компилятор не соптимизирует, а другой проглотит и сделает вид что там ничего и небыло.
|
Ну компилятор нам заведомо известен. О нём и говорим.
Сообщение от st_1
|
|
Дык, volatile и static тоже не с бодуна же придумали, наверно не зря?
|
Честно ? Я в программировании на Си - полный дуб. Но как ни странно, первой моей программой был биллинг интернета написанный шесть лет назад. И поныне через него спокойно текут деньги. Без ошибок. Я больше привык к языкам без абстрактных указателей. Если объясните чем мне могут помочь volatile и static - буду признателен.
Сообщение от testerplus
|
Код:
sek = 1;
if (sek == 240) ...
и делает вывод, что условие никогда не выполняется.
|
Безусловно делает. Тут кто угодно, а не только компилятор, посчитает такой код бредом. Хотя у него тоже есть одно применение - но всё же корявое. А вот если между ними встретится while - то компилятор спокойно это прожуёт.
Сообщение от testerplus
|
|
Вот пример, где без volatile может возникнуть проблема.
|
Для неблокируещего ВВ через юарт всегда использовал кольцевые буфферы. Самодельные. Никаких проблем никогда не было. Но это не значит что их быть не может: главное правильно это писать/использовать.
|
|
|
|
Сказали "Спасибо" Classic001
|
|
|
26.04.2010, 11:48
|
|
|
Временная регистрация
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от Classic001
|
Вообщет выкидывать код он будет если с переменной не производится никаких действий по её изменению. В коде изменение в прерывании. На ум приходит только неподключенный модуль interrupt.h. Но тогда вроде бы и sei работать не должна.
Объясните. Я косяков не вижу. Кроме непонятных мне функций led_r_off() и led_r_on. При том, что вроде такие вещи правильнее решать define'ами.
|
Вот откуда led_on и off (стоят внвчале):
inline void led_r_off()
{
PORTB &= ~( 1 ‹‹ PB0 );
}
inline void led_r_on()
{
PORTB |= ( 1 ‹‹ PB0 );
}
|
|
|
|
Сказали "Спасибо" Pavlike
|
|
|
26.04.2010, 11:53
|
|
|
Временная регистрация
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от testerplus
|
|
Автору топика: используйте тег CODE для оформления текста программы. У себя-то, небось, с отступами все видите?
|
Простите, первый раз оформлял тему, учту на будущее!
|
|
|
|
Сказали "Спасибо" Pavlike
|
|
|
26.04.2010, 12:05
|
|
|
Временная регистрация
Регистрация: 13.10.2009
Сообщений: 81
Сказал спасибо: 2
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от Pavlike
|
|
Вот откуда led_on и off (стоят внвчале)
|
Да я понял что они есть. Просто не понял почему так криво оформленны. Тут значительно удобочитаемее было бы использовать define'ы
|
|
|
|
26.04.2010, 12:10
|
|
|
Временная регистрация
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от testerplus
|
Сообщение от Classic001
Никогда не использовал volatile - всегда вроде и так работало.
|
В том и дело, я тоже раньше писал таким образом и все работало... (без volatile)
|
|
|
|
26.04.2010, 12:13
|
|
|
Временная регистрация
Регистрация: 13.10.2009
Сообщений: 81
Сказал спасибо: 2
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от Pavlike
|
|
В том и дело, я тоже раньше писал таким образом и все работало...
|
Да я тоже Ваш код дополнил до компиляции и всё по прежнему работает. Ну кроме, конечно, задержек. Компилятор не выкидывает код со стандартным уровнем оптимизации.
|
|
|
|
26.04.2010, 12:22
|
|
|
Временная регистрация
Регистрация: 13.10.2009
Сообщений: 81
Сказал спасибо: 2
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: AVRStudio косяк :(
Тут стало скучно и решил проверить.
Сообщение от testerplus
|
|
Проверка sek==240 производится с интервалом 100 мс. За это время прерывание может успеть сработать несколько раз.
|
Каким именно образом прерывание, настроенное на возникновение раз в секунду может срабатывать несколько раз за 100 мс ?
|
|
|
|
26.04.2010, 12:24
|
|
|
Временная регистрация
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: AVRStudio косяк :(
Действительно, с volatile - компилит правильно!
Возникло еще пару вопросов:
1. Варианты оптимизации стоят только в свойствах проекта? (- Os) И где можно почитать описание про это(раньше туда не залазил), я так понимаю - это не в описании AVRStudio а в компиляторе.
2. Возможно ли поместить глобальную переменную в регистр? без использования памяти.
|
|
|
|
26.04.2010, 12:26
|
|
|
Временная регистрация
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от Classic001
|
|
Каким именно образом прерывание, настроенное на возникновение раз в секунду может срабатывать несколько раз за 100 мс ?
|
Прерывание - 1 сек. В теле цикла я хочу каждые 4 минуты (240 секунд) писать в EPROM. А задержка в цикле условная, возможно ее вообще там небудет( там работа с SPI).
|
|
|
|
26.04.2010, 12:27
|
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: AVRStudio косяк :(
Сообщение от Classic001
|
|
Да я тоже Ваш код дополнил до компиляции и всё по прежнему работает. Ну кроме, конечно, задержек. Компилятор не выкидывает код со стандартным уровнем оптимизации.
|
Прикольно. И я дополнил код. Задержки работают, код сравнения:
1. При закомментированной sek=1 остается и работает через регистр (автору топика обратить внимание на дизассемблер входа в цикл while(1), сразу перед ним - копирование из ячейки 0x60 в регистр r18 )
2. При раскомментированном sek=1 код проверки условия и всего содержимого опреаторных скобок if {} выкидывается. Могу привести полный листинг.
3. При определении sek с квалификатором volatile код перестает выкидываться компилятором.
Кстати, что Вы имеете ввиду под "стандартным уровнем оптимизации"? Если -o0, то это "без оптимизации", в этом случае код, действительно, будет оставлен (оно и понятно). На всех остальных уровнях: -o1, -o2, -o3, -oS - код условия выкидывается, если не ставить volatile.
|
Цитата:
|
|
Но как ни странно, первой моей программой был биллинг интернета написанный шесть лет назад. И поныне через него спокойно текут деньги. Без ошибок.
|
Я по профессии занимаюсь поиском ошибок в чужих прораммах. И уже много раз разбирался с исходниками программ, которые несколько лет работали, как часы, а потом давали сбой (иногда необратимый), причины ошибок в которых были связаны с недопониманием программистом квалификатора volatile. Если хотите, могу объяснить подробнее на примере программы из этого топика.
Последний раз редактировалось testerplus; 26.04.2010 в 12:31.
|
|
|
|
Сказали "Спасибо" testerplus
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Помогите с AVRstudio
|
jafarkiller |
Микроконтроллеры, АЦП, память и т.д |
9 |
08.04.2010 21:42 |
Часовой пояс GMT +4, время: 23:54.
|
|