Перейти к содержанию
    

Собрал новые сборки GCC для ARM/AVR, кому интересно качайте пробуйте, сообщайте о глюках.

Сборка для AVR протестина мной на текущем проекте, все пока работает.

http://www.klen.org/Projects/Embeded-gnu-t...last_build.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собрал новые сборки GCC для ARM/AVR, кому интересно качайте пробуйте, сообщайте о глюках.

Сборка для AVR протестина мной на текущем проекте, все пока работает.

http://www.klen.org/Projects/Embeded-gnu-t...last_build.html

У меня есть вопросик к Вам, как к человеку имеющему некоторое отношение к GCC.

Можете ли Вы сказать почему GCC генерит такой код:

+0000020A:   91800109    LDS     R24,0x0109       Load direct from data space
+0000020C:   2FE8        MOV     R30,R24          Copy register
+0000020D:   27FF        CLR     R31              Clear Register
+0000020E:   8180        LDD     R24,Z+0          Load indirect with displacement

вместо

    LDS     R30,0x0109
    CLR     R31
    LDD     R24,Z+0

и можно ли это как-нибудь обойти ? (соптимизировать)

 

Ну, или может быть Вы знаете кому можно переадресовать этот вопрос ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть 20060421 WinAVR (работает, компилирует, ошибок нет). Скажите, как на него поставить вашу сборку? Если скопировать поверх, то ругается: не может открыть ни одного стандартного хедера... Чайник я, что не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2_singlskv

Кусочек С кода приведите который приводитк к такой генерации, я посмотрю че происходит, очень интересно.

 

2_SysRq

:) я сам решаю эту проблему так

указанием путя с помощю опции -I для gcc

или прописыванием PATH=$(PATH);aaa/bbb/cccc/rootdir/local/avr/include

тогда начинает работать.

А вы относительный путь сохранили от local/bin/avr-gcc до local/avr/include?

Я как раз и работаю над тем чтоб небыло таких проблем при установке пакета в любое место.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2_singlskv

Кусочек С кода приведите который приводитк к такой генерации, я посмотрю че происходит, очень интересно.

 

BYTE PIN_[2]={
    (BYTE)(&PINB),
    (BYTE)(&PIND)
  };

  tmp1= *(volatile BYTE *)((WORD)PIN_[0]);

результат компиляции

160:        tmp1= *(volatile BYTE *)((WORD)PIN_[0]);
+0000020A:   91800100    LDS     R24,0x0100       Load direct from data space
+0000020C:   2FE8        MOV     R30,R24          Copy register
+0000020D:   27FF        CLR     R31              Clear Register
+0000020E:   8180        LDD     R24,Z+0          Load indirect with displacement

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тупо всунул и закомпилял:

uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
  26:    83 b1           in    r24, 0x03; 3
  28:    89 83           std    Y+1, r24; 0x01

 

Но сам код странный, напимер &PINB - ведь PINB есть константа типа адресс, взять от нее еще раз адрес это че получится?. Или я чето не догнал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тупо всунул и закомпилял:

uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
  26:    83 b1           in    r24, 0x03; 3
  28:    89 83           std    Y+1, r24; 0x01

 

Но сам код странный, напимер &PINB - ведь PINB есть константа типа адресс, взять от нее еще раз адрес это че получится?. Или я чето не догнал?

Нет, это преобразуем &PINB к указателю на uint8_t, и взять что там хранится типа индерект доступ

к портам.

А код у Вас странный скомпилился.

Какой уровень оптимизации у Вас стоит ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А код у Вас странный скомпилился.

Какой уровень оптимизации у Вас стоит ?

я почти всегда использую -Os, он и быстр и меньше размер. Без оптимизации только для особых случаев - например сравнить чтот с чемто. Потому что с отладочной инфой в формате dwarf2 отладчик AVRS и так не плохо лазит по коду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тупо всунул и закомпилял:

uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
  26:    83 b1           in    r24, 0x03; 3
  28:    89 83           std    Y+1, r24; 0x01

А как он у Вас закомпелит вот такой код ?

uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
PIN_[0]=(uint8_t)(&PIND);
uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]);
PIN_[0]=(uint8_t)(&PING);
uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код:

//-------------------------------------------------------------------
void x () __attribute__ ((naked));
void x () 
{
volatile uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
PIN_[0]=(uint8_t)(&PIND);
volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]);
PIN_[0]=(uint8_t)(&PINC);
volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]);
}

 

 

листинг .lss

//-------------------------------------------------------------------
void x () __attribute__ ((naked));
void x () 
{
1c2:    83 e2           ldi    r24, 0x23; 35
1c4:    8c 83           std    Y+4, r24; 0x04
1c6:    99 e2           ldi    r25, 0x29; 41
1c8:    9d 83           std    Y+5, r25; 0x05
volatile uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
1ca:    ec 81           ldd    r30, Y+4; 0x04
1cc:    ff 27           eor    r31, r31
1ce:    80 81           ld    r24, Z
1d0:    89 83           std    Y+1, r24; 0x01
PIN_[0]=(uint8_t)(&PIND);
1d2:    9c 83           std    Y+4, r25; 0x04
volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]);
1d4:    ec 81           ldd    r30, Y+4; 0x04
1d6:    ff 27           eor    r31, r31
1d8:    80 81           ld    r24, Z
1da:    8a 83           std    Y+2, r24; 0x02
PIN_[0]=(uint8_t)(&PINC);
1dc:    86 e2           ldi    r24, 0x26; 38
1de:    8c 83           std    Y+4, r24; 0x04
volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]);
1e0:    ec 81           ldd    r30, Y+4; 0x04
1e2:    ff 27           eor    r31, r31
1e4:    80 81           ld    r24, Z
1e6:    8b 83           std    Y+3, r24; 0x03

 

Какие выводы? К примеру mov уже не пресутствует :) А это ваще правильный код, мне в данный момент некогда разглядывать его.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код:

//-------------------------------------------------------------------
void x () __attribute__ ((naked));
void x () 
{
volatile uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
PIN_[0]=(uint8_t)(&PIND);
volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]);
PIN_[0]=(uint8_t)(&PINC);
volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]);
}

 

 

листинг .lss

//-------------------------------------------------------------------
void x () __attribute__ ((naked));
void x () 
{
1c2:    83 e2           ldi    r24, 0x23; 35
1c4:    8c 83           std    Y+4, r24; 0x04
1c6:    99 e2           ldi    r25, 0x29; 41
1c8:    9d 83           std    Y+5, r25; 0x05
volatile uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };

volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
1ca:    ec 81           ldd    r30, Y+4; 0x04
1cc:    ff 27           eor    r31, r31
1ce:    80 81           ld    r24, Z
1d0:    89 83           std    Y+1, r24; 0x01
PIN_[0]=(uint8_t)(&PIND);
1d2:    9c 83           std    Y+4, r25; 0x04
volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]);
1d4:    ec 81           ldd    r30, Y+4; 0x04
1d6:    ff 27           eor    r31, r31
1d8:    80 81           ld    r24, Z
1da:    8a 83           std    Y+2, r24; 0x02
PIN_[0]=(uint8_t)(&PINC);
1dc:    86 e2           ldi    r24, 0x26; 38
1de:    8c 83           std    Y+4, r24; 0x04
volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]);
1e0:    ec 81           ldd    r30, Y+4; 0x04
1e2:    ff 27           eor    r31, r31
1e4:    80 81           ld    r24, Z
1e6:    8b 83           std    Y+3, r24; 0x03

 

Какие выводы? К примеру mov уже не пресутствует :) А это ваще правильный код, мне в данный момент некогда разглядывать его.

А можно код полностью, и с опциями компилятору/ линкеру, тогда сравним/ проверим.

и еще,тип процессора укажите, please

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опции компиляции:

avr-gcc -c -mmcu=atmega88 -I. -gdwarf-2 -DF_CPU=24000000 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -I/local/avr/include -std=gnu99 -Wp,-M,-MP,-MT,main.o,-MF,.dep/main.o.d main.c -o main.o

 

Код модуля main.c из одной функции которую я уже привел

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот код который я ему подсунул: (WinAVR 20060421 оптимизация -Os)

#include <avr/io.h>

uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };
int main()
{
  volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
  return tmp1;
}

результат:

+00000035:   EFCE        LDI     R28,0xFE         Load immediate
+00000036:   E0D4        LDI     R29,0x04         Load immediate
+00000037:   BFDE        OUT     0x3E,R29         Out to I/O location
+00000038:   BFCD        OUT     0x3D,R28         Out to I/O location
9:          volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
+00000039:   91800100    LDS     R24,0x0100       Load direct from data space
+0000003B:   2FE8        MOV     R30,R24          Copy register
+0000003C:   27FF        CLR     R31              Clear Register
+0000003D:   8180        LDD     R24,Z+0          Load indirect with displacement
+0000003E:   8389        STD     Y+1,R24          Store indirect with displacement
10:         return tmp1;
+0000003F:   8189        LDD     R24,Y+1          Load indirect with displacement
11:       }

Э...Э... mov r30,r24 никуда не пропал (блин гад такой :angry2: )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оптимизация -Os gcc4.2.0

#include <avr/io.h>

uint8_t PIN_[2]={
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };
int main_1()
{
  volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
  return tmp1;
}

результат:

test.o:     file format elf32-avr
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000034  00000000  00000000  00000034  2**0
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000002  00000000  00000000  00000068  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  0000006a  2**0
                  ALLOC
  3 .debug_abbrev 00000090  00000000  00000000  0000006a  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   000000b3  00000000  00000000  000000fa  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  5 .debug_line   00000088  00000000  00000000  000001ad  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  6 .debug_frame  0000001c  00000000  00000000  00000235  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  7 .debug_pubnames 00000026  00000000  00000000  00000251  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  8 .debug_aranges 00000014  00000000  00000000  00000277  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  9 .debug_str    0000012d  00000000  00000000  0000028b  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <main_1>:
                  (uint8_t)(&PINB),
                  (uint8_t)(&PIND)
                };
int main_1()
{
   0:    cf 93           push    r28
   2:    df 93           push    r29
   4:    cd b7           in    r28, 0x3d; 61
   6:    de b7           in    r29, 0x3e; 62
   8:    21 97           sbiw    r28, 0x01; 1
   a:    0f b6           in    r0, 0x3f; 63
   c:    f8 94           cli
   e:    de bf           out    0x3e, r29; 62
  10:    0f be           out    0x3f, r0; 63
  12:    cd bf           out    0x3d, r28; 61
  volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
  14:    e0 91 00 00     lds    r30, 0x0000
  18:    ff 27           eor    r31, r31
  1a:    80 81           ld    r24, Z
  1c:    89 83           std    Y+1, r24; 0x01
  return tmp1;
  1e:    89 81           ldd    r24, Y+1; 0x01
}  20:    99 27           eor    r25, r25
  22:    21 96           adiw    r28, 0x01; 1
  24:    0f b6           in    r0, 0x3f; 63
  26:    f8 94           cli
  28:    de bf           out    0x3e, r29; 62
  2a:    0f be           out    0x3f, r0; 63
  2c:    cd bf           out    0x3d, r28; 61
  2e:    df 91           pop    r29
  30:    cf 91           pop    r28
  32:    08 95           ret

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оптимизация -Os gcc4.2.0

  volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]);
  14:    e0 91 00 00     lds    r30, 0x0000
  18:    ff 27           eor    r31, r31
  1a:    80 81           ld    r24, Z
  1c:    89 83           std    Y+1, r24; 0x01

Судя по всему Ваша версия не осилила конструкцию.

lds r30,0x0000 эквивалентно mov r30,r1

 

Возможно в Вашей версии нужно писать просто PINB вместо &PINB

 

но зато mov r30,r24 отсутствует :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...