Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Фрагмент кода
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
OKF
Простейший фрагмент, а не нравится:
Код
  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, 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:

OKF
Цитата(Сергей Борщ @ 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.
Сергей Борщ
Цитата(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

OKF
Код
avr-gcc (WinAVR 20100110) 4.3.3

Неужто это так важно?
Сергей Борщ
Цитата(OKF @ Nov 19 2014, 12:18) *
Неужто это так важно?
Разумеется. Попробуйте что-нибудь посвежее. Я давно не слежу за выпуском сборок под виндовс, возможно вы найдете и более свежие.
Genadi Zawidowski
Я пользуюсь 4.9.2 отсюда: http://sourceforge.net/projects/mobileches...hots%20(Win32)/
OKF
Цитата(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)
Genadi Zawidowski
Лениво... а оптимизацию включили? Целиком ИСХОДНИК странного места в студию.
Сергей Борщ
и команду вызова компилятора.
OKF
Нет, на самом деле в последнем случае было:
Код
  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
Genadi Zawidowski
Что такое key_pressed - какого оно типа? НУ что не привести ещё пару строк?
OKF
Цитата(Genadi Zawidowski @ Nov 20 2014, 23:08) *
Что такое key_pressed - какого оно типа? НУ что не привести ещё пару строк?

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

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

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


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



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

здесь более развёрнутый ответ http://stackoverflow.com/questions/861517/...th-a-c-compiler
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.