Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC ARM + malloc-free
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
athlon64
МК STM32F207
Eclipse + GCC Yagarto

Никак не могу заставить работать менеджер памяти из стандартной библиотеки си.
Добавил в проект syscalls.c взятый на форуме.
Скрипт линкера (flash.icf) гибрид, но вроде правильный.

Всё компилируется без ошибок, но функция malloc всегда возвращает 0x00000008.

syscalls.c и flash.icf прикладываю.
athlon64
неужели никто не может подсказать?
AHTOXA
Посмотрите (выдайте на отладочную печать) значение &_heap. Похоже, что криво инициализируется...
AHTOXA
Дополнение. Проверьте ещё переменную heap, равна ли она нулю до первого вызова malloc. У меня как-то были подобные проблемы, когда стартовый код не чистил bss и не инициализировал переменные.
kolobochishe
У меня была проблема когда в забыл установить размер кучи в *.icf файле. Был 0. Не увидел где у Вас задается ее размер или начальный адрес и конечный. Сколько памяти просите?

Работаю в ИАРе. Там размер задается явно

Код
define symbol __ICFEDIT_size_heap__     = 0xA00000;


Вижу только _Min_Heap_Size = 2048;
athlon64
Цитата(AHTOXA @ Mar 29 2012, 00:17) *
Дополнение. Проверьте ещё переменную heap, равна ли она нулю до первого вызова malloc. У меня как-то были подобные проблемы, когда стартовый код не чистил bss и не инициализировал переменные.

При включении сразу чищу всё ОЗУ.
Сделал тестовый вывод и выяснилось, что _sbrk() вообще не вызывается при вызове malloc

heap = 0
&_heap = 536966144
AHTOXA
heap и &_heap в порядке. Попробуйте опции линкера -nostdlib или -nodefaultlibs.
athlon64
Цитата(AHTOXA @ Mar 29 2012, 11:03) *
heap и &_heap в порядке. Попробуйте опции линкера -nostdlib или -nodefaultlibs.

-nostdlib у меня включен, выключение ничего не меняет.
с -nodefaultlibs проект не компилируется. Не найдена функция malloc и в syscalls ругается на errno.
AHTOXA
А -nostartfiles?
athlon64
Цитата(AHTOXA @ Mar 29 2012, 12:19) *
А -nostartfiles?

Напутал в прошлом посте.
-nostartfiles у меня был включен, отключение не влияет
-nostdlib и --nodefaultlibs проект не компилируется как писал выше.

Собственно, как я понял, nostdlib - то же что и одновременно включенные nostartfiles и nodefaultlibs.
AHTOXA
Мне обычно хватает -nostartfiles.
А может это Yagarto дурит? Пробовали другой компилятор?
athlon64
Не я один столкнулся с подобной проблемой:
http://www.embeddedrelated.com/usenet/embe...how/89455-1.php

Попробую другой toolchain
XVR
Цитата(athlon64 @ Mar 29 2012, 09:17) *
При включении сразу чищу всё ОЗУ.
Сделал тестовый вывод и выяснилось, что _sbrk() вообще не вызывается при вызове malloc
Гм. А не стоит ли у вас в libc вместо malloc затычка (как в syscalls.c) ?

Сергей Борщ
zltigo выкладывал тут самописный менеджер памяти. Использую его вместо штатного - компактный, не тянет за собой кучу ненужного из библиотек. Обернул его в плюсы, добавил Mutex для многопотчности. Прилагаю.
athlon64
Заменил Yagarto на DevkitPRO, теперь процессор виснет при вызове malloc sm.gif
На Yagarto пробовал BGET, у него функция bget() всё время возвращала чушь типа 0x801C0000, т.е. вообще не из области ОЗУ.

Цитата(XVR @ Mar 29 2012, 13:38) *
Гм. А не стоит ли у вас в libc вместо malloc затычка (как в syscalls.c) ?

Не знаю. Как уточнить? Newlib в yagarto в виде объектных файлов... хотя исходники тоже отдельно выложены.

Цитата(Сергей Борщ @ Mar 29 2012, 13:42) *
zltigo выкладывал тут самописный менеджер памяти. Использую его вместо штатного - компактный, не тянет за собой кучу ненужного из библиотек. Обернул его в плюсы, добавил Mutex для многопотчности. Прилагаю.

Спасибо, но, к сожалению, с плюсами у меня пока не очень. Попробую вариант zltigo тоже
Сергей Борщ
QUOTE (athlon64 @ Mar 29 2012, 12:34) *
Спасибо, но, к сожалению, с плюсами у меня пока не очень.
Его довольно просто вернуть обратно в обычный С - переименовать класс в структуру, вынести из него функции, заменить конструктор на функцию инициализации, которую вызывать при старте программы и, собственно, все.

P.S. Хотя нет, не все так просто. Попробую сделать сам.

Вот такое получилось. Не проверял, но кажется сломать там что-то было трудно.
athlon64
Попробовал Codesourcery G++ Lite - результат тот же, malloc возвращает 0х00000008. Так что дело не в тулчейне


Цитата(Сергей Борщ @ Mar 29 2012, 15:33) *
Вот такое получилось. Не проверял, но кажется сломать там что-то было трудно.

О, спасибо, сейчас попробую.sm.gif
AHTOXA
Если что, я занычил ссылочку на исходный вариант аллокатора от zltigo: здесь.

Цитата(athlon64 @ Mar 29 2012, 16:40) *
дело не в тулчейне

Выкладывайте тогда makefile, помозгуем.
athlon64
Цитата(Сергей Борщ @ Mar 29 2012, 15:33) *
Вот такое получилось. Не проверял, но кажется сломать там что-то было трудно.

Отлично работает!

Цитата(AHTOXA @ Mar 29 2012, 15:43) *
Если что, я занычил ссылочку на исходный вариант аллокатора от zltigo: здесь.

Выкладывайте тогда makefile, помозгуем.

MakeFile во вложении
AHTOXA
Цитата(athlon64 @ Mar 29 2012, 16:56) *
MakeFile во вложении

По этому makefile ничего сказать нельзя. Там куча включений других файлов.
XVR
Цитата(athlon64 @ Mar 29 2012, 13:34) *
Не знаю. Как уточнить? Newlib в yagarto в виде объектных файлов... хотя исходники тоже отдельно выложены.
Смотрите в исходниках. в newlib/libc/stdlib/mallocr.c
Вызов sbrk должен быть завернут в макрос MORECORE, убедитесь, что там действительно sbrk, а не что нибудь другое

athlon64
Цитата(XVR @ Mar 29 2012, 16:51) *
Смотрите в исходниках. в newlib/libc/stdlib/mallocr.c
Вызов sbrk должен быть завернут в макрос MORECORE, убедитесь, что там действительно sbrk, а не что нибудь другое

В mallocr.c:
#define MORECORE(size) _sbrk_r(reent_ptr, (size))
XVR
Цитата(athlon64 @ Mar 30 2012, 07:23) *
В mallocr.c:
#define MORECORE(size) _sbrk_r(reent_ptr, (size))

Смотрите, как реализован _sbrk_r - он должен звать ваш sbrk
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.