|
FreeRTOS 9.0 Static, Определение размера стека |
|
|
|
 |
Ответов
|
Nov 7 2016, 15:08
|

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

|
QUOTE (x893 @ Nov 7 2016, 15:59)  Точно так же как и раньше Ага. Только много неудобнее, ибо динамически выделенная память находится под управления менеджера памяти и соответственно можно добавить того-же владельца памяти и тип блока. В результате чего становится возможным абсолютно независимо от задач смотреть за тем-же использованием стека. QUOTE 1. Прописываем стек известным значением (мне нравится DEADBEEF) и потом смотрим А мне CAFEBABE  - оптимистичнее  QUOTE 2. Отслеживать указатель стека при вызове функций. Отслеживать - да. При вызове каких-то неведомых функций - незачем. У меня всегда есть консолька в ней можно и посмотреть по директиве и распределение памяти (статическое не использую по причине нахренненужности и неудобства - см.выше) и использование стеков.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 25 2016, 10:00
|
Гуру
     
Группа: Свой
Сообщений: 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), то статически я могу раскидать стеки задач по разным типам памяти, как считаю нужным. А с динамическим выделением что - для каждой памяти свой манагер писать??
|
|
|
|
|
Nov 25 2016, 11:54
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 28 2016, 10:22
|
Гуру
     
Группа: Свой
Сообщений: 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 для каждой задачи.
|
|
|
|
|
Nov 28 2016, 11:13
|

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

|
QUOTE (jcxz @ Nov 28 2016, 12:22)  Узнаём версию firmware "где-то на объекте", скачиваем её исходники из репозитария, компилим, открываем .map и смотрим. В чём проблема? В том, что без этих действий легко обойтись. QUOTE Для того, чтобы менеджер распределял память из разных блоков, ему надо как-то сообщить: какой блок мы хотим в очередном запросе? Да. QUOTE Да и наверняка в вызовах менеджера памяти.... Там используется обертка над одним из нескольких "штатных" менеджеров памяти. Я использую свой менеджер, имеющий больше возможностей. Если, вдруг окажется нужным разным задачам выделять тот же стек в разных блоках, добавлю без проблем. Эти дополнения будут ничем не сложнее добавления статического выделения памяти руками в разных секциях и их описание в скриптах линкера. Даже проще. QUOTE Это надуманная проблема. Это вообще НЕ проблема сделать, как я сделал. ОДИН раз много лет назад был создан инструмент идентификации и просмотра блоков памяти. Он работает с тех пор тупо автоматически всегда и вообще нет необходимости придумывать причины его не использовать. Причем, поскольку динамическое выделение памяти используется на только для стеков задач, то этот же инструмент позволяет просматривать и области памяти всяких буферов и очередей. QUOTE Я участвовал в разработке многих изделий, которые потом стояли и работали "за тысячи километров" и при возникновении каких-то проблем у этих заказчиков, сам по ним не ездил, а только запрашивал номер версии firmware оттуда и разбирался уже на месте, указанным способом, воссоздавая обстановку у заказчика у себя в лаборатории. Одна из областей в которой работают мои изделия, это телекоммуникационное оборудование. На объектах оно связано с оборудованием десятков производителей. Причем окружение все время меняется, поскольку сети живут и развиваются. Протоколы взаимодействия весьма сложны и имеют массу реализация, например, SS7 https://ru.wikipedia.org/wiki/ОКС-7. Я очень рад, что "у себя в лаборатории" Вы можете "воссоздать обстановку заказчика"  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 28 2016, 12:20
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Nov 28 2016, 14:13)  Там используется обертка над одним из нескольких "штатных" менеджеров памяти. Я использую свой менеджер, имеющий больше возможностей. Если, вдруг окажется нужным разным задачам выделять тот же стек в разных блоках, добавлю без проблем. Эти дополнения будут ничем не сложнее добавления статического выделения памяти руками в разных секциях и их описание в скриптах линкера. Даже проще. Без проблем? Для этого Вам придётся модифицировать код самой FreeRTOS. Например: добавив в список аругментов xTaskCreate() ещё и идентификатор нужной кучи где стек выделять. И пробросить этот идентификатор внутрь xTaskCreate() до вызова Вашего malloc(). Или например передавать этот идентификатор через глобальную переменную, завернув вызов xTaskCreate() вместе с установкой этой переменной внутрь критической секции. Конечно можно и так сделать. Можно и трусы через голову надевать каждую переменную в куче выделять. Но только - ЗАЧЕМ??? Зачем все эти кучи, malloc()-и и пр. хлам когда задачи создаются однократно (при старте firmware) и, соответственно, стеки выделяются также однократно. И никогда не освобождаются. Зачем все эти лишние сущности, которые тратят доп. память, увеличивают кол-во кода и время выполнения (хоть и не на много)? Даже просто посмотреть состояние стека выделенного статически гораздо проще. Для этого не нужно писать никакие свои тулзы, достаточно эмулятора. С динамическим стеком всё много сложнее. Цитата(zltigo @ Nov 28 2016, 14:13)  Это вообще НЕ проблема сделать, как я сделал. Сделать можно всё что угодно, вопрос - зачем? В программе всегда есть переменные/массивы, время жизни которых - всё время работы ПО. Такие переменные нужно распределять статически (сюда относятся и стеки статических задач). Можно конечно все такие переменные выделять на куче (и я видел что многие ламеры так и делают на PC). Но зачем??? Никаких плюсов это не даёт, одни минусы. Всё, что может быть распределено build-time и должно распределяться build-time.
|
|
|
|
Сообщений в этой теме
Boriska FreeRTOS 9.0 Static Nov 7 2016, 11:34    dxp QUOTE (zltigo @ Nov 25 2016, 18:54) Но ме... Nov 26 2016, 13:17     zltigo QUOTE (dxp @ Nov 26 2016, 15:17) Система ... Nov 26 2016, 16:04      dxp QUOTE (zltigo @ Nov 26 2016, 23:04) Ага, ... Nov 27 2016, 05:17       zltigo QUOTE (dxp @ Nov 27 2016, 07:17) Слабо пр... Nov 27 2016, 11:03       zltigo QUOTE (jcxz @ Nov 28 2016, 14:20) Без про... Nov 28 2016, 12:59        jcxz Цитата(zltigo @ Nov 28 2016, 15:59) ... Nov 28 2016, 14:51         zltigo QUOTE (jcxz @ Nov 28 2016, 16:51) И в чём... Nov 28 2016, 15:53          jcxz Цитата(zltigo @ Nov 28 2016, 18:53) Как п... Dec 2 2016, 12:41           zltigo QUOTE (jcxz @ Dec 2 2016, 14:41) Вот это ... Dec 2 2016, 15:56            jcxz Цитата(zltigo @ Dec 2 2016, 18:56) Вы НЕ ... Dec 3 2016, 11:06             zltigo QUOTE (jcxz @ Dec 3 2016, 13:06) Я просто... Dec 3 2016, 12:32  Raven Цитата(x893 @ Nov 7 2016, 15:59) 1. Пропи... Jan 13 2017, 15:47 Boriska Цитата(x893 @ Nov 7 2016, 15:59) 2. Отсле... Nov 7 2016, 17:11 x893 Если освоить SystemView, то можно на большом экран... Nov 25 2016, 11:26 turnon Цитата(x893 @ Nov 25 2016, 15:26) Если ос... Nov 26 2016, 19:19 x893 1. Копируем в гуглопоиск SystemView и смотрит перв... Nov 26 2016, 20:22 haker_fox А мне тоже нравится динмаическое распределение, чу... Nov 27 2016, 09:51 haker_fox QUOTE (jcxz @ Nov 28 2016, 18:22) Это над... Nov 29 2016, 12:26 zltigo QUOTE (haker_fox @ Nov 29 2016, 14:26) За... Nov 29 2016, 14:46 k155la3 Цитата(haker_fox @ Nov 29 2016, 16:26) . ... Dec 6 2016, 13:26 Tahoe Немного разбавлю этот двустраничный флуд, про обор... Dec 10 2016, 12:35 zltigo Цитата(Tahoe @ Dec 10 2016, 14:35) Немног... Dec 10 2016, 12:49  Tahoe Цитата(zltigo @ Dec 10 2016, 15:49) Ваш в... Dec 10 2016, 23:30   zltigo Цитата(Tahoe @ Dec 11 2016, 01:30) ... Dec 11 2016, 08:03    Tahoe Цитата(zltigo @ Dec 11 2016, 11:03) Вы, н... Dec 11 2016, 11:16 ar__systems Задачу я решаю так: gcc умеет выдавать инфу, сколь... Jan 13 2017, 15:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|