Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с GNUARM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sff
Скачал я набор компилятора 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
Посмотрите в makefile какой используеться скрипт для линкера и сам скрипт *.ld.(секция MEMORY)
Кроме того на выходе компилятотра даеться раскладка по адресам и размерам различных секций памяти.
sff
Цитата(beer_warrior @ May 19 2006, 01:07) *
Посмотрите в 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 делать такое же?
beer_warrior
Странно, у меня все нормально.
Киньте makefile и скрипты - сравню со своими.
sff
Цитата(beer_warrior @ May 19 2006, 17:21) *
Странно, у меня все нормально.
Киньте makefile и скрипты - сравню со своими.


прикрепил архив тестового проекта
beer_warrior
Просмотрел, пособирал - действительно бинарник сумасшедший.
Найти 10 отличий со своими не получилось, потому что их там 100 smile.gif
Единственное, что могу сказать линкерные скрипты одинаковые,
проблема где-то в ключах линкера/обжкопи.
Возможно стоит собрать в hex и посмотреть, что получиться.
sff
Цитата(beer_warrior @ May 22 2006, 09:51) *
Просмотрел, пособирал - действительно бинарник сумасшедший.
Найти 10 отличий со своими не получилось, потому что их там 100 smile.gif
Единственное, что могу сказать линкерные скрипты одинаковые,
проблема где-то в ключах линкера/обжкопи.
Возможно стоит собрать в hex и посмотреть, что получиться.


Да хоть и BasicGNU+GNUARM дает меньший объем проги (когда нет глобальных переменных =)

Вобщем забил я на эту связку использую WinARM, этот без проблем генерит всё как надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.