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

свежак KGP win32/arm/avr/mips/m68k

arm-kgp-elf-objcopy -O elf32-littlearm -S ../../out/image.elf ../../out/image.bin

Так bin получается маленький, но он получается не bin а elf :(

 

Пока выкрутился так:

$(OBJCOPY) -O binary -j .text -S $(ELF) $(BIN)

 

Светодиод моргает! :)

Но это конечно не дело...

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


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

Свежак AVR

http://klen.org/Files/DevTools/kgp_avr-bu2...avrlibc1.6.2.7z

компиллер теперь оптимизирует битовые сдвиги на предмен использования кинструкции swap, спасибо aesok

 

Решил я опять помучать ГЦЦ. Вытащил по ссылке, начал пробовать. Появилась пара вопросов. Первый:

 

test.c:

typedef unsigned char UREG;
typedef signed char REG;


static void _netw_memcpy(char *d, char *s, UREG l);

void netw_memcpy(void *d, void *s, UREG l)
{
  _netw_memcpy((char*)d,(char*)s,l);
}

static void _netw_memcpy(char *d, char *s, UREG l)
{
  char c;
  if (!l) return;
  do
  {
    c=*s++;
    *d++=c;
  }
  while(--l);
}

 

после gcc -O9 -S -mmcu=atmega168 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    netw_memcpy
    .type    netw_memcpy, @function
netw_memcpy:
    push r16
    push r17
    push r28
    push r29
/* prologue: function */
/* frame size = 0 */
    tst r20
    breq .L4
    ldi r18,lo8(0)
    ldi r19,hi8(0)
    subi r20,lo8(-(-1))
    mov r16,r20
    ldi r17,lo8(0)
    movw r28,r16
    adiw r28,1
.L3:
    movw r30,r24
    add r30,r18
    adc r31,r19
    movw r26,r22
    add r26,r18
    adc r27,r19
    ld r21,X
    st Z,r21
    subi r18,lo8(-(1))
    sbci r19,hi8(-(1))
    cp r18,r28
    cpc r19,r29
    brne .L3
.L4:
/* epilogue start */
    pop r29
    pop r28
    pop r17
    pop r16
    ret
    .size    netw_memcpy, .-netw_memcpy

 

Как-то IAR с этим справляется на ура:

        RSEG CODE:CODE:NOROOT(1)
//    8 __x_z void netw_memcpy(void *d, void *s, UREG l)
netw_memcpy:
//    9 {
//   10   _netw_memcpy((char*)d,(char*)s,l);
        REQUIRE _netw_memcpy
       ;               // Fall through to label _netw_memcpy
//   11 }
//   12 

        RSEG CODE:CODE:NOROOT(1)
//   13 static __x_z void _netw_memcpy(char *d, char *s, UREG l)
_netw_memcpy:
//   14 {
//   15   char c;
//   16   if (!l) return;
        TST     R16
        BREQ    ??_netw_memcpy_0
//   17   do
//   18   {
//   19     c=*s++;
??_netw_memcpy_1:
        LD      R17, Z+
//   20     *d++=c;
        ST      X+, R17
//   21   }
//   22   while(--l);
        DEC     R16
        BRNE    ??_netw_memcpy_1
??_netw_memcpy_0:
        RET
//   23 }

 

Вот и вопрос, ничего там в оптимизаторе случайно не сломали? А то что-то совсем мрачно. И вроде не было такого.

 

Теперь вопрос номер два. Сунул ему более глобальный файл. Получил вот такое

F:\GCC\kgp_avr\avr-kgp-elf\bin>gcc -O9 -S network.c -mmcu=atmega168
network.c: In function 'INT_ETH_PROCESS_PKT2':
network.c:810: error: unable to find a register to spill in class 'POINTER_REGS'
network.c:810: error: this is the insn:
(insn 3268 2214 3269 284 network.c:88 (set (mem/c:QI (plus:HI (reg/f:HI 28 r28)
                (const_int 24 [0x18])) [27 S1 A8])
        (reg:QI 30 r30)) 4 {*movqi} (nil))
network.c:810: internal compiler error: in spill_failure, at reload1.c:2093
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

F:\GCC\kgp_avr\avr-kgp-elf\bin>

 

Баг-репорт отправлять прямо туда или Вам?

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


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

1. чтото мне тож это не нравица, есть о чем подумать

2. -O9 всетаки нет такого уровня оптимизации, поменяйте на 0,1,2,3,s. должен пережевать исходник.

3. ветка 4.4 нестабильная, вылазит гадость, болше чем из стабильных.

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


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

-O9 всетаки нет такого уровня оптимизации, поменяйте на 0,1,2,3,s. должен пережевать исходник.

 

-O3 тоже фаталити. То с девяткой я погорячился (пользуюсь то IAR'ом)

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


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

-O3 тоже фаталити. То с девяткой я погорячился (пользуюсь то IAR'ом)

кусок кода который роняет компиллер можете дать?

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


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

Там почти что одна огромная функция. Набитая циклами, кейсами, goto и прочим. В личку могу дать.

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


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

Там почти что одна огромная функция. Набитая циклами, кейсами, goto и прочим. В личку могу дать.

давайте

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


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

1. чтото мне тож это не нравица, есть о чем подумать
Да и раньше было не сахар (я тут писал об оптимизации скорости вывода на дисплей).

Таким макаром циклы реализовывать это надо уметь.

Самое обидное, что ничего в этом направлении не меняется уже давно...

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


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

давайте

 

Могу, кстати, еще в досыл дать иаровский листинг, дабы было видно, куда стремиться ;)

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


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

А мне что-нить подскажете? :)

 

В общем, сделал пока так. Сравнил elf-ы, производимые arm-kgp-elf- и arm-none-eabi-, нашёл, что в arm-kgp-elf- есть "лишняя" секция .eh_frame. И скомандовал objcopy выкинуть эту секцию при формировании bin-файла. bin стал получаться нормального размера, светодиод мигает.

(Напомню, я пытаюсь работать с arm-kgp-elf- и stm32)

Я правильно сделал?

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


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

В общем, сделал пока так. Сравнил elf-ы, производимые arm-kgp-elf- и arm-none-eabi-, нашёл, что в arm-kgp-elf- есть "лишняя" секция .eh_frame. И скомандовал objcopy выкинуть эту секцию при формировании bin-файла. bin стал получаться нормального размера, светодиод мигает.

(Напомню, я пытаюсь работать с arm-kgp-elf- и stm32)

Я правильно сделал?

 

я также делаю, тока по другому

.eh_frame - секция исполняемого кода, содержит код относящийся к механизму обработки исключений, при компиляции языка С механизм исключения отсутствует, поэтому этот код ессесено не нужен. Текущее состояние компиллера таково что без разбора сует эту секцию всегда независимо от языка с которого компиляется исходник. Я использую С для армов, соответственно код этой мертвой секции тока бесполезна использует флеш. можно удалить ее как Вы предлагаете strip --remove-section=".eh_frame" , но проще ее просто не пропустить на выход линкера прописав в скрипте линкера :

 

SECTIONS

{

.......................

.......................

 

/DISCARD/ : /*секцию исключений ф топку*/

{

*(.eh_frame)

}

 

........................

........................

 

}

 

Если вы умудряетесь использовать C++ (я это делал тока для тестирования, кстата вшивалось в lpc2103? шмешно, правдв?) и возможно используете исключения то эту секцию удалять нельзя. Я даже боюсь предположить что будет если кинуть ексепшен :) если соберется проект.

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


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

я также делаю, тока по другому

.eh_frame - секция исполняемого кода, содержит код относящийся к механизму обработки исключений

Теперь стало понятнее. Указал линкеру, что эту секцию надо поместить в ROM:
...
    *(.text)        /* Program code */
    *(.eh_frame)    /* exceptions */
    *(.rodata)      /* Read only data */
    } >rom

, всё стало нормально без выкидывания. Пусть будет, cpp я использовать собираюсь (scmRtos), правда, без exceptions наверное :)

Если вы умудряетесь использовать C++ (я это делал тока для тестирования, кстата вшивалось в lpc2103? шмешно, правдв?)

Тут люди в AVR-ках его используют, и ничего, нормуль:-)

если соберется проект.

А что, есть сомнения? Вообще, что посоветуете использовать для cortex-m3, arm-kgp-elf- или arm-none-eabi- из Sourcery G++ ?

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


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

>А что, есть сомнения?

 

есть сомнения в целесообразности

 

>Вообще, что посоветуете использовать для cortex-m3, arm-kgp-elf- или arm-none-eabi- из Sourcery G+

 

выбери то что меньше глючить и дает лучший код

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


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

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

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

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

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

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

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

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

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

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