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

 
 
> newlib + malloc lock, Помогите разобраться
podelkin
сообщение Oct 24 2011, 10:37
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 24-10-11
Пользователь №: 67 911



Народ, помогите все по полкам разложить.
Все началось с того, что хотел прикрутить *printf из newlib. В проекте используется FreeRTOS.
По прошлому опыту ожидал, что сразу возникнут ошибки линковки _sbrk ,_write, _read и т.д.
Но все скомпилировалось нормально cranky.gif . ToolChain от klen'а (спасибо ему)
При запуске из под отладчика выпал в _swiwrite на инструкции bkpt. Копаясь в исходниках newlib 1.19 нашел где это.
Правильно ли я понял, что это из-за сборки newlib без ключа --disable-newlib-supplied-syscalls?
Дальше я скачал yagarto, заменил компилятор. и ошибки линковки возникли (я впервые был ряд ошибкам biggrin.gif )))
Реализовал syscalls, и все заработало.
Но!!! printf использует malloc, malloc вызывает _sbrk для получения памяти. в исходниках для блокировки кучи используется
вызовы _malloc_lock и _malloc_unlock. Отладчиком смотрел, они пустые (и в исходнике newlib их смотрел)

Код
void
__malloc_lock (ptr)
     struct _reent *ptr;
{
#ifndef __SINGLE_THREAD__
  __lock_acquire_recursive (__malloc_lock_object);
#endif
}


Значит из многопоточной среды вызывать printf черевато crying.gif (и malloc тоже)
собственно вопросы:
  1. можно ли заставить ToolChain klen'a работать с моими syscalls без пересборки newlib
  2. как залочить кучу newlib в проекте FreeRTOS (пересобирать что-ли без __SINGLE_THREAD__)
  3. если прошлое нельзя, то может наоборот заставить newlib использовать vPortMalloc из FreeRTOS


За любую помощь заранее благодарен!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Oct 24 2011, 11:51
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (podelkin @ Oct 24 2011, 13:37) *
заставить newlib использовать vPortMalloc из FreeRTOS
Написать в одном из исходных файлов проекта свою функцию malloc (ну и free, разумеется), которая будет вызывать vPortMalloc и прилинкуется взамен библиотечной.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alx2
сообщение Oct 25 2011, 04:18
Сообщение #3


Местный
***

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



Цитата(Сергей Борщ @ Oct 24 2011, 16:51) *
Написать в одном из исходных файлов проекта свою функцию malloc (ну и free, разумеется), которая будет вызывать vPortMalloc и прилинкуется взамен библиотечной.

malloc и free писать не надо, они уже написаны. Писать надо __malloc_lock() и __malloc_unlock(). Об этом, кстати, прямым открытым текстом написано в документации. Также скорее всего потребуется переписать _sbrk() в плане проверки исчерпания кучи. Для работы printf необходимо также реализовать системный вызов _write.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
podelkin
сообщение Oct 25 2011, 06:41
Сообщение #4





Группа: Участник
Сообщений: 14
Регистрация: 24-10-11
Пользователь №: 67 911



Цитата(alx2 @ Oct 25 2011, 08:18) *
malloc и free писать не надо, они уже написаны. Писать надо __malloc_lock() и __malloc_unlock(). Об этом, кстати, прямым открытым текстом написано в документации. Также скорее всего потребуется переписать _sbrk() в плане проверки исчерпания кучи. Для работы printf необходимо также реализовать системный вызов _write.


так __malloc_lock() и __malloc_unlock() не определяются из-за ошибки линкера!

Код
multiple definition of `__malloc_lock'


нашел вот это
mail архив newlib

этож чтож - пересобирать? crying.gif
пока придумал удалить mlock.o из libc.a чтоб линкер не ругался, кто что думает

пока нашел сырое решение
опция линкера
Код
--allow-multiple-definition


теперь я могу определить свой
void __malloc_lock (struct _reent *r)
и он вызывается!
только вот криво это, буду копать дальше
Go to the top of the page
 
+Quote Post



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

 


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


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