Перейти к содержанию
    

Ну что же, если вам так нравится, то пусть будет так. Хотя мне больше по душе вариант, когда стек начинается в конце ОЗУ.

Для случаев, когда стеков несколько смысл "в конце ОЗУ" теряется полностью, ибо для начала нужно решить какой из стеков :).

Если размер этих секций превысит свободное ОЗУ, то вы получите ошибку линковки. А так - да, можно и без этих секций, просто объявить _stack, _heap_begin и _heap_limit.

Да, все так - ошибка линковки и ГАРАНИЯ наличия заданных размеров, пусть даже они объявлены, как минимальные. Что еще касается фокусов памяти и конкретно FreeRTOS, то в ней есть одна глупость с созданием IDLE Task. Она создается последней, что в корне неверно, поскольку динамической памяти может не хватить, задача не создастся и все просто рухнет. Кроме того, это единственная абсолютно необходимая неудаляемая задача. В общем, как ни крути она должна создаваться первой.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые 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")

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда исключается вариант их пересечения.

Если только с целью "исключения", то цель не будет достигнута, ибо стек теперь наедет на статически распределеные переменные :) :(

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если только с целью "исключения", то цель не будет достигнута, ибо стек теперь наедет на статически распределеные переменные :) :(

Когда он туда наезжает у меня программа вылетает в прерывание HardFault_Handler. Можно там фиксировать что переполнение стека. И потом менять его размер. А если наедет на кучу, как узнать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда он туда наезжает у меня программа вылетает в прерывание HardFault_Handler.

Будет творится все, что угодно и описанный Вами вылет, но как частный случай. Все абсолютно так-же, как и с задействованой памятью в куче. Контроллеру и его стеку вообще все равно, что портить - статически иди динамически выделенную память. Да он и слов таких не знает :)

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Будет творится все, что угодно и описанный Вами вылет, но как частный случай.

 

То есть не факт что программа обязательно вылетает в это прерывание?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть не факт что программа обязательно вылетает в это прерывание?

Программе порортили какие то данные. Например, переменная x станет вдруг равной 100500. Ну и? Да она вообще никуда вылетать не обязана. А может и вылететь по, практически любой причине.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Программе порортили какие то данные. Например, переменная x станет вдруг равной 100500. Ну и? Да она вообще никуда вылетать не обязана. А может и вылететь по, практически любой причине.

Просто у меня в отладке, когда указатель стека попадает в секцию bss сразу происходит вылет в то самое прерывание. Поскольку с прерываниями я еще не успел толком разобраться, вот и предположил что есть такая заглушка. Ну раз это не так, значит на данном этапе моих познаний ARM все равно как расположить стек и кучу (главное понял как :rolleyes: ). А дальше посмотрим.

Изменено пользователем maxntf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...