|
|
  |
свежак KGP win32/arm/avr/mips/m68k, GNU tools chain |
|
|
|
Nov 12 2008, 19:34
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(klen @ Nov 13 2008, 00:13)  Код 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) Светодиод моргает!  Но это конечно не дело...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 13 2008, 06:49
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(klen @ Nov 11 2008, 20:28)  Свежак 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> Баг-репорт отправлять прямо туда или Вам?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Nov 13 2008, 11:38
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(klen @ Nov 13 2008, 12:15)  1. чтото мне тож это не нравица, есть о чем подумать Да и раньше было не сахар (я тут писал об оптимизации скорости вывода на дисплей). Таким макаром циклы реализовывать это надо уметь. Самое обидное, что ничего в этом направлении не меняется уже давно...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 14 2008, 06:52
|

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

|
Цитата(AHTOXA @ Nov 13 2008, 22:44)  В общем, сделал пока так. Сравнил 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? шмешно, правдв?) и возможно используете исключения то эту секцию удалять нельзя. Я даже боюсь предположить что будет если кинуть ексепшен  если соберется проект.
|
|
|
|
|
Nov 14 2008, 19:44
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(klen @ Nov 14 2008, 12:52)  я также делаю, тока по другому .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++ ?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
11 чел. читают эту тему (гостей: 11, скрытых пользователей: 0)
Пользователей: 0
|
|
|