Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Объем стека для работы задачи
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
l_fin_l
Здравствуйте, очень интересует вопрос, какое минимальное значение свободного стека должно быть для стабильной работы задачи? Измеряю свободное место в стеке задачи функцией uxTaskGetStackHighWaterMark(). Заранее спасибо.
zltigo
Цитата(l_fin_l @ Dec 18 2016, 11:41) *
Здравствуйте, очень интересует вопрос, какое минимальное значение свободного стека должно быть для стабильной работы задачи?

0, но с учетом методики измерения - одно слово.
l_fin_l
А для обработки прерываний? Правда я использую stm32, там вроде как используется для прерываний свой стек, но в случае FreeRTOS непонятно он использует свой стек(стек задачи), или отдельный?
zltigo
Цитата(l_fin_l @ Dec 18 2016, 13:08) *
А для обработки прерываний? Правда я использую stm32, там вроде как используется для прерываний свой стек, но в случае FreeRTOS непонятно он использует свой стек(стек задачи), или отдельный?

Какая разница? Вы получили абсолютно точный ответ НА СВОЙ ВОПРОС для любого случая sm.gif. Подозреваю, что Вы хотели узнать другое, но не смогли задать вопрос sm.gif. На тот вопрос, который Вы хотели, но не смогли задать, у меня тоже есть ответ - Только Вы сами сможете дать на него ответ, после того, как узнаете как и на чем работают написанные Вами программы. Никто за Вас на вопрос о объемах расходуемой памяти Вам ответить не сможет.
l_fin_l
А зачем тогда в статье "FreeRTOS: практическое применение, часть 6 (устранение проблем)" (http://microsin.ru/content/view/1309/44/), в описании к функции uxTaskGetStackHighWaterMark написано следущее "...Эта величина остается неиспользованной, когда использование стека было самым большим. Возвращаемое значение, приближающееся к 0 означает, что имеется угроза переполнения стека задачи." Заранее извиняюсь за возможно тупой вопрос.
Непомнящий Евгений
Цитата(l_fin_l @ Dec 19 2016, 07:14) *
А зачем тогда в статье "FreeRTOS: практическое применение, часть 6 (устранение проблем)" (http://microsin.ru/content/view/1309/44/), в описании к функции uxTaskGetStackHighWaterMark написано следущее "...Эта величина остается неиспользованной, когда использование стека было самым большим. Возвращаемое значение, приближающееся к 0 означает, что имеется угроза переполнения стека задачи." Заранее извиняюсь за возможно тупой вопрос.


обычно стек назначаются с некоторым (по возможности большим) запасом. Иначе самая минимальная переделка программы может ее сломать. На что и обращают ваше внимание в данной статье

ЗЫ что такое "большой запас" вы решаете сами, исходя из имеющихся у вас ресурсов и особенностей вашей задачи

Цитата(l_fin_l @ Dec 18 2016, 14:08) *
Правда я использую stm32, там вроде как используется для прерываний свой стек, но в случае FreeRTOS непонятно он использует свой стек(стек задачи), или отдельный?


Отдельный. Тот, что вы выделили на этапе линковки. Он используется вашими функциями до запуска шедулера; при запуске он очищается и далее используется в прерываниях
l_fin_l
Т.е. для задач используется свой стек, а для обработки прерываний MSP?
Непомнящий Евгений
Цитата(l_fin_l @ Dec 19 2016, 13:04) *
Т.е. для задач используется свой стек, а для обработки прерываний MSP?


да. Переключение стеков PSP / MSP делает сам проц. А фриртос при переключении тасков меняет PSP на стек таска
l_fin_l
Цитата
да. Переключение стеков PSP / MSP делает сам проц. А фриртос при переключении тасков меняет PSP на стек таска

все понял, всем спасибо за помощь.
jcxz
Цитата(zltigo @ Dec 18 2016, 13:48) *
0, но с учетом методики измерения - одно слово.

А контекст задачи где FreeRTOS сохраняет? Разве не на стеке задачи?
По-крайней мере часть контекста, сохраняемая при срабатывании ISR, будет на стеке задачи. Если конечно не всё исполнение идёт в Handler-режиме... sm.gif
Если конечно вопрос касается Cortex-M, о чём здесь можно только догадываться.....

Цитата(Непомнящий Евгений @ Dec 19 2016, 08:56) *
обычно стек назначаются с некоторым (по возможности большим) запасом. Иначе самая минимальная переделка программы может ее сломать. На что и обращают ваше внимание в данной статье

Не нужно даже переделки. Достаточно изменить ключи оптимизации или обновить компилятор. wink.gif

Цитата(Непомнящий Евгений @ Dec 19 2016, 08:56) *
Отдельный. Тот, что вы выделили на этапе линковки. Он используется вашими функциями до запуска шедулера; при запуске он очищается и далее используется в прерываниях

Вообще-то при входе в ISR стэкинг делается в тот стек, который был активным на момент прерывания, а уже потом делается переключение стеков. Если конечно исполнение исходно шло в Thread режиме.
Таким образом контекст прерванной задачи оказывается уже на её стеке и не нужно его копировать из Handler-стека куда-то в область данных задачи (как было на ARM7).
А уже дальнейшая работа ISR (и всех вложенных более приоритетных) идёт на Handler-стеке.
zltigo
Цитата(jcxz @ Dec 19 2016, 16:36) *
А контекст задачи где FreeRTOS сохраняет? Разве не на стеке задачи?
По-крайней мере часть контекста, сохраняемая при срабатывании ISR, будет на стеке задачи. Если конечно не всё исполнение идёт в Handler-режиме... sm.gif
Если конечно вопрос касается Cortex-M, о чём здесь можно только догадываться.....

Вы не поняли ВОПРОСА и соответсвенно ответа sad.gif
jcxz
Цитата(zltigo @ Dec 19 2016, 22:24) *
Вы не поняли ВОПРОСА и соответсвенно ответа sad.gif

А кто его тут понял? Вы? А Вы уверены, что то, как Вы его поняли, совпадает с тем, что имел в виду вопрошающий? laughing.gif
zltigo
Цитата(jcxz @ Dec 20 2016, 13:19) *
А кто его тут понял? Вы? А Вы уверены, что то, как Вы его поняли, совпадает с тем, что имел в виду вопрошающий? laughing.gif

Я абсолютно уверен, что вопрошающий хотел другого. Но тот вопрос, который был задан сам по себе полностью понятен и имеет однозначный ответ.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.