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

 
 
> Помогите разобраться с динамическим выделением памяти, Как пристроить другой 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
zltigo
сообщение Dec 21 2006, 15:40
Сообщение #6


Гуру
******

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



Цитата(Alexey75 @ Dec 21 2006, 14:30) *
Вобщем то у меня нет желания делать какие-то навороты по управлению памятью. Проблема возникает когда я размещаю стек во внутренней памяти LPC2214, а heap во внешней (большего размера). Если разместить heap ниже стека то все работает нормально, уже проверил. Просто хотелось бы чтобы стек находился в быстрой внутренней памяти, но там мало места, чтобы размещать там и heap.

Все пожелания абсолютно логичны. Проблема не понятна, ибо _sbrk() это уже перераспледеление размера heap. Или они ее и для инициализации размера (я не в курсе) heap используют? В общем если так, то просто выкиньте "контроль" и поместите результат в свой проект.
Цитата
По большому счету я понял что делать, у меня просто не получилось сделать так, чтобы при компиляции вместо библиотечной функции использовалась измененная мной функция.

Даже затрудняюсь предположить, что можно сделать "не так" sad.gif


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


Участник
*

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



Цитата(zltigo @ Dec 21 2006, 15:40) *
Цитата

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

Даже затрудняюсь предположить, что можно сделать "не так" sad.gif


Не хотелось бы задавать глупые вопросы, но как сделать, чтобы компилятор не обращал внимание на существование библиотечной функции, а брал бы новый вариант функции.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 21 2006, 16:06
Сообщение #8


Гуру
******

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



Цитата(Alexey75 @ Dec 21 2006, 15:01) *
но как сделать, чтобы компилятор не обращал внимание на существование библиотечной функции, а брал бы новый вариант функции.

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


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


Участник
*

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



Цитата(zltigo @ Dec 21 2006, 16:06) *
Цитата(Alexey75 @ Dec 21 2006, 15:01) *

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

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

С третьего раза я понял о чем вы говорите smile.gif , буду разбираться с компилятором
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 21 2006, 17:38
Сообщение #10


Гуру
******

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



Цитата(Alexey75 @ Dec 21 2006, 15:10) *
С третьего раза я понял о чем вы говорите smile.gif , буду разбираться с компилятором
Если файл в котором будете определять функцию компилится в режиме C++, то надо функцию объявить с extern "C", иначе она получит другое "С++ное" внутреннее имя и, соответственно, не заменит библиотечную.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Dec 21 2006, 18:00
Сообщение #11


Гуру
******

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



Цитата(Сергей Борщ @ Dec 21 2006, 16:38) *
Если файл в котором будете определять функцию компилится в режиме C++, то надо функцию объявить с extern "C", иначе она получит другое "С++ное" внутреннее имя и, соответственно, не заменит библиотечную.

А что производители компиляторов уже начали писать библиотечные хидеры без extern "С" smile.gif?
Хотя конечно если не включить готовый хидер и наплевать на вопли об отсутствии прототипа, то добиться вышеописанного можно sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2006, 17:20
Сообщение #12


Гуру
******

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



Цитата(zltigo @ Dec 21 2006, 17:00) *
А что производители компиляторов уже начали писать библиотечные хидеры без extern "С" smile.gif?
Хотя конечно если не включить готовый хидер и наплевать на вопли об отсутствии прототипа, то добиться вышеописанного можно sad.gif
В некоторых случаях совсем необязательно включать хидер, ибо определение функции является и объявлением. Например я постоянно использую свое определение extern "C" __low_level_init(), но при этом никакой дополнительный хидер в main.cpp не включаю.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- Alexey75   Помогите разобраться с динамическим выделением памяти   Dec 21 2006, 13:45
|- - 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 Текстовая версия Сейчас: 21st July 2025 - 22:52
Рейтинг@Mail.ru


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