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

 
 
> 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
Ответов
podelkin
сообщение Oct 25 2011, 10:16
Сообщение #2





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



Вобщем решил сделать так:

В программе реализовал лок кучи через FreeRTOS

Код
void __malloc_lock (struct _reent *r)
{
    vPortEnterCritical();
}

void __malloc_unlock (struct _reent *r)
{
    vPortExitCritical();
}


чтоб не было ошибки линковки - выполняю команду
arm-none-eabi-ar dv libc.a lib_a-mlock.o

libc.a - который используется в данный момент ( у меня это arm-none-eabi/lib/thumb/v7m\libc.a поскольку cortex-m3), зависит от multilib

она удаляет из архива объектник с mlock.

Все. буду тестировать newlib'ский malloc, мне кажется он должен быть понадежнее, чем FreeRTOS'овский. biggrin.gif

Сообщение отредактировал podelkin - Oct 25 2011, 10:18
Go to the top of the page
 
+Quote Post
alx2
сообщение Oct 26 2011, 09:02
Сообщение #3


Местный
***

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



Цитата(podelkin @ Oct 25 2011, 15:16) *
чтоб не было ошибки линковки - выполняю команду
arm-none-eabi-ar dv libc.a lib_a-mlock.o

Я тогда вообще не понимаю, что у Вас происходит... Если линкер загружает mlock.o из библиотеки, значит в вашем проекте присутствует неопределенный символ, имеющийся в mlock.o. Но тогда после удаления mlock.o из библиотеки линкер должен вываливаться с ошибкой "undefined reference to"... Если же символы, содержащиеся в mlock.o проекту не нужны (а так и должно быть, ибо в проекте есть собственные __malloc_lock и __malloc_unlock), какого черта линкер пытался его загружать?...

Может покажете всю команду, которой линкуется ваш проект?


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



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

 


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


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