|
Coocox настройка heap? |
|
|
|
Apr 19 2016, 11:06
|

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

|
QUOTE (AHTOXA @ Apr 19 2016, 13:48)  Ну что же, если вам так нравится, то пусть будет так. Хотя мне больше по душе вариант, когда стек начинается в конце ОЗУ. Для случаев, когда стеков несколько смысл "в конце ОЗУ" теряется полностью, ибо для начала нужно решить какой из стеков  . QUOTE Если размер этих секций превысит свободное ОЗУ, то вы получите ошибку линковки. А так - да, можно и без этих секций, просто объявить _stack, _heap_begin и _heap_limit. Да, все так - ошибка линковки и ГАРАНИЯ наличия заданных размеров, пусть даже они объявлены, как минимальные. Что еще касается фокусов памяти и конкретно FreeRTOS, то в ней есть одна глупость с созданием IDLE Task. Она создается последней, что в корне неверно, поскольку динамической памяти может не хватить, задача не создастся и все просто рухнет. Кроме того, это единственная абсолютно необходимая неудаляемая задача. В общем, как ни крути она должна создаваться первой.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 19 2016, 13:45
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008

|
Уважаемые AHTOXA и zltigo спасибо Вам за помощь! Цитата(AHTOXA @ Apr 19 2016, 13:48)  Вы опять поменяли местами стек и кучу  Ну что же, если вам так нравится, то пусть будет так. Хотя мне больше по душе вариант, когда стек начинается в конце ОЗУ. Если размер этих секций превысит свободное ОЗУ, то вы получите ошибку линковки. А так - да, можно и без этих секций, просто объявить _stack, _heap_begin и _heap_limit. Мне почему то больше понравился вариант сначала стек потом куча. Тогда исключается вариант их пересечения. Чтоб размер этих секций не превысил ОЗУ, я размер стека буду задавать какой нужен, а размер кучи все что осталось. А для контроля минимального размера кучи и сделаю условие в линкере. Код _StackSize = 0x1000;/*устанавливаем*/ _StackTop = . + _StackSize; PROVIDE(_stack = _StackTop); _HeapSize = _eram - _StackTop; _HeapBegin = _eram - _HeapSize; _HeapLimit = _eram; _HeapMinimal = 0x2000;/*устанавливаем*/ ASSERT(_HeapSize > _HeapMinimal, "warning! small size of the heap")
|
|
|
|
|
Apr 19 2016, 16:02
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008

|
Цитата(zltigo @ Apr 19 2016, 18:58)  Будет творится все, что угодно и описанный Вами вылет, но как частный случай. То есть не факт что программа обязательно вылетает в это прерывание?
|
|
|
|
|
Apr 19 2016, 17:30
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008

|
Цитата(zltigo @ Apr 19 2016, 19:14)  Программе порортили какие то данные. Например, переменная x станет вдруг равной 100500. Ну и? Да она вообще никуда вылетать не обязана. А может и вылететь по, практически любой причине. Просто у меня в отладке, когда указатель стека попадает в секцию bss сразу происходит вылет в то самое прерывание. Поскольку с прерываниями я еще не успел толком разобраться, вот и предположил что есть такая заглушка. Ну раз это не так, значит на данном этапе моих познаний ARM все равно как расположить стек и кучу (главное понял как  ). А дальше посмотрим.
Сообщение отредактировал maxntf - Apr 19 2016, 17:31
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|