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

 
 
> 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
сообщение Mar 27 2013, 05:31
Сообщение #2


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

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



Я имел в виду не нужно специально объявлять кучу. Написал по идиотски.
-nostartfiles и так указано. Вот после -nostdlib начинает ругаться именно так. Только счастья не прибавляется. Заглушки, в том числе отдельный printf.c, помогают избежать зависаний, но на вопрос не отвечают. Хочется в полной мере использовать newlib.
Добавил в начало программы такие строки:
Цитата
extern int end;

sprintf(str, "end=%X\r\n", &end);
INFO(str);

res_sbrk=sbrk(0);
sprintf(str, "res_sbrk=%p\r\n", res_sbrk);
INFO(str);

res_sbrk=sbrk(10*1024);
sprintf(str, "res_sbrk=%p\r\n", res_sbrk);
INFO(str);

res_sbrk=sbrk(10*1024);
sprintf(str, "res_sbrk=%p\r\n", res_sbrk);
INFO(str);

и получил такой результат:
Цитата
end=41FD8
res_sbrk=0x41fd8
res_sbrk=0x41fd8
res_sbrk=0x447d8

Но непонятно, как "подключить" результат sbrk к sprintf в плане использования им этой кучи. Вообще sbrk выполняет очень сложную задачу по складыванию двух чисел и возврату результата из внутренней переменной. Я так понял, что для задания кучи, которую будет использовать newlib, нужно вызывать другую функцию, которая уже сама вызовет sbrk. Только не нашел какую.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 27 2013, 05:47
Сообщение #3


фанат дивана
******

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



Цитата(Drozd2 @ Mar 27 2013, 11:31) *
Хочется в полной мере использовать newlib.

Так заглушки как раз и позволяют использовать newlib. Они реализуют, скажем так, платформенно-зависимые вещи. _sbrk() - выделение кусочка памяти для malloc(), _write() - вывод символов на устройство вывода для printf().
Просто у вас откуда-то подцепляются умолчательные реализации этих заглушек.
Если ключ -nostdlib отключает эти умолчательные реализации - то именно он и нужен. Он не отключит возможность использовать newlib.
Цитата(Drozd2 @ Mar 27 2013, 11:31) *
Я так понял, что для задания кучи, которую будет использовать newlib, нужно вызывать другую функцию, которая уже сама вызовет sbrk. Только не нашел какую.

Не нужно ничего больше вызывать. malloc() вызывает _sbrk(). Вы пишете свою реализацию _sbrk(), и всё начинает работать.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


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


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