|
Фрагмент кода, GCC оптимизация |
|
|
|
Nov 19 2014, 08:38
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 25-10-06
Пользователь №: 21 651

|
Простейший фрагмент, а не нравится: Код static unsigned char key_pressed;
778: 80 b3 in r24, 0x10; 16 if (key_pressed != (PIND & 1)) { 77a: 40 91 6a 00 lds r20, 0x006A 77e: 80 b3 in r24, 0x10; 16 780: 24 2f mov r18, r20 782: 30 e0 ldi r19, 0x00; 0 784: 90 e0 ldi r25, 0x00; 0 786: 81 70 andi r24, 0x01; 1 788: 90 70 andi r25, 0x00; 0 78a: 28 17 cp r18, r24 78c: 39 07 cpc r19, r25 78e: 59 f0 breq .+22 ; 0x7a6 <KeyExe+0x2e> Отчего расширяемся к int? Можно, конечно, так: Код static unsigned char key_pressed; unsigned char s = PIND & 1; 778: 80 b3 in r24, 0x10; 16 if (key_pressed != s) { 77a: 90 91 6a 00 lds r25, 0x006A 77e: 81 70 andi r24, 0x01; 1 780: 98 17 cp r25, r24 782: 59 f0 breq .+22 ; 0x79a <KeyExe+0x22> Но, как-то, не аккуратненько... Какие мысли?
Сообщение отредактировал OKF - Nov 19 2014, 08:45
|
|
|
|
|
Nov 19 2014, 08:57
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(OKF @ Nov 19 2014, 10:38)  Какие мысли? Включайте оптимизацию. Код 58:main.cpp **** static volatile unsigned char key_pressed;
62:main.cpp **** if(key_pressed != (PINC & 1)) 85 .loc 1 62 0 86 0000 9091 0000 lds r25,_ZL11key_pressed 87 0004 86B1 in r24,0x6 88 0006 8170 andi r24,lo8(1) 89 0008 9817 cp r25,r24 90 000a 01F0 breq .L10 63:main.cpp **** asm volatile ("nop" ::); 91 .loc 1 63 0 92 /* #APP */ 93 ; 63 "main.cpp" 1 94 000c 0000 nop 95 ; 0 "" 2 96 /* #NOAPP */ 97 .L10:
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 19 2014, 09:33
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 25-10-06
Пользователь №: 21 651

|
Цитата(Сергей Борщ @ Nov 19 2014, 11:57)  Включайте оптимизацию. # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s Не? Только c.
|
|
|
|
|
Nov 19 2014, 10:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(OKF @ Nov 19 2014, 11:33)  Не? Только c. Ну не знаю... Код avr-gcc -mmcu=atmega48 -Wall -gdwarf-2 -DF_CPU=4000000UL -Os -MD -MP -MT ./release/obj/main.o -MF ./release/dep/main.o.d -ffunction-sections -fdata-sections -Wa,-ahlmsd=./release/lst/main.lst -c main.cpp -o release/obj/main.o
$ avr-gcc --version avr-gcc (GCC) 4.8.2
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 19 2014, 10:18
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 25-10-06
Пользователь №: 21 651

|
Код avr-gcc (WinAVR 20100110) 4.3.3 Неужто это так важно?
|
|
|
|
|
Nov 19 2014, 10:28
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(OKF @ Nov 19 2014, 12:18)  Неужто это так важно? Разумеется. Попробуйте что-нибудь посвежее. Я давно не слежу за выпуском сборок под виндовс, возможно вы найдете и более свежие.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 19 2014, 14:07
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 25-10-06
Пользователь №: 21 651

|
Цитата(Genadi Zawidowski @ Nov 19 2014, 14:04)  Сергей Борщ, Genadi Zawidowski, спасибо конечно, но... Желаемого результата нет. Код 5cc: 90 91 6b 00 lds r25, 0x006B 5d0: 80 b3 in r24, 0x10; 16 5d2: 69 2f mov r22, r25 5d4: 70 e0 ldi r23, 0x00; 0 5d6: 86 95 lsr r24 5d8: 21 e0 ldi r18, 0x01; 1 5da: 82 27 eor r24, r18 5dc: 48 2f mov r20, r24 5de: 41 70 andi r20, 0x01; 1 5e0: 50 e0 ldi r21, 0x00; 0 5e2: 64 17 cp r22, r20 5e4: 75 07 cpc r23, r21 5e6: 49 f0 breq .+18 ; 0x5fa <KeyExe+0x2e>
avr-gcc (GCC) 4.9.2 20140912 (prerelease)
|
|
|
|
|
Nov 20 2014, 06:46
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 25-10-06
Пользователь №: 21 651

|
Нет, на самом деле в последнем случае было: Код if (key_pressed != (!(PIND & 2))) { компилировалось: Код avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./../inc/ky.lst -I../inc -std=gnu99 -MMD -MP -MF .dep/ky.o.d ../inc/ky.c -o ../inc/ky.o
|
|
|
|
|
Nov 21 2014, 01:19
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 25-10-06
Пользователь №: 21 651

|
Цитата(Genadi Zawidowski @ Nov 20 2014, 23:08)  Что такое key_pressed - какого оно типа? НУ что не привести ещё пару строк? Ну как же, всё указано: Код static unsigned char key_pressed; Как я понимаю, тут лог. отрицание приводится к int-у. А этого не хотелось бы...
|
|
|
|
|
Nov 22 2014, 12:01
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 25-10-06
Пользователь №: 21 651

|
Кстати, с 4.9.2 размер увеличился, как это ни странно.
|
|
|
|
|
Nov 23 2014, 19:51
|
Группа: Новичок
Сообщений: 2
Регистрация: 23-11-14
Пользователь №: 83 803

|
в С результат логической операции имеет тип int, отсюда и расширение до int который по умолчанию для avr 2 байта, можно использовать опцию -mint8 но тогда потеряете бинарную совместимость при линковке с кодом который такую опцию не использует в частности сразу теряете бинарную совместимость с avr-libc, такой проблемы нет в C++ в котором для архитектуры avr встроенный тип bool равен одному байту и соответственно логические операции имеют тип bool, кстати интересно узнать, какой смысл использовать компилятор С если для таргет архитектуры существует хорошо реализованный компилятор С++?
|
|
|
|
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|