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

 
 
> "Оптимизация" в WinAVR и как с этим бороться
MaxiMuz
сообщение Nov 16 2011, 18:07
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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) или уже пререходить на совсем другой ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Nov 16 2011, 18:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(MaxiMuz @ Nov 16 2011, 22:07) *
хваленный на многих сайтах WinAVR обнажил свое несовершенство.
В большенстве трансляторов с ЯВУ можно найти "несовершенство"...

Цитата(MaxiMuz @ Nov 16 2011, 22:07) *
Во втором случае: if (~(PINB)&(KeyMask)) , невижу смысла во втором парном регистре r25. Можно использовать "tst r24". Можно как нибудь с этим бороться ?!
А, вот тут - "неча на зеркало пенять..." (т.е. не нужно "мешать" восьми- и шестнадцатибитные операнды).
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 16 2011, 19:19
Сообщение #3


Местный
***

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



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

а где вы увидели 16ти битные операнды ?
PINB читается как 8ми битные
KeyMask тоже 8мь бит !
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 16 2011, 20:10
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(MaxiMuz @ Nov 16 2011, 23:19) *
KeyMask тоже 8мь бит !
Почему? Обоснуйте.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 16 2011, 21:06
Сообщение #5


Местный
***

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



Цитата(Палыч @ Nov 16 2011, 23:10) *
Почему? Обоснуйте.

смотрите по коду, предпоследния команда:
or r24, r25
я не думаю что старший байт с младшим компилятор сталбы склеивать !
Кстати , можно проверить по присваиванию
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 16 2011, 21:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MaxiMuz @ Nov 17 2011, 01:06) *
or r24, r25
я не думаю что старший байт с младшим компилятор сталбы склеивать !

Это обычная проверка пары регистров на 0.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 17 2011, 15:19
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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);
        }
    }
}
}

Тут Вообще "Оптимизатор" показал чудеса !!! sm.gif

Цитата(Genadi Zawidowski @ Nov 17 2011, 04:30) *
Назначение регистров для переменных ОЧЕНЬ сильно мешает оптимизации.

Если рассуждать как вы , то можно сказать и любая программа написанная в Си мешает оптимизации!!!
Вы еще бы посоветовали на Ассемблере писать sm.gif

Цитата(AHTOXA @ Nov 16 2011, 22:58) *
И зря. Если код помещается в чип и успевает сделать то, что должен, то какая разница, какого он размера?

А если не помещается, и делает с большими задержками по времяни ?


Цитата(AHTOXA @ Nov 16 2011, 22:58) *
ЗЫ. Выделение цветом не работает в блоке code, если сильно надо, то пользуйтесь блоком codebox - там вроде работает.

Кстати , а что за блок codebox ?
я про него ничего не слышал

Во втором случае, все просто ! sm.gif Я заранее знал решение, и хотел посмотреть что вы скажите (может чего новое)
Проблемка решается заменой конструкции:
if (~(PINB)&(KeyMask))

на несколько команд:
b=~(PINB);
b&=KeyMask;
if (cool.gif
{ ......}

Код сокращается всего лишь до:
Код
IN      R24,0x16
COM     R24          
ANDI    R24,0x0C
BREQ    PC+0x02


А вот с первой проблемой мусорных присваиваний , похоже все мрачно ! sad.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 18 2011, 06:25
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MaxiMuz @ Nov 17 2011, 19:19) *
Код сокращается всего лишь до:

Так не полагайтесь на CSE там, где это не надо. laughing.gif
Поясню: если в выражении присутствует хоть одна volatile-переменная, она все равно испортит общую оптимизацию выражения. Надо ж думать, прежде чем писать!

И смысла в if (~(PINB)&(KeyMask)) много меньше, чем в if( ! (PINB & KeyMask) ). Ой, уже опередили.

Сообщение отредактировал _Pasha - Nov 18 2011, 06:26
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 22:49
Рейтинг@Mail.ru


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