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

 
 
> Помогите разобраться с динамическим выделением памяти, Как пристроить другой sbrk ???
Alexey75
сообщение Dec 21 2006, 13:45
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 10-04-06
Пользователь №: 15 981



Пишу программу для LPC2214 с внешней SRAM, разместил область стека во внуреннем ОЗУ, а кучу во внешнем, но при использовании функций динамического выделения памяти прога зависает. Как оказалось проблема в том что куча находится выше указателя стека и из-за этого выдается ошибка ENOMEM. После поисков в internet и в документации к Newlib, стало ясно что надо написать другой вариант фунции sbrk, но при этом возникли вопросы:
1. как называть новую переопределяемую функцию (в разных местах ее называют как sbrk, _sbrk, _sbrk_r, может еще как-нибудь)
2. как пристроить эту новую функцию, чтобы она заменила существующую библиотечную и линкер бы не ругался
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Dec 21 2006, 13:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Alexey75 @ Dec 21 2006, 12:45) *
Как оказалось проблема в том что куча находится выше указателя стека и из-за этого выдается ошибка ENOMEM.

Абсолютно все равно где находится стек. Что-то у Вас с причиной другое совсем.
И какое отношение sbrk() к описанной проблеме при попытке динамического выделения памяти вообще имеет. А как Вы вообще представляете реаллокацию памяти на контроллерах класса ARM7?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alexey75
сообщение Dec 21 2006, 14:28
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 10-04-06
Пользователь №: 15 981



Цитата(zltigo @ Dec 21 2006, 13:53) *
Цитата(Alexey75 @ Dec 21 2006, 12:45) *

Как оказалось проблема в том что куча находится выше указателя стека и из-за этого выдается ошибка ENOMEM.

Абсолютно все равно где находится стек. Что-то у Вас с причиной другое совсем.


Я делал пошаговое выполнение, так вот в функции _sbrk проверяется, чтобы выделяемая область памяти не попадала на стек:

caddr_t
_sbrk (int incr)
{
extern char end asm ("end"); /* Defined by the linker. */
static char * heap_end;
char * prev_heap_end;

if (heap_end == NULL)
heap_end = & end;

prev_heap_end = heap_end;

if (heap_end + incr > stack_ptr)
{
/* Some of the libstdc++-v3 tests rely upon detecting
out of memory errors, so do not abort here. */
#if 0
extern void abort (void);

_write (1, "_sbrk: Heap and stack collision\n", 32);

abort ();
#else
errno = ENOMEM;
return (caddr_t) -1;
#endif
}

heap_end += incr;

return (caddr_t) prev_heap_end;
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 21 2006, 15:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Alexey75 @ Dec 21 2006, 13:28) *
Я делал пошаговое выполнение, так вот в функции _sbrk

Для начала Вы написали следующее:
Цитата
при использовании функций динамического выделения памяти прога зависает.

Между написанным и неработоспособностью некой _sbrk() - изменяющей размер хипа и не имеющей, отношения к привычному системному вызову sbrk() есть разница.

А есть-ли вообще необходимость на ходу менять размер heap? Что там за границей у Вас находится?
"Ничего"? Так отдайте сразу все под heap.
Цитата
2. как пристроить эту новую функцию, чтобы она заменила существующую библиотечную и линкер бы не ругался

Ну а если желаете создать иллюзию изменения - то просто напишите свою выкинув контроль и она будет молча использоваться вместо библиотечной.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alexey75
сообщение Dec 21 2006, 15:30
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 10-04-06
Пользователь №: 15 981



Я видимо не совсем ясно выразился, когда задавал вопрос. Вобщем то у меня нет желания делать какие-то навороты по управлению памятью. Проблема возникает когда я размещаю стек во внутренней памяти LPC2214, а heap во внешней (большего размера). Если разместить heap ниже стека то все работает нормально, уже проверил. Просто хотелось бы чтобы стек находился в быстрой внутренней памяти, но там мало места, чтобы размещать там и heap.

По большому счету я понял что делать, у меня просто не получилось сделать так, чтобы при компиляции вместо библиотечной функции использовалась измененная мной функция.

Сообщение отредактировал Alexey75 - Dec 21 2006, 15:36
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alexey75   Помогите разобраться с динамическим выделением памяти   Dec 21 2006, 13:45
|- - zltigo   Цитата(Alexey75 @ Dec 21 2006, 14:30) Воб...   Dec 21 2006, 15:40
|- - Alexey75   Цитата(zltigo @ Dec 21 2006, 15:40) Цитат...   Dec 21 2006, 16:01
|- - zltigo   Цитата(Alexey75 @ Dec 21 2006, 15:01) но ...   Dec 21 2006, 16:06
|- - Alexey75   Цитата(zltigo @ Dec 21 2006, 16:06) Цитат...   Dec 21 2006, 16:10
|- - Сергей Борщ   Цитата(Alexey75 @ Dec 21 2006, 15:10) С т...   Dec 21 2006, 17:38
|- - zltigo   Цитата(Сергей Борщ @ Dec 21 2006, 16:38) ...   Dec 21 2006, 18:00
|- - Сергей Борщ   Цитата(zltigo @ Dec 21 2006, 17:00) А что...   Dec 22 2006, 17:20
|- - zltigo   Цитата(Сергей Борщ @ Dec 22 2006, 16:20) ...   Dec 22 2006, 18:55
|- - Сергей Борщ   Цитата(zltigo @ Dec 22 2006, 17:55) Цитат...   Dec 22 2006, 20:43
|- - zltigo   Цитата(Сергей Борщ @ Dec 22 2006, 19:43) ...   Dec 22 2006, 20:59
|- - Сергей Борщ   Цитата(zltigo @ Dec 22 2006, 19:59) Цитат...   Dec 22 2006, 23:52
|- - zltigo   Цитата(Сергей Борщ @ Dec 22 2006, 22:52) ...   Dec 23 2006, 00:45
- - SergeyDDD   Когда идет инициализация стеков и кучи, внешняя па...   Dec 21 2006, 18:10
- - Alexey75   Проблема решилась, когда я подменил не функцию _sb...   Dec 22 2006, 15:36


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

 


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


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