реклама на сайте
подробности

 
 
> Оптимизатор кода в WinAVR, сплошное непонятство
Panych
сообщение Aug 21 2006, 13:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Никак не могу понять, почему это требуется?: код без оптимизации работает, с оптимизацией по параметру "s" - приходится вставлять строки 170, 211 и 300.
Как они влияют на работу?
Смотрел листинг ассемблера - вроде ничего не меняется с их использованием, но ведь начинает работать!

Программа - начального уровня, конечно, но в самом начале хотелось бы уяснить, как оптимально писать...


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tiro
сообщение Aug 22 2006, 08:55
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Переставил местами 169 и 170, откомпилировал с ключем -0s

Код

        void SCAN_KEY(void) {         //опрос кнопок
    161:            
    162:            uint8_t PORT_READ;     //временыый регистр для считанного из порта
    163:            
    164:            //настройка направлений портов    
    165:            SETBIT( DDR_KN1, KN1  ); //переводим выводы опроса
   \   01d6 BB9A              sbi 55-0x20,3
   166:            SETBIT( DDR_KN2, KN2 ); //кнопок на выход
   \   01d8 BC9A              sbi 55-0x20,4
    167:            SETBIT( PORT_KN2, KN2 );    //включение
   \   01da C49A              sbi 56-0x20,4
    168:            CLEARBIT( PORT_KN1, KN1 );    //первого вывода
   \   01dc C398              cbi 56-0x20,3
    169:            NOP( 1 );
   \   01de 81E0              ldi r24,lo8(1)
   \   01e0 0E94 0000         call NOP
    170:            DATA_LCD_IO = 0;
   \   01e4 1ABA              out 58-0x20,__zero_reg__
    171:            SETBIT( PORT_KN2, KN2 );    //включение
   \   01e6 C49A              sbi 56-0x20,4
   172:            CLEARBIT( PORT_KN1, KN1 );    //первого вывода
  \   01e8 C398              cbi 56-0x20,3
    173:            PORT_READ = READ_LCD;        //считывание порта
   \   01ea 89B3              in r24,57-0x20
    174:            if ( PORT_READ != 0xFF )
   \   01ec 8F3F              cpi r24,lo8(-1)
   \   01ee B1F1              breq .L49


Вот критичное место :

Код
172:            CLEARBIT( PORT_KN1, KN1 );    //первого вывода
  \   01e8 C398              cbi 56-0x20,3
    173:            PORT_READ = READ_LCD;        //считывание порта
   \   01ea 89B3              in r24,57-0x20


Однако, Вы утверждаете, что здесь все ОК, а влияет строка 169. Есть только одно предположение - сигналы у Вас вне микроконтроллера устанавливаются медленно,
и считываете вы значения, установленные в строках 167 и 168. Тогда 169 будет влиять, поскольку время установки сигналов будет определяться задержкой NOP.

Берите в руки осциллограф, пишите тестовую программу, например переключайте ножку в 1
и 0 поочередно и смотрите прохождение сигнала.

И объявите KEY так : volatile uint8_t KEY;

С уважением.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01424 секунд с 7
ELECTRONIX ©2004-2016