реклама на сайте
подробности

 
 
> arm-eabi-gcc, непонятные зависания микроконтроллера
Drozd2
сообщение Mar 14 2013, 07:37
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 19-11-09
Пользователь №: 53 743



Здравствуйте!
Загвоздка с самосборным компилятором arm-eabi-gcc. Собирал этим скриптом. Простейшая скомпилированная программа работает корректно. После добавления ряда математических вычислений и соответствующих sprintf программа начала зависать, причем в разных местах, в зависимости от того, какую строку закомментировать. Иногда вываливается в data и prefetch abort. В итоге дошло до того, что если удачно раскидать по тексту программы разный хлам типа uart_write("###########") и while(1>5), то можно добиться, чтобы она отрабатывала успешно. Причем если скомпилировать ту же программу в IAR, то работает корректно без дополнительных вставок. Но IAR ломаный, для этого проекта не годится. В чем может быть причина? В скрипте или в исходниках?

P.S. build.sh загрузить не дали, даже после убирания расширения. Пришлось сделать rar.

Сообщение отредактировал Drozd2 - Mar 14 2013, 07:39
Прикрепленные файлы
Прикрепленный файл  build.rar ( 917 байт ) Кол-во скачиваний: 180
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Drozd2
сообщение Jan 31 2015, 15:25
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 19-11-09
Пользователь №: 53 743



Тема давняя, но точку поставлю. Пришлось разобраться после очередной смены местожительства и, соответственно, вывески. Скрипты для сборки компилятора вполне рабочие. Подсовываем новые пакеты и получаем новые версии. Не давал спокойно работать скрипт линкера. Для запуска программы из ОЗУ оказалось вполне достаточно такого скрипта:
Код
OUTPUT_ARCH(arm)
ENTRY(_startup)
SECTIONS
{
    . = 0x40000000;
    . = ALIGN(4);
    .text : { *(.text) }
    PROVIDE(_etext = .);
    .data : { *(.data) }
    PROVIDE(_bss_start = .);
    .bss  : { *(.bss) }
    PROVIDE(_bss_end = .);

    . = . + 4096;            /* define heap size */
    PROVIDE(end = .);        /* allocate heap */
}
PROVIDE(_top_stack = 0x44000000);

Куча размером 4096 байт появляется после строчки . = . + 4096;. Можно явно указать секцию .heap, задать ее размер, назвать как угодно, главное в конце указакть PROVIDE(end = .);. Этим и определяется размер кучи. Куча появляется в просвете между адекватными секциями и end. Секцию data в этом случае копировать не нужно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016