|
"Оптимизация" в WinAVR и как с этим бороться |
|
|
|
Nov 16 2011, 18:07
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Перейдя с ассемблера на WinAVR, невольно стал обращать на размер кода. Когда стал разбираться в конкретике генерируемого кода , хваленный на многих сайтах WinAVR обнажил свое несовершенство. Короче, программка : Код #include <avr/io.h> #include <inttypes.h>
#define Btn1 PB2 #define Btn2 PB3
#define KeyMask (1<<Btn1)|(1<<Btn2) #define sbi(p,b) (p |= (1<<b)) //Установить бит
volatile register int8_t Cnt asm("r19"); // фоновый счетчик volatile register int8_t a asm ("r16");
int main (void) { asm("nop"); a = 1;
while(1) { if (~(PINB)&(KeyMask)) { a |= 0x01; } if ((--Cnt)==0) { if (a==1 ) { a=0; sbi (PINB,PB2); } } } } Соответственно , полученный код: Код a = 1; ldi r16, 0x01
while(1) { [color="#FF00FF"]if (~(PINB)&(KeyMask)) in r24, 0x16 ldi r25, 0x00 com r24 com r25 andi r24, 0x0C andi r25, 0x00 or r24, r25 breq .+2[/color] { a |= 0x01; } ori r16, 0x01
[color="#FF0000"]if ((--Cnt)==0) mov r24, r19 subi r24, 0x01 mov r19, r24[/color] brne .-26 { if (a==1 ) cpi r16, 0x01 brne .-30 { a=0; ldi r16, 0x00
sbi (PINB,PB2); sbi 0x16, 2 rjmp .-36 Конструкцию if ((--Cnt)==0) выделенную крас.цветом может заменить всего одна машинная команда: dec r19! Вопрос: как заставить компилятор это делать ? Во втором случае: if (~(PINB)&(KeyMask)) , невижу смысла во втором парном регистре r25. Можно использовать "tst r24". Можно как нибудь с этим бороться ?! Не хочеться чтобы потом код получался неоправданно раздутым! Может быть стоит подождать другую версию компилятора (пользуюсь WinAVR-20100110) или уже пререходить на совсем другой ?
|
|
|
|
|
 |
Ответов
|
Nov 16 2011, 19:19
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Палыч @ Nov 16 2011, 21:45)  А, вот тут - "неча на зеркало пенять..." (т.е. не нужно "мешать" восьми- и шестнадцатибитные операнды). а где вы увидели 16ти битные операнды ? PINB читается как 8ми битные KeyMask тоже 8мь бит !
|
|
|
|
|
Nov 16 2011, 21:06
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Палыч @ Nov 16 2011, 23:10)  Почему? Обоснуйте. смотрите по коду, предпоследния команда: or r24, r25 я не думаю что старший байт с младшим компилятор сталбы склеивать ! Кстати , можно проверить по присваиванию
|
|
|
|
|
Nov 17 2011, 15:19
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(aaarrr @ Nov 17 2011, 00:19)  Это обычная проверка пары регистров на 0. Как это компилятор резервирует старший байт , а потом проверяет младший со старшим ? Как то не логично получается ! AHTOXA, Пробывал я выражение : if (~(PINB)&((unsigned char)KeyMask)) - Результат абсолютно тот же, и скобки как говорили в #define я поставил, один хрен ! Попробывал предварительное присваивание константы в регистр : Код volatile register int8_t Cnt asm("r19"); // фоновый счетчик volatile register int8_t a asm ("r16"); volatile register int8_t b asm ("r17");
int main (void) { asm("nop"); a = 1; b=KeyMask; while(1) { if (~(PINB)&(b)) { a |= 0x01; } if ((--Cnt)==0) { if (a==1 ) { a=0; b |= 0x08; sbi (PINB,PB2); } } } } Тут Вообще "Оптимизатор" показал чудеса !!!  Цитата(Genadi Zawidowski @ Nov 17 2011, 04:30)  Назначение регистров для переменных ОЧЕНЬ сильно мешает оптимизации. Если рассуждать как вы , то можно сказать и любая программа написанная в Си мешает оптимизации!!! Вы еще бы посоветовали на Ассемблере писать  Цитата(AHTOXA @ Nov 16 2011, 22:58)  И зря. Если код помещается в чип и успевает сделать то, что должен, то какая разница, какого он размера? А если не помещается, и делает с большими задержками по времяни ? Цитата(AHTOXA @ Nov 16 2011, 22:58)  ЗЫ. Выделение цветом не работает в блоке code, если сильно надо, то пользуйтесь блоком codebox - там вроде работает. Кстати , а что за блок codebox ? я про него ничего не слышал Во втором случае, все просто !  Я заранее знал решение, и хотел посмотреть что вы скажите (может чего новое) Проблемка решается заменой конструкции: if (~(PINB)&(KeyMask)) на несколько команд: b=~(PINB); b&=KeyMask; if (  { ......} Код сокращается всего лишь до: Код IN R24,0x16 COM R24 ANDI R24,0x0C BREQ PC+0x02 А вот с первой проблемой мусорных присваиваний , похоже все мрачно !
|
|
|
|
Сообщений в этой теме
MaxiMuz "Оптимизация" в WinAVR и как с этим бороться Nov 16 2011, 18:07      Палыч Цитата(MaxiMuz @ Nov 17 2011, 19:19) ... ... Nov 17 2011, 17:42      AHTOXA Цитата(MaxiMuz @ Nov 17 2011, 21:19) А ес... Nov 17 2011, 17:47 AHTOXA Цитата(MaxiMuz @ Nov 17 2011, 00:07) Пере... Nov 16 2011, 19:58 MaxiMuz Цитата(AHTOXA @ Nov 16 2011, 22:58) Вам ж... Nov 18 2011, 09:00  Палыч Цитата(MaxiMuz @ Nov 18 2011, 13:00) На О... Nov 18 2011, 10:59   _Pasha Цитата(Палыч @ Nov 18 2011, 13:59) Имхо, ... Nov 18 2011, 14:36    neiver Цитата(_Pasha @ Nov 18 2011, 18:36) и не ... Nov 18 2011, 14:45    ReAl Цитата(_Pasha @ Nov 18 2011, 16:36) ГЦЦ н... Nov 18 2011, 16:17     demiurg_spb Паша верно перечислил основные недочёты avr-gcc, с... Nov 18 2011, 17:13     neiver Цитата(ReAl @ Nov 18 2011, 20:17) Вот еще... Nov 18 2011, 17:23      MaxiMuz Цитата(neiver @ Nov 18 2011, 20:23) К сож... Nov 20 2011, 11:58       ReAl Цитата(MaxiMuz @ Nov 20 2011, 12:55) Хоте... Nov 20 2011, 12:23        MaxiMuz Цитата(ReAl @ Nov 20 2011, 15:23) .......... Nov 23 2011, 11:30         demiurg_spb Цитата(MaxiMuz @ Nov 23 2011, 15:30) где ... Nov 23 2011, 13:39          ReAl Тьху, ну конечно, -ffixed-reg
Что-то меня на = пот... Nov 23 2011, 21:19         AHTOXA КодCFLAGS += -ffixed-r16
CFLAGS += -ffixed-r18 Nov 23 2011, 14:40   MaxiMuz Цитата(Палыч @ Nov 18 2011, 13:59) Если В... Nov 18 2011, 16:06    ReAl Цитата(MaxiMuz @ Nov 18 2011, 18:06) боль... Nov 18 2011, 22:38  Сергей Борщ QUOTE (MaxiMuz @ Nov 18 2011, 12:00) Это ... Nov 18 2011, 11:54 ReAl Цитата(MaxiMuz @ Nov 16 2011, 20:07) Код#... Nov 16 2011, 21:53 Genadi Zawidowski Код#define KeyMask (1<<Btn1)|... Nov 17 2011, 01:30 neiver Мда, можно вытащить ассемблерщика из ассемблера, н... Nov 17 2011, 08:19 Палыч Цитата(neiver @ Nov 17 2011, 12:19) integ... Nov 17 2011, 09:27 neiver Я к чему, тут про целочисленное расширение намекаю... Nov 18 2011, 05:25 MaxiMuz neiver , _Pasha да действительно, можно и так напи... Nov 18 2011, 08:38 neiver Цитата(MaxiMuz @ Nov 18 2011, 12:38) neiv... Nov 18 2011, 08:44 neiver GCC прекрасно может сгенерировать одну команду sbi... Nov 18 2011, 11:07 Палыч Цитата(neiver @ Nov 18 2011, 15:07) GCC п... Nov 18 2011, 11:17 ReAl Жаль. Nov 18 2011, 19:58 MaxiMuz Спасибо за ответы !
Опять я возвращаюсь к св... Nov 25 2011, 08:40 Сергей Борщ QUOTE (MaxiMuz @ Nov 25 2011, 11:40) Хоте... Nov 25 2011, 09:27  MaxiMuz Цитата(Сергей Борщ @ Nov 25 2011, 12:27) ... Nov 25 2011, 12:07   AHTOXA Цитата(MaxiMuz @ Nov 25 2011, 18:07) Вопр... Nov 25 2011, 14:16    ReAl Цитата(AHTOXA @ Nov 25 2011, 16:16) Какой... Nov 25 2011, 14:35     AHTOXA По-моему, на этот вопрос тоже уже ответили, и не р... Nov 25 2011, 19:17 ReAl Провёл маленький эксперимент.
Убрал все эти regist... Nov 25 2011, 20:32 MaxiMuz AHTOXA с вами не поспоришь
ReAl По сути , кусок... Nov 28 2011, 10:59 ReAl Цитата(MaxiMuz @ Nov 28 2011, 12:59) подо... Nov 28 2011, 14:16 sigmaN перед main воткните __attribute__ ((noreturn));
h... Nov 28 2011, 19:40 MaxiMuz Цитата(sigmaN @ Nov 28 2011, 22:40) перед... Jan 23 2012, 09:15 ReAl Для этого в AVR-GCC уже давно есть OS_main и OS_ta... Nov 28 2011, 20:17 sigmaN ну или так, да.
а ещё я из исходников библиотеки ... Nov 28 2011, 22:10 ILYAUL Цитата(sigmaN @ Nov 29 2011, 02:10) ну ил... Nov 29 2011, 04:15  ARV Цитата(ILYAUL @ Nov 29 2011, 08:15) ИМХО ... Jan 23 2012, 09:53 MaxiMuz При использовании int OS_main (void) компилятор вы... Jan 23 2012, 14:50 sigmaN warning это не error и по идее не должен приводить... Jan 24 2012, 02:07 MaxiMuz Цитата(sigmaN @ Jan 24 2012, 05:07) warni... Feb 2 2012, 11:49 _Pasha Таварисч не панимаит.
Кодint main(void) __... Feb 2 2012, 12:16 MaxiMuz Цитата(_Pasha @ Feb 2 2012, 15:16) Тавари... Feb 3 2012, 10:42  Сергей Борщ QUOTE (MaxiMuz @ Feb 3 2012, 12:42) Да... Feb 3 2012, 11:08 MaxiMuz Доброго времяни суток!
Не стал создавать отдел... Oct 16 2012, 18:35 Палыч Цитата(MaxiMuz @ Oct 16 2012, 22:35) здес... Oct 17 2012, 06:15  MaxiMuz Цитата(Палыч @ Oct 17 2012, 09:15) Это - ... Oct 17 2012, 12:11   Сергей Борщ В этом стандарте операция "&" выполн... Oct 17 2012, 12:59   Палыч Цитата(MaxiMuz @ Oct 17 2012, 16:11) стан... Oct 17 2012, 13:04 Genadi Zawidowski Используйте компилятор поновее (avr-gcc 4.7.2, avr... Oct 16 2012, 19:26
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|