Перейти к содержанию
    

Эффективность кода WinAVR

Она действительно такая никудышняя или можно повысить какими-то ключами?

Вот пример:

40:           if(chng != 0)
+00000074:   8189        LDD     R24,Y+1          Load indirect with displacement
+00000075:   2388        TST     R24              Test for Zero or Minus
+00000076:   F179        BREQ    PC+0x30          Branch if equal
42:               if(chng & (1<<IN1_INC))
+00000077:   8189        LDD     R24,Y+1          Load indirect with displacement
               ...

В следующей строке компилятор уже не помнит, что переменная уже лежит в R24 и грузит ее заново. Такой тупой компиляции я никак не ожидал, может надо где-то включить оптимизацию? Да и хелпа я что-то нигде не найду :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 777777 - какие ключи использовали ??

..

там в принципе ключик -Os - генерит более менее правильный код..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 777777 - какие ключи использовали ??

 

То, что AVR поставил по умолчанию:

-Wall

-gdwarf-2

-O0

 

Кстати, на означает ли последний ключ отключение оптимизации? Где бы про них почитать, а то хелп только на AVR Studio, а на сишный компилятор нигде не найду :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там в принципе ключик -Os - генерит более менее правильный код..

 

Классно, код сразу сокранился почти в 2 раза. С таким уже можно работать. :)

И еще вопрос: а есть ли там bool? Редактор подсвечивает bool, true и false, а компилер на них ругается. Может их тоже включать надо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Классно, код сразу сокранился почти в 2 раза. С таким уже можно работать. :)

И еще вопрос: а есть ли там bool? Редактор подсвечивает bool, true и false, а компилер на них ругается. Может их тоже включать надо?

надо подключить stdbool.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

надо подключить stdbool.h

 

Э, это не то! там они просто дефайнятся, а я хотел поддержки со стороны компилятора, причем чтобы bool имел размер в 1 бит, как в 51 (правда, там этот тип называется bit). И если объявить такую функцию, то она будет возвращать свое значениев не в регистре, а в бите переноса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Э, это не то! там они просто дефайнятся, а я хотел поддержки со стороны компилятора, причем чтобы bool имел размер в 1 бит, как в 51 (правда, там этот тип называется bit). И если объявить такую функцию, то она будет возвращать свое значениев не в регистре, а в бите переноса.
И, зачем это Вам? AVR - это не МК51, битовоадресуемой памяти нет, битовых операций тоже ( SBI, CBI, BST, BLD - невсчет).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И, зачем это Вам? AVR - это не МК51, битовоадресуемой памяти нет, битовых операций тоже ( SBI, CBI, BST, BLD - невсчет).

Есть, есть...;О) Мало, не везде, но есть. GPIOR0...2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

-O0 - Do not optimize

 

Ключи описаны в файле gcc.pdf

 

А где его найти ? У меня в инсталяции WinAVR только 6 .pdf файлов и среди них нету - gcc.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После инсталляции:

C:\WinAVR-20071221\doc\gcc\HTML\gcc-4.2.2 и посмотреть ... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в шоке. Какой код можно сгенерировать на такую строку:

 if(v & F0BIT)

Вот результат:

               if(v & F0BIT)
+0000003B:   2F24        MOV     R18,R20          Copy register
+0000003C:   2733        CLR     R19              Clear Register
+0000003D:   2F93        MOV     R25,R19          Copy register
+0000003E:   2F82        MOV     R24,R18          Copy register
+0000003F:   E063        LDI     R22,0x03         Load immediate
+00000040:   9596        LSR     R25              Logical shift right
+00000041:   9587        ROR     R24              Rotate right through carry
+00000042:   956A        DEC     R22              Decrement
+00000043:   F7E1        BRNE    PC-0x03          Branch if not equal
+00000044:   7081        ANDI    R24,0x01         Logical AND with immediate
+00000045:   7090        ANDI    R25,0x00         Logical AND with immediate
+00000046:   2388        TST     R24              Test for Zero or Minus
+00000047:   F011        BREQ    PC+0x03          Branch if equal

А все потому, что константа F0BIT описана следующим образом:

const int F0BIT    = (1<<F0);    
const int F1BIT    = (1<<F1);

И вот вместо того, чтобы на этапе компиляции вычислить это выражение и сделать логическое И с переменной, компилятор решает сдвинуть переменную на F0 битов! Особенно порадовала строка ANDI R25,0x00. Впрочем, CLR R19 с последующей MOV R25,R19 тоже ничего...

 

А я уж было обрадовался что компилятор заработал... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А все потому, что константа F0BIT описана следующим образом:

const int F0BIT    = (1<<F0);    
const int F1BIT    = (1<<F1);

А зачем было описывать константу столь затейливым образом? Компилятор не работает, как же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...