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

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

|
Пишу программу для LPC2214 с внешней SRAM, разместил область стека во внуреннем ОЗУ, а кучу во внешнем, но при использовании функций динамического выделения памяти прога зависает. Как оказалось проблема в том что куча находится выше указателя стека и из-за этого выдается ошибка ENOMEM. После поисков в internet и в документации к Newlib, стало ясно что надо написать другой вариант фунции sbrk, но при этом возникли вопросы: 1. как называть новую переопределяемую функцию (в разных местах ее называют как sbrk, _sbrk, _sbrk_r, может еще как-нибудь) 2. как пристроить эту новую функцию, чтобы она заменила существующую библиотечную и линкер бы не ругался
|
|
|
|
|
 |
Ответов
|
Dec 21 2006, 14:28
|
Участник

Группа: Новичок
Сообщений: 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; }
|
|
|
|
|
Dec 21 2006, 15:04
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 21 2006, 15:30
|
Участник

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

|
Я видимо не совсем ясно выразился, когда задавал вопрос. Вобщем то у меня нет желания делать какие-то навороты по управлению памятью. Проблема возникает когда я размещаю стек во внутренней памяти LPC2214, а heap во внешней (большего размера). Если разместить heap ниже стека то все работает нормально, уже проверил. Просто хотелось бы чтобы стек находился в быстрой внутренней памяти, но там мало места, чтобы размещать там и heap.
По большому счету я понял что делать, у меня просто не получилось сделать так, чтобы при компиляции вместо библиотечной функции использовалась измененная мной функция.
Сообщение отредактировал Alexey75 - Dec 21 2006, 15:36
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|