|
|
  |
Эмуляция оптимизированного и не оптимизированного кода, AVRSTUDIO+AVRDRAGON+ATMEGA16 |
|
|
|
Aug 14 2010, 20:19
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
AVRSTUDIO + AVRDRAGON + ATMEGA16 Помогите понять вот какие вещи : 1)В опциях проекта можно выбрать оптимизацию кода. Если поставить максимальную оптимизацию, под отладкой происходит совсем не пойми что : программа не останавливается на точках останова, во многих местах точки останова вообще не получается поставить, программа не выходит из циклов for(i=0;j<128;i++) . Без JTAG программа в МК работает как надо, я это вижу на осциллографе. Совсем без оптимизации программа под отладкой выполняется нормально. 2)В любом случае под отладкой не работает АЦП . Выставляю бит ADSC в ADCSRA , он сразу же сбрасывается. В регистре результата всё время 0 Опять же без JTAG ацп работает нормально...
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 14 2010, 21:12
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(Savrik @ Aug 15 2010, 00:27)  Раз Вы включили оптимизацию, почитайте о модификаторе volatile.
Кроме того, использовать глобальную переменную i для цикла не есть хорошо... Лучше для этого использовать локальные переменные Оптимизация отключил . Почему же ацп под отладкой не работает ? Под отладкой не выставляется бит ADSC в ADCSRA , почему ?
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 14 2010, 21:50
|

наблюдаю..
  
Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369

|
В ADSC записуется единица для начала преобразования. После преобразования в ADSC будет ноль. У Вас как АЦП работает? от таймера? Как без отладчика Вы знаете, что АЦП работает? Пишете в терминал? Цитата Оптимизация отключил . Зачем так радикально?  Просто надо переписать правильно код и все, к примеру, переменная result , в которой, подозреваю, записуется значение АЦП в перывании, без volatile
|
|
|
|
|
Aug 14 2010, 22:11
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(Savrik @ Aug 15 2010, 01:50)  В ADSC записуется единица для начала преобразования. После преобразования в ADSC будет ноль. У Вас как АЦП работает? от таймера? Как без отладчика Вы знаете, что АЦП работает? Пишете в терминал? Ацп работает просто в цикле while(1) { while ( (ADCSRA & (1<<ADSC))!=0 ) {}; //ждём когда закончится преобразование result=ADCH; ADCSRA|=(1<<ADSC);//запускаем преобразование ............. } То что ацп работает без отладки я знаю потому что МК выводит результат на порт , и я вижу что он правильный. Мне не понятно, почему если выполнять программу под отладкой пошагово, ADCSRA|=(1<<ADSC); ни к чему не приводит, в ADCSRA ничего не записывается.
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 16 2010, 06:36
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(DpInRock @ Aug 15 2010, 17:05)  Из такого цикла выходят только вперед ногами. Я разумеется здесь ошибся, и в программе у меня цикл for(i=0:i<128;i++) С максимальной оптимизацией действительно всё глючит. Во многих случаях компилятор решает, что переменная " не нужна" , видимо как в этом цикле, и выбрасывает действия с ней. Установка оптимизации, которая называется -02 решает проблему. Скорость работы снижается на 15% , но зато всё работает так как должно.
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 16 2010, 06:46
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(MiklPolikov @ Aug 16 2010, 10:36)  С максимальной оптимизацией действительно всё глючит. Во многих случаях компилятор решает, что переменная " не нужна" , видимо как в этом цикле, и выбрасывает действия с ней. volatile, однозначно! Если выкидывает константы, которые вы, например, хотели уложить в флешь или еепром, есть например, в GCC аттрибут used, а в ИАРе - специальная прагма.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 16 2010, 07:11
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(MrYuran @ Aug 16 2010, 10:46)  volatile, однозначно! Если выкидывает константы, которые вы, например, хотели уложить в флешь или еепром, есть например, в GCC аттрибут used, а в ИАРе - специальная прагма. В том то и дело что у меня нет ничего такого, и volatile ни как не помогает. Грустить по поводу оптимизации -02 вместо -03 , с которой работало бы на 15% быстрее не стоит : Эти лишние 15% берутся от того что программа делает не всё что должна : )
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 19 2010, 07:31
|
Группа: Новичок
Сообщений: 3
Регистрация: 30-08-06
Пользователь №: 19 941

|
Цитата(MiklPolikov @ Aug 16 2010, 10:36)  Я разумеется здесь ошибся, и в программе у меня цикл for(i=0:i<128;i++)
С максимальной оптимизацией действительно всё глючит. Во многих случаях компилятор решает, что переменная " не нужна" , видимо как в этом цикле, и выбрасывает действия с ней.
Установка оптимизации, которая называется -02 решает проблему. Скорость работы снижается на 15% , но зато всё работает так как должно. Голубчик, (unsigned char i;) ВСЕГДА меньше 128
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|