Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Собрал свежий GCC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
klen
Собрал новые сборки GCC для ARM/AVR, кому интересно качайте пробуйте, сообщайте о глюках.
Сборка для AVR протестина мной на текущем проекте, все пока работает.
http://www.klen.org/Projects/Embeded-gnu-t...last_build.html
singlskv
Цитата(klen @ Dec 4 2006, 18:16) *
Собрал новые сборки 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

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

Ну, или может быть Вы знаете кому можно переадресовать этот вопрос ?
SysRq
Есть 20060421 WinAVR (работает, компилирует, ошибок нет). Скажите, как на него поставить вашу сборку? Если скопировать поверх, то ругается: не может открыть ни одного стандартного хедера... Чайник я, что не так делаю?
klen
2_singlskv
Кусочек С кода приведите который приводитк к такой генерации, я посмотрю че происходит, очень интересно.

2_SysRq
smile.gif я сам решаю эту проблему так
указанием путя с помощю опции -I для gcc
или прописыванием PATH=$(PATH);aaa/bbb/cccc/rootdir/local/avr/include
тогда начинает работать.
А вы относительный путь сохранили от local/bin/avr-gcc до local/avr/include?
Я как раз и работаю над тем чтоб небыло таких проблем при установке пакета в любое место.
singlskv
Цитата(klen @ Dec 5 2006, 11:28) *
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
klen
Тупо всунул и закомпилял:
Код
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 есть константа типа адресс, взять от нее еще раз адрес это че получится?. Или я чето не догнал?
singlskv
Цитата(klen @ Dec 5 2006, 12:01) *
Тупо всунул и закомпилял:
Код
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, и взять что там хранится типа индерект доступ
к портам.
А код у Вас странный скомпилился.
Какой уровень оптимизации у Вас стоит ?
klen
Цитата(singlskv @ Dec 5 2006, 12:14) *
А код у Вас странный скомпилился.
Какой уровень оптимизации у Вас стоит ?

я почти всегда использую -Os, он и быстр и меньше размер. Без оптимизации только для особых случаев - например сравнить чтот с чемто. Потому что с отладочной инфой в формате dwarf2 отладчик AVRS и так не плохо лазит по коду.
singlskv
Цитата(klen @ Dec 5 2006, 12:01) *
Тупо всунул и закомпилял:
Код
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]);
klen
код:
Код
//-------------------------------------------------------------------
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 уже не пресутствует smile.gif А это ваще правильный код, мне в данный момент некогда разглядывать его.
singlskv
Цитата(klen @ Dec 5 2006, 23:45) *
код:
Код
//-------------------------------------------------------------------
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 уже не пресутствует smile.gif А это ваще правильный код, мне в данный момент некогда разглядывать его.

А можно код полностью, и с опциями компилятору/ линкеру, тогда сравним/ проверим.
и еще,тип процессора укажите, please
klen
Опции компиляции:
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 из одной функции которую я уже привел
singlskv
Вот код который я ему подсунул: (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 никуда не пропал (блин гад такой angry.gif )
klen
оптимизация -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
singlskv
Цитата(klen @ Dec 6 2006, 01:15) *
оптимизация -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 отсутствует smile.gif
SysRq
Цитата(klen @ Dec 5 2006, 11:28) *
2_SysRq
smile.gif я сам решаю эту проблему так...

Да, пути сохранил все. Я тоже через PATH сделал сразу, но думал что сам чего-то лишнего натворил что пришлось PATH править smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.