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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> FreeRTOS 9.0 Static, Определение размера стека
Boriska
сообщение Nov 7 2016, 11:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-11-07
Пользователь №: 32 772



В новой версии FreeRTOS 9.0 появилась возможность выделять память (под задачи/очереди и т.д.) статически.
Подскажите, как определить оптимальный размер памяти под стек задачи? Ну, кроме как ловить vApplicationStackOverflowHook?
Может есть какая-то методика?
Go to the top of the page
 
+Quote Post
x893
сообщение Nov 7 2016, 12:59
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Точно так же как и раньше
1. Прописываем стек известным значением (мне нравится DEADBEEF) и потом смотрим
2. Отслеживать указатель стека при вызове функций.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 7 2016, 15:08
Сообщение #3


Гуру
******

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



QUOTE (x893 @ Nov 7 2016, 15:59) *
Точно так же как и раньше

Ага. Только много неудобнее, ибо динамически выделенная память находится под управления менеджера памяти и соответственно можно добавить того-же владельца памяти и тип блока. В результате чего становится возможным абсолютно независимо от задач смотреть за тем-же использованием стека.
QUOTE
1. Прописываем стек известным значением (мне нравится DEADBEEF) и потом смотрим

А мне CAFEBABE sm.gif - оптимистичнее sm.gif
QUOTE
2. Отслеживать указатель стека при вызове функций.

Отслеживать - да. При вызове каких-то неведомых функций - незачем. У меня всегда есть консолька в ней можно и посмотреть по директиве и распределение памяти (статическое не использую по причине нахренненужности и неудобства - см.выше) и использование стеков.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Boriska
сообщение Nov 7 2016, 17:11
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-11-07
Пользователь №: 32 772



Цитата(x893 @ Nov 7 2016, 15:59) *
2. Отслеживать указатель стека при вызове функций.

Что-то я в этих стеках не очень понимаю. Может подскажите, где можно прочитать?
Что и кто туда пишет? Локальные переменные данной задачи? Значения регистров, при вызове прерываний, во время активности задачи?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 25 2016, 10:00
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(zltigo @ Nov 7 2016, 18:08) *
Ага. Только много неудобнее, ибо динамически выделенная память находится под управления менеджера памяти и соответственно можно добавить того-же владельца памяти и тип блока. В результате чего становится возможным абсолютно независимо от задач смотреть за тем-же использованием стека.

Что же мешает делать то же самое при статически выделенных стеках?

Цитата(zltigo @ Nov 7 2016, 18:08) *
Отслеживать - да. При вызове каких-то неведомых функций - незачем. У меня всегда есть консолька в ней можно и посмотреть по директиве и распределение памяти (статическое не использую по причине нахренненужности и неудобства - см.выше) и использование стеков.

Я динамическое не использую по той же самой причине - нафига оно? Зачем ещё какие-то функции вызывать чтобы распределить этот блок под стек в run-time, когда то же самое прекрасно сделает линкер в build-time?
Стеки задач в процессе работы firmware у меня не меняются (как и сами задачи).
И, например, если в устройстве есть разная память (по скорости/латентности/занятости другими bus-masters), то статически я могу раскидать стеки задач по разным типам памяти, как считаю нужным. А с динамическим выделением что - для каждой памяти свой манагер писать??
Go to the top of the page
 
+Quote Post
x893
сообщение Nov 25 2016, 11:26
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Если освоить SystemView, то можно на большом экране красивые диаграммы видеть. Только это надо обычно один раз. Ну или для простоты в Watch окне смотреть сколько осталось до границы стека. В общем 100500 способов есть.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2016, 11:54
Сообщение #7


Гуру
******

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



QUOTE (jcxz @ Nov 25 2016, 12:00) *
Стеки задач в процессе работы firmware у меня не меняются (как и сами задачи).

Но меняются от релиза к релизу. В результате, в случае чего, возникают интересные вопросы, а как память была распределоена линкером на релизе XX.YY годовой давности стоящем где-то на объекте...
QUOTE
А с динамическим выделением что - для каждой памяти свой манагер писать??

Нет, менеджер один, а блоки памяти, которые он распределяет, могут быть разные. Никаких проблем. Кроме того, менеджер памяти может работать и внутри уже им-же выделенного блока памяти, например, при использовании одинаковых по размеру блоков памяти для гарантированного исключения дефрагментации.




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 26 2016, 13:17
Сообщение #8


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (zltigo @ Nov 25 2016, 18:54) *
Но меняются от релиза к релизу. В результате, в случае чего, возникают интересные вопросы, а как память была распределоена линкером на релизе XX.YY годовой давности стоящем где-то на объекте...

Система управления версиями решает эту проблему за пару секунд. Если я правильно понял контекст вашего ответа. Кстати, как тут поможет динамическое выделение?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 26 2016, 16:04
Сообщение #9


Гуру
******

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



QUOTE (dxp @ Nov 26 2016, 15:17) *
Система управления версиями решает эту проблему за пару секунд.

Ага, если все это хозяйство есть в нужный момент под руками. По закону подлости приходится разбираться и находясь в самом неподходящем месте, в самое неподходящее время, за тысячи километров, чужими руками.
QUOTE
Если я правильно понял контекст вашего ответа. Кстати, как тут поможет динамическое выделение?

Это уже наличие в консольке директивы позволяющей посмотреть распределение памяти, принадлежность блоков, их занятость и целостность. То есть позволяет иметь встроенный в устройство элемент контроля и отладки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
turnon
сообщение Nov 26 2016, 19:19
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207



Цитата(x893 @ Nov 25 2016, 15:26) *
Если освоить SystemView, то можно на большом экране красивые диаграммы видеть. Только это надо обычно один раз. Ну или для простоты в Watch окне смотреть сколько осталось до границы стека. В общем 100500 способов есть.

Просветите пожалуйста, что за SystemView? И как в Watch окне смотреть сколько осталось до границы стека?
Go to the top of the page
 
+Quote Post
x893
сообщение Nov 26 2016, 20:22
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



1. Копируем в гуглопоиск SystemView и смотрит первую ссылку.
2. В начале каждой функции делаем функцию которая сохраняет меньшее значение указателя стека из текущего и сохраненного. Конец стека мы и так знаем. В Watch их выбираем и смотрим.
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 27 2016, 05:17
Сообщение #12


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (zltigo @ Nov 26 2016, 23:04) *
Ага, если все это хозяйство есть в нужный момент под руками. По закону подлости приходится разбираться и находясь в самом неподходящем месте, в самое неподходящее время, за тысячи километров, чужими руками.

Слабо представляю себе ситуацию, чтобы выехать на объект с пустыми руками, т.е. без инструментария и проекта. А если есть проект, так там и репозиторий (.git), где вся история в подробностях.

Кроме того, как правило имеется удалённый репозиторий, с которым регулярно делается синхронизация. Есть бесплатные и хорошо развитые и бесплатные сервисы как для открытых (github.com), так и закрытых (bitbucket.com) проектов. Т.ч. всегда можно вытянуть проект, был бы интернет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 27 2016, 09:51
Сообщение #13


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



А мне тоже нравится динмаическое распределение, чувствуешь какую-то волшебную принадлежность к большим ОС))) Ну, а если серьёзно, то действительно удобно смотреть, что кому отдано и для каких целей)


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 27 2016, 11:03
Сообщение #14


Гуру
******

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



QUOTE (dxp @ Nov 27 2016, 07:17) *
Слабо представляю себе ситуацию, чтобы выехать на объект с пустыми руками, т.е. без инструментария и проекта. А если есть проект, так там и репозиторий (.git), где вся история в подробностях.

Объектов многие тысячи за многие годы. Экземпляров оборудования - миллионы. На объекте есть обслуживающий персонал заказчика, выехать максимум могут сервисные инженеры из ближайшего сервисного центра, но ближайший, это тоже могут быть пару тысяч километров. Ничего из вышеперечисленного у них нет, как и соответствующей квалификации sad.gif. Часть оборудования вообще находится во взрывоопасных и труднодоступных местах (так что ни компьютеров, ни отладчиков там не может быть в принципе).
Таковы реалии. Так что наличие встроенных средств локализации совершенно обязательно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 28 2016, 10:22
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(zltigo @ Nov 25 2016, 14:54) *
Но меняются от релиза к релизу. В результате, в случае чего, возникают интересные вопросы, а как память была распределоена линкером на релизе XX.YY годовой давности стоящем где-то на объекте...

Узнаём версию firmware "где-то на объекте", скачиваем её исходники из репозитария, компилим, открываем .map и смотрим. В чём проблема?

Цитата(zltigo @ Nov 25 2016, 14:54) *
Нет, менеджер один, а блоки памяти, которые он распределяет, могут быть разные. Никаких проблем. Кроме того, менеджер памяти может работать и внутри уже им-же выделенного блока памяти, например, при использовании одинаковых по размеру блоков памяти для гарантированного исключения дефрагментации.

Для того, чтобы менеджер распределял память из разных блоков, ему надо как-то сообщить: какой блок мы хотим в очередном запросе? Т.е. - очевидно нужно передать какой-то доп. аргумент в функции malloc() или new (что там используется во FreeRTOS?). И как же из вызова xTaskCreate() передать в каком блоке памяти она должна выделить память? Да и наверняка в вызовах менеджера памяти внутре FreeRTOS она запрашивает у malloc()/new только объём памяти и не передаёт никаких доп. аргументов.
Так как же при создании задачи FreeRTOS задать блок памяти в каком она должна выделить стек?

Цитата(zltigo @ Nov 26 2016, 19:04) *
Ага, если все это хозяйство есть в нужный момент под руками. По закону подлости приходится разбираться и находясь в самом неподходящем месте, в самое неподходящее время, за тысячи километров, чужими руками.

Это надуманная проблема.
Я участвовал в разработке многих изделий, которые потом стояли и работали "за тысячи километров" и при возникновении каких-то проблем у этих заказчиков, сам по ним не ездил, а только запрашивал номер версии firmware оттуда и разбирался уже на месте, указанным способом, воссоздавая обстановку у заказчика у себя в лаборатории.

Цитата(x893 @ Nov 26 2016, 23:22) *
2. В начале каждой функции делаем функцию которая сохраняет меньшее значение указателя стека из текущего и сохраненного. Конец стека мы и так знаем. В Watch их выбираем и смотрим.

Видимо Вы никогда не включали оптимизацию. В общем случае, список функций в ПО может не совпадать со списком подпрограмм в скомпилированном коде, так как опитимизатор например сам может убирать или добавлять новые подпрограммы, например когда видит одинаковые участки кода. В таких местах вы не получите реальной вершины стека.
Да и алгоритм действий компилятора, при котором он на входе в функцию один раз делает PUSH/SUBS SP,... а потом больше не трогает SP, это имхо не есть догма.
Не исключаю, что в каких-то случаях или какие-то компиляторы могут в теле функции менять SP. Это во многих случаях было бы полезно.
Да и учтите, что стеков может быть много (при наличии RTOS да и не только).

Так что я предпочитаю другой метод: высокочастотное прерывание, в котором делаем сохранение минимального значения SP для каждой задачи.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th April 2024 - 23:14
Рейтинг@Mail.ru


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