|
Эффективность кода WinAVR |
|
|
|
Apr 21 2008, 07:12
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Kuzmi4 @ Apr 21 2008, 11:07)  2 777777 - какие ключи использовали ?? То, что AVR поставил по умолчанию: -Wall -gdwarf-2 -O0 Кстати, на означает ли последний ключ отключение оптимизации? Где бы про них почитать, а то хелп только на AVR Studio, а на сишный компилятор нигде не найду
|
|
|
|
|
Apr 21 2008, 09:03
|

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

|
Цитата(777777 @ Apr 21 2008, 11:54)  Э, это не то! там они просто дефайнятся, а я хотел поддержки со стороны компилятора, причем чтобы bool имел размер в 1 бит, как в 51 (правда, там этот тип называется bit). И если объявить такую функцию, то она будет возвращать свое значениев не в регистре, а в бите переноса. И, зачем это Вам? AVR - это не МК51, битовоадресуемой памяти нет, битовых операций тоже ( SBI, CBI, BST, BLD - невсчет).
|
|
|
|
|
Apr 21 2008, 09:24
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(Палыч @ Apr 21 2008, 13:03)  И, зачем это Вам? AVR - это не МК51, битовоадресуемой памяти нет, битовых операций тоже ( SBI, CBI, BST, BLD - невсчет). Есть, есть...;О) Мало, не везде, но есть. GPIOR0...2
|
|
|
|
|
Apr 21 2008, 09:48
|

Участник

Группа: Новичок
Сообщений: 19
Регистрация: 14-04-08
Из: Москва
Пользователь №: 36 755

|
Цитата(Палыч @ Apr 21 2008, 11:18)  -O0 - Do not optimize
Ключи описаны в файле gcc.pdf А где его найти ? У меня в инсталяции WinAVR только 6 .pdf файлов и среди них нету - gcc.pdf
|
|
|
|
|
Apr 21 2008, 14:43
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Я в шоке. Какой код можно сгенерировать на такую строку: Код 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 тоже ничего... А я уж было обрадовался что компилятор заработал...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|