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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Фрагмент кода, 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
Сергей Борщ
сообщение 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

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

 


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


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