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

Проблемы с GNUARM

Скачал я набор компилятора 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 и знает в чём дело? (даже если кто-то и не работа, всё равно интересно мнения =)

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


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

Посмотрите в makefile какой используеться скрипт для линкера и сам скрипт *.ld.(секция MEMORY)

Кроме того на выходе компилятотра даеться раскладка по адресам и размерам различных секций памяти.

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


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

Посмотрите в 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 делать такое же?

Изменено пользователем sff

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


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

Странно, у меня все нормально.

Киньте makefile и скрипты - сравню со своими.

 

прикрепил архив тестового проекта

gnu_test.rar

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


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

Просмотрел, пособирал - действительно бинарник сумасшедший.

Найти 10 отличий со своими не получилось, потому что их там 100 :)

Единственное, что могу сказать линкерные скрипты одинаковые,

проблема где-то в ключах линкера/обжкопи.

Возможно стоит собрать в hex и посмотреть, что получиться.

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


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

Просмотрел, пособирал - действительно бинарник сумасшедший.

Найти 10 отличий со своими не получилось, потому что их там 100 :)

Единственное, что могу сказать линкерные скрипты одинаковые,

проблема где-то в ключах линкера/обжкопи.

Возможно стоит собрать в hex и посмотреть, что получиться.

 

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

 

Вобщем забил я на эту связку использую WinARM, этот без проблем генерит всё как надо.

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


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

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

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

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

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

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

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

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

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

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