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

 
 
> Обращение к порту из gcc ?, Как заставить компиллировать в "IN R16,0x10" а не
Григорий2000
сообщение Mar 28 2008, 08:29
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 13-03-06
Пользователь №: 15 210



Как заставить компиллировать в gcc-avr чтение порта
"IN R16,0x10",(как в IARe)
а не
" LDI R30,0x30
LDI R31,0x00
LDD R24,Z+0 "
в последней версии все inp();
и inb();
не работают(не приводят к ожидаемому эффекту)
есть ведь какое-то волшебное слово которое хочет увидеть gcc-avr? что-бы читать порт быстро и красиво

Сообщение отредактировал Григорий2000 - Mar 28 2008, 08:31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
klen
сообщение Mar 28 2008, 09:18
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



исходный тестовый код test.c
Код

#include <avr/io.h>
char v = 0x55;
int main()
{
  v = 0xaa;
  asm volatile ("nop");   // граница кодогенерации чтения порта
  v = PORTD;
  asm volatile ("nop");   // граница кодогенерации чтения порта
  v = v * v;
  
  return (int)v;
}


avr-gcc -mmcu=atmega88 -Os -S test.c

результат
Код
    .file    "test.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
    .global __do_copy_data
    .global __do_clear_bss
    .text
.global    main
    .type    main, @function
main:
/* prologue: function */
/* frame size = 0 */
/* #APP */
;  8 "test.c" 1
    nop
;  0 "" 2
/* #NOAPP */
    in r18,43-0x20
/* #APP */
;  10 "test.c" 1
    nop
;  0 "" 2
/* #NOAPP */
    mul r18,r18
    mov r18,r0
    clr r1
    sts v,r18
    clr r19
    sbrc r18,7
    com r19
    movw r24,r18
/* epilogue start */
    ret
    .size    main, .-main
.global    v
    .data
    .type    v, @object
    .size    v, 1
v:
    .byte    85


на че конкретно собсна балоны накатываются? поподробнее нада а то ниче не понято у Вас за проблема. нада код, асм, версию компиллера, ключи компиляции..... сайт не телепатическийsad.gif
Go to the top of the page
 
+Quote Post
Григорий2000
сообщение Mar 28 2008, 10:50
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 13-03-06
Пользователь №: 15 210



сорри.
В одном случае
код

...
if (answer == 0)
{
in=(PIN_DAT_IN) << 2;
...
компилируется в

249: if (answer == 0)
LDS R24,0x006A Load direct from data space
TST R24 Test for Zero or Minus
BREQ PC+0x02 Branch if equal
RJMP PC+0x0095 Relative jump
252: in=(PIN_DAT_IN) << 2;
LDI R30,0x30 Load immediate
LDI R31,0x00 Load immediate
LDD R24,Z+0 Load indirect with displacement
LSL R24 Logical Shift Left
LSL R24 Logical Shift Left
STD Y+2,R24 Store indirect with displacement

в другом случае(IAR 4.20)
в
249: if (!answer)
LDS R16,0x00B0 Load direct from data space
TST R16 Test for Zero or Minus
BREQ PC+0x02 Branch if equal
RJMP PC+0x005D Relative jump
251: in=PIN_DAT_IN << 5;
IN R16,0x10 In from I/O location
MOV R17,R16 Copy register
BST R17,3 Bit store from register to T
LDI R17,0x00 Load immediate
BLD R17,5


разница в операциях со сдвигом это из-за неиспользования остальных бит в дальнейшем
компилил в среде CodeBlocks8.02, gcc-avr из установленного WINAVR от 20071221.
Мысли о makefile оставил CodeBlocks. сейчас попробую в WINAVR свой маке нарисовать
видимо зря доверил маке этой среде... со своим маке

249: if (answer == 0)
LDS R24,0x0068 Load direct from data space
TST R24 Test for Zero or Minus
BREQ PC+0x02 Branch if equal
RJMP PC+0x004F Relative jump
252: in=(PIN_DAT_IN) << 2;
IN R19,0x10 In from I/O location
LSL R19 Logical Shift Left
LSL R19 Logical Shift Left
спасибо за внимание!
Go to the top of the page
 
+Quote Post
klen
сообщение Mar 28 2008, 13:35
Сообщение #4


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



вход:
Код
#include <avr/io.h>
#define PIN_DAT_IN PORTD
char in;

void foo ( char answer  )
{
if (answer == 0)
  {
    in=(PIN_DAT_IN) << 2;
  }
}


выход
Код
    .file    "a.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
    .global __do_copy_data
    .global __do_clear_bss
    .text
.global    foo
    .type    foo, @function
foo:
/* prologue: function */
/* frame size = 0 */
    tst r24
    brne .L3
    in r24,43-0x20
    ldi r25,lo8(0)
    lsl r24
    rol r25
    lsl r24
    rol r25
    sts in,r24
.L3:
    ret
    .size    foo, .-foo
    .comm in,1,1


короче говоря ройте в сторону ключей оптимизации наверно. А Makefile нада писать самому twak.gif
Go to the top of the page
 
+Quote Post
AlexKLm
сообщение Mar 29 2008, 14:40
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 160
Регистрация: 17-03-08
Из: Мурманская
Пользователь №: 35 989



Да, именно, - в сторону как минимум -O 1 для линкера.
Сходная проблема была описана:
http://electronix.ru/forum/lofiversion/index.php/t45366.html
Цитата


Сообщение отредактировал AlexKLm - Mar 29 2008, 14:42


--------------------
Демократия - это когда считается, что два дурака лучше одного умного
Суверенная демократия - это когда считается, что один дурак лучше двух дураков
Go to the top of the page
 
+Quote Post
Григорий2000
сообщение Apr 2 2008, 19:25
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 13-03-06
Пользователь №: 15 210



Спасибо за советы
Go to the top of the page
 
+Quote Post

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

 


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


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