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

 
 
> Фрагмент кода, GCC оптимизация
OKF
сообщение Nov 19 2014, 08:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 17)
Сергей Борщ
сообщение Nov 19 2014, 08:57
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
OKF
сообщение Nov 19 2014, 09:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2014, 10:03
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
OKF
сообщение Nov 19 2014, 10:18
Сообщение #5


Участник
*

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



Код
avr-gcc (WinAVR 20100110) 4.3.3

Неужто это так важно?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2014, 10:28
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 19 2014, 11:04
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я пользуюсь 4.9.2 отсюда: http://sourceforge.net/projects/mobileches...hots%20(Win32)/
Go to the top of the page
 
+Quote Post
OKF
сообщение Nov 19 2014, 14:07
Сообщение #8


Участник
*

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



Цитата(Genadi Zawidowski @ Nov 19 2014, 14:04) *
Я пользуюсь 4.9.2 отсюда: http://sourceforge.net/projects/mobileches...hots%20(Win32)/

Сергей Борщ, 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)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 19 2014, 15:40
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Лениво... а оптимизацию включили? Целиком ИСХОДНИК странного места в студию.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2014, 16:58
Сообщение #10


Гуру
******

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



и команду вызова компилятора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
OKF
сообщение Nov 20 2014, 06:46
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 20 2014, 20:08
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Что такое key_pressed - какого оно типа? НУ что не привести ещё пару строк?
Go to the top of the page
 
+Quote Post
OKF
сообщение Nov 21 2014, 01:19
Сообщение #13


Участник
*

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



Цитата(Genadi Zawidowski @ Nov 20 2014, 23:08) *
Что такое key_pressed - какого оно типа? НУ что не привести ещё пару строк?

Ну как же, всё указано:
Код
static unsigned char key_pressed;

Как я понимаю, тут лог. отрицание приводится к int-у. А этого не хотелось бы...
Go to the top of the page
 
+Quote Post
OKF
сообщение Nov 22 2014, 12:01
Сообщение #14


Участник
*

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



Кстати, с 4.9.2 размер увеличился, как это ни странно.
Go to the top of the page
 
+Quote Post
acrix
сообщение Nov 23 2014, 19:51
Сообщение #15





Группа: Новичок
Сообщений: 2
Регистрация: 23-11-14
Пользователь №: 83 803



в С результат логической операции имеет тип int, отсюда и расширение до int который по умолчанию для avr 2 байта, можно использовать опцию -mint8 но тогда потеряете бинарную совместимость при линковке с кодом который такую опцию не использует в частности сразу теряете бинарную совместимость с avr-libc, такой проблемы нет в C++ в котором для архитектуры avr встроенный тип bool равен одному байту и соответственно логические операции имеют тип bool, кстати интересно узнать, какой смысл использовать компилятор С если для таргет архитектуры существует хорошо реализованный компилятор С++?
Go to the top of the page
 
+Quote Post
OKF
сообщение Nov 24 2014, 17:41
Сообщение #16


Участник
*

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



Цитата(acrix @ Nov 23 2014, 22:51) *
в С результат логической операции имеет тип int, отсюда и расширение до int который по умолчанию для avr 2 байта, можно использовать опцию -mint8 но тогда потеряете бинарную совместимость при линковке с кодом который такую опцию не использует в частности сразу теряете бинарную совместимость с avr-libc, такой проблемы нет в C++ в котором для архитектуры avr встроенный тип bool равен одному байту и соответственно логические операции имеют тип bool, кстати интересно узнать, какой смысл использовать компилятор С если для таргет архитектуры существует хорошо реализованный компилятор С++?

Ну, а ежели С хватает. Не из-за bool-а же переходить. А вообще, какие нужны телодвижения что бы перевести проект на С++? Какие основные отличия в оформлении, если плюшками ++ не пользоваться? При том что все наработки на С.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 24 2014, 21:28
Сообщение #17


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(OKF @ Nov 24 2014, 20:41) *
...какие нужны телодвижения что бы перевести проект на С++? Какие основные отличия в оформлении, если плюшками ++ не пользоваться? При том что все наработки на С.


на самом деле язык вторичен. если мы говорим об ОО подходе (инструментом которого является си плас плас). Если Вы идёте от ОО "печки"
то выделение сущностей, их связей и т.п. вещей - у Вас всё равно происходит. Просто на не ОО языках это реализовывать труднее.
Те лохи, которые думают что вся соль в компиляторе (при этом пишут в стиле азм на си плас плас) - это просто люди которые не в теме.
К сожалению таких очень и очень много sad.gif
Go to the top of the page
 
+Quote Post
acrix
сообщение Nov 25 2014, 10:33
Сообщение #18





Группа: Новичок
Сообщений: 2
Регистрация: 23-11-14
Пользователь №: 83 803



Цитата(OKF @ Nov 25 2014, 00:41) *
Ну, а ежели С хватает. Не из-за bool-а же переходить. А вообще, какие нужны телодвижения что бы перевести проект на С++? Какие основные отличия в оформлении, если плюшками ++ не пользоваться? При том что все наработки на С.



почти никаких, С код является почти валидным кодом С++, за исключением того что С++ более строг в плане типов, просто поменяй компилятор sm.gif

здесь более развёрнутый ответ http://stackoverflow.com/questions/861517/...th-a-c-compiler
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 14:19
Рейтинг@Mail.ru


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