sergforce 0 18 мая, 2006 Опубликовано 18 мая, 2006 · Жалоба Скачал я набор компилятора GCC 4.1 с проекта GNUARM (http://www.gnuarm.com/) Базовые файлы нашёл на at91.com: http://www.at91.com/www/phpBB2_mirror/download.php4?id=211 И скомпилил протенький приерчик (мигает свтодиодом, под 91SAM7S128) ... инклуды и всё такое #define SPEED (MCKKHz/10) unsigned int LedSpeed = SPEED *50; void wait ( void ) { unsigned int waiting_time ; change_speed () ; for(waiting_time = 0; waiting_time < LedSpeed; waiting_time++) ; } int main() { AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ; AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED2 ) ; AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2 ) ; for (;;) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2) ; wait(); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2 ) ; wait(); wait(); } } всё прошло хорошо на на этапе генерации бинарника arm-elf-objcopy --output-target=binary a.out BasicGNU.bin он из a.out (71кб) сгенерил бинарник на 2mb + 4bytes!!! открыв в hex редакторе увидил что первые ~900 байт ненулевые далее идут 0 и по смечению 2mb записано чило, очень похожее на SPEED *50. Объявив эту переменную просто глобально, без инициализации, и проделав инициализацую в mian бинарник стал 924байта, успешно залился и на платке мигает диод.. На IAR первоначальный код генерирует нормальный бинарник. Может кто-то работал с GNUARM и знает в чём дело? (даже если кто-то и не работа, всё равно интересно мнения =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 18 мая, 2006 Опубликовано 18 мая, 2006 · Жалоба Посмотрите в makefile какой используеться скрипт для линкера и сам скрипт *.ld.(секция MEMORY) Кроме того на выходе компилятотра даеться раскладка по адресам и размерам различных секций памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergforce 0 19 мая, 2006 Опубликовано 19 мая, 2006 (изменено) · Жалоба Посмотрите в makefile какой используеться скрипт для линкера и сам скрипт *.ld.(секция MEMORY) Кроме того на выходе компилятотра даеться раскладка по адресам и размерам различных секций памяти. В BasicGNU такой скрипт OUTPUT_ARCH(ARM) /* specify the AT91SAM7S64 memory areas */ MEMORY { flash : ORIGIN = 0x00000000, LENGTH = 64K /* free FLASH area */ ram : ORIGIN = 0x00200000, LENGTH = 16K /* free RAM area */ } /* define a global symbol _stack_end <=> End of SRAM */ _stack_end = 0x00210000; SECTIONS { /* Code and data are mapped at the bottom of the internal FLASH */ .text : { _text = .; /* define a global symbol marking the start of the .text section */ *(.startup) /* define the entry point */ *(.text) /* all .text sections (code) */ _etext = .; /* define a global symbol marking the end of the .text section */ } > flash .rodata : { _srodata = .; /* define a global symbol marking the start of the .rodata section */ *(.rodata) /* all .rodata .rodata* sections (constants, strings, etc.) */ *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ *(.glue_7) /* all .glue_7 sections (mandatory before gcc 4.0.0) */ *(.glue_7t) /* all .glue_7t sections (mandatory before gcc 4.0.0) */ _erodata = .; /* define a global symbol marking the end of the .rodata section */ } > flash .data : { _sdata = .; /* define a global symbol marking the start of the .data section */ *(.data) /* all .data sections */ _edata = .; /* define a global symbol marking the end of the .data section */ } > ram .bss : { __bss_start = .; /* define a global symbol marking the start of the .bss section */ *(.bss) /* all .bss sections */ *(COMMON) __bss_end = .; /* define a global symbol marking the end of the .bss section */ } > ram _end = .; /* define a global symbol marking the end of application */ end = .; } Причем если глобальная переменная неинициализирована (или 0) то она попадает в .bss и всё ОК Но если её инициализировать глобально то она попадает в .data и при генерации бинарника происходит глюк. Я не силен в ldscript =( но может у кого-то есть какие-то домыслы как исправить ситуацию. Вот посмотрел на секции в IAR: SEGMENTS IN THE MODULE ====================== DATA_I Relative segment, address: 00200000 - 00200003 (0x4 bytes), align: 2 Segment part 2. Intra module refs: Segment part 9 ENTRY ADDRESS REF BY ===== ======= ====== LedSpeed 00200000 ....... DATA_ID Relative segment, address: 000002A4 - 000002A7 (0x4 bytes), align: 2 Segment part 3. Intra module refs: LedSpeed ------------------------------------------------------------------------- INITTAB Relative segment, address: 00000298 - 000002A3 (0xc bytes), align: 2 Segment part 13. ROOT. ENTRY ADDRESS REF BY ===== ======= ====== ?init?tab?DATA_I 00000298 Тоесть IAR инициализированные переменные хранит во флеше, и добавляет код инициализации секции инициализированных данных, как заставить GNUARM делать такое же? Изменено 19 мая, 2006 пользователем sff Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 19 мая, 2006 Опубликовано 19 мая, 2006 · Жалоба Странно, у меня все нормально. Киньте makefile и скрипты - сравню со своими. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergforce 0 19 мая, 2006 Опубликовано 19 мая, 2006 · Жалоба Странно, у меня все нормально. Киньте makefile и скрипты - сравню со своими. прикрепил архив тестового проекта gnu_test.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба Просмотрел, пособирал - действительно бинарник сумасшедший. Найти 10 отличий со своими не получилось, потому что их там 100 :) Единственное, что могу сказать линкерные скрипты одинаковые, проблема где-то в ключах линкера/обжкопи. Возможно стоит собрать в hex и посмотреть, что получиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergforce 0 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба Просмотрел, пособирал - действительно бинарник сумасшедший. Найти 10 отличий со своими не получилось, потому что их там 100 :) Единственное, что могу сказать линкерные скрипты одинаковые, проблема где-то в ключах линкера/обжкопи. Возможно стоит собрать в hex и посмотреть, что получиться. Да хоть и BasicGNU+GNUARM дает меньший объем проги (когда нет глобальных переменных =) Вобщем забил я на эту связку использую WinARM, этот без проблем генерит всё как надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться