|
Фрагмент кода, 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 17)
|
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, кстати интересно узнать, какой смысл использовать компилятор С если для таргет архитектуры существует хорошо реализованный компилятор С++?
|
|
|
|
|
Nov 24 2014, 17:41
|
Участник

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

|
Цитата(acrix @ Nov 23 2014, 22:51)  в С результат логической операции имеет тип int, отсюда и расширение до int который по умолчанию для avr 2 байта, можно использовать опцию -mint8 но тогда потеряете бинарную совместимость при линковке с кодом который такую опцию не использует в частности сразу теряете бинарную совместимость с avr-libc, такой проблемы нет в C++ в котором для архитектуры avr встроенный тип bool равен одному байту и соответственно логические операции имеют тип bool, кстати интересно узнать, какой смысл использовать компилятор С если для таргет архитектуры существует хорошо реализованный компилятор С++? Ну, а ежели С хватает. Не из-за bool-а же переходить. А вообще, какие нужны телодвижения что бы перевести проект на С++? Какие основные отличия в оформлении, если плюшками ++ не пользоваться? При том что все наработки на С.
|
|
|
|
|
Nov 24 2014, 21:28
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(OKF @ Nov 24 2014, 20:41)  ...какие нужны телодвижения что бы перевести проект на С++? Какие основные отличия в оформлении, если плюшками ++ не пользоваться? При том что все наработки на С. на самом деле язык вторичен. если мы говорим об ОО подходе (инструментом которого является си плас плас). Если Вы идёте от ОО "печки" то выделение сущностей, их связей и т.п. вещей - у Вас всё равно происходит. Просто на не ОО языках это реализовывать труднее. Те лохи, которые думают что вся соль в компиляторе (при этом пишут в стиле азм на си плас плас) - это просто люди которые не в теме. К сожалению таких очень и очень много
|
|
|
|
|
Nov 25 2014, 10:33
|
Группа: Новичок
Сообщений: 2
Регистрация: 23-11-14
Пользователь №: 83 803

|
Цитата(OKF @ Nov 25 2014, 00:41)  Ну, а ежели С хватает. Не из-за bool-а же переходить. А вообще, какие нужны телодвижения что бы перевести проект на С++? Какие основные отличия в оформлении, если плюшками ++ не пользоваться? При том что все наработки на С. почти никаких, С код является почти валидным кодом С++, за исключением того что С++ более строг в плане типов, просто поменяй компилятор  здесь более развёрнутый ответ http://stackoverflow.com/questions/861517/...th-a-c-compiler
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|