zltigo 1 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Ну что же, если вам так нравится, то пусть будет так. Хотя мне больше по душе вариант, когда стек начинается в конце ОЗУ. Для случаев, когда стеков несколько смысл "в конце ОЗУ" теряется полностью, ибо для начала нужно решить какой из стеков :). Если размер этих секций превысит свободное ОЗУ, то вы получите ошибку линковки. А так - да, можно и без этих секций, просто объявить _stack, _heap_begin и _heap_limit. Да, все так - ошибка линковки и ГАРАНИЯ наличия заданных размеров, пусть даже они объявлены, как минимальные. Что еще касается фокусов памяти и конкретно FreeRTOS, то в ней есть одна глупость с созданием IDLE Task. Она создается последней, что в корне неверно, поскольку динамической памяти может не хватить, задача не создастся и все просто рухнет. Кроме того, это единственная абсолютно необходимая неудаляемая задача. В общем, как ни крути она должна создаваться первой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxntf 0 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Уважаемые AHTOXA и zltigo спасибо Вам за помощь! Вы опять поменяли местами стек и кучу:) Ну что же, если вам так нравится, то пусть будет так. Хотя мне больше по душе вариант, когда стек начинается в конце ОЗУ. Если размер этих секций превысит свободное ОЗУ, то вы получите ошибку линковки. А так - да, можно и без этих секций, просто объявить _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") Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Тогда исключается вариант их пересечения. Если только с целью "исключения", то цель не будет достигнута, ибо стек теперь наедет на статически распределеные переменные :) :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxntf 0 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Если только с целью "исключения", то цель не будет достигнута, ибо стек теперь наедет на статически распределеные переменные :) :( Когда он туда наезжает у меня программа вылетает в прерывание HardFault_Handler. Можно там фиксировать что переполнение стека. И потом менять его размер. А если наедет на кучу, как узнать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Когда он туда наезжает у меня программа вылетает в прерывание HardFault_Handler. Будет творится все, что угодно и описанный Вами вылет, но как частный случай. Все абсолютно так-же, как и с задействованой памятью в куче. Контроллеру и его стеку вообще все равно, что портить - статически иди динамически выделенную память. Да он и слов таких не знает :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxntf 0 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Будет творится все, что угодно и описанный Вами вылет, но как частный случай. То есть не факт что программа обязательно вылетает в это прерывание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба То есть не факт что программа обязательно вылетает в это прерывание? Программе порортили какие то данные. Например, переменная x станет вдруг равной 100500. Ну и? Да она вообще никуда вылетать не обязана. А может и вылететь по, практически любой причине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxntf 0 19 апреля, 2016 Опубликовано 19 апреля, 2016 (изменено) · Жалоба Программе порортили какие то данные. Например, переменная x станет вдруг равной 100500. Ну и? Да она вообще никуда вылетать не обязана. А может и вылететь по, практически любой причине. Просто у меня в отладке, когда указатель стека попадает в секцию bss сразу происходит вылет в то самое прерывание. Поскольку с прерываниями я еще не успел толком разобраться, вот и предположил что есть такая заглушка. Ну раз это не так, значит на данном этапе моих познаний ARM все равно как расположить стек и кучу (главное понял как :rolleyes: ). А дальше посмотрим. Изменено 19 апреля, 2016 пользователем maxntf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться