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

 
 
> 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
alx2
сообщение Mar 29 2013, 04:24
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Drozd2 @ Mar 27 2013, 10:31) *
Но непонятно, как "подключить" результат sbrk к sprintf в плане использования им этой кучи.

Ничего не надо подключать. Все уже подключено до нас. Где-то в процессе выполнения sprintf() будут вызваны malloc()/free(), которые и работают с кучей. От Вас лишь требуется предоставить sbrk().

Цитата(Drozd2 @ Mar 27 2013, 10:31) *
Я так понял, что для задания кучи, которую будет использовать newlib, нужно вызывать другую функцию, которая уже сама вызовет sbrk. Только не нашел какую.

Нет никакой функции, которую надо вызвать "для задания кучи". Все, что от Вас требуется - это предоставить функцию sbrk(). Когда newlib'у нужен кусок памяти из кучи, он вызывает вашу sbrk(), передавая ей требуемый размер. Если у Вас в куче есть кусок такого размера, sbrk возвращает адрес этого куска. Таким образом, использоваться будет та область памяти, на которую укажет ваша sbrk().


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 09:54
Рейтинг@Mail.ru


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