|
|
  |
Объем стека для работы задачи, Минимальный объем свободного места в стеке задачи |
|
|
|
Dec 18 2016, 09:41
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836

|
Здравствуйте, очень интересует вопрос, какое минимальное значение свободного стека должно быть для стабильной работы задачи? Измеряю свободное место в стеке задачи функцией uxTaskGetStackHighWaterMark(). Заранее спасибо.
|
|
|
|
|
Dec 18 2016, 11:08
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836

|
А для обработки прерываний? Правда я использую stm32, там вроде как используется для прерываний свой стек, но в случае FreeRTOS непонятно он использует свой стек(стек задачи), или отдельный?
|
|
|
|
|
Dec 18 2016, 11:38
|

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

|
Цитата(l_fin_l @ Dec 18 2016, 13:08)  А для обработки прерываний? Правда я использую stm32, там вроде как используется для прерываний свой стек, но в случае FreeRTOS непонятно он использует свой стек(стек задачи), или отдельный? Какая разница? Вы получили абсолютно точный ответ НА СВОЙ ВОПРОС для любого случая  . Подозреваю, что Вы хотели узнать другое, но не смогли задать вопрос  . На тот вопрос, который Вы хотели, но не смогли задать, у меня тоже есть ответ - Только Вы сами сможете дать на него ответ, после того, как узнаете как и на чем работают написанные Вами программы. Никто за Вас на вопрос о объемах расходуемой памяти Вам ответить не сможет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 19 2016, 04:14
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836

|
А зачем тогда в статье "FreeRTOS: практическое применение, часть 6 (устранение проблем)" (http://microsin.ru/content/view/1309/44/), в описании к функции uxTaskGetStackHighWaterMark написано следущее "...Эта величина остается неиспользованной, когда использование стека было самым большим. Возвращаемое значение, приближающееся к 0 означает, что имеется угроза переполнения стека задачи." Заранее извиняюсь за возможно тупой вопрос.
|
|
|
|
|
Dec 19 2016, 05:56
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(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 непонятно он использует свой стек(стек задачи), или отдельный? Отдельный. Тот, что вы выделили на этапе линковки. Он используется вашими функциями до запуска шедулера; при запуске он очищается и далее используется в прерываниях
|
|
|
|
|
Dec 19 2016, 10:04
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836

|
Т.е. для задач используется свой стек, а для обработки прерываний MSP?
|
|
|
|
|
Dec 19 2016, 10:31
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836

|
Цитата да. Переключение стеков PSP / MSP делает сам проц. А фриртос при переключении тасков меняет PSP на стек таска все понял, всем спасибо за помощь.
|
|
|
|
|
Dec 19 2016, 14:36
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Dec 18 2016, 13:48)  0, но с учетом методики измерения - одно слово. А контекст задачи где FreeRTOS сохраняет? Разве не на стеке задачи? По-крайней мере часть контекста, сохраняемая при срабатывании ISR, будет на стеке задачи. Если конечно не всё исполнение идёт в Handler-режиме...  Если конечно вопрос касается Cortex-M, о чём здесь можно только догадываться..... Цитата(Непомнящий Евгений @ Dec 19 2016, 08:56)  обычно стек назначаются с некоторым (по возможности большим) запасом. Иначе самая минимальная переделка программы может ее сломать. На что и обращают ваше внимание в данной статье Не нужно даже переделки. Достаточно изменить ключи оптимизации или обновить компилятор.  Цитата(Непомнящий Евгений @ Dec 19 2016, 08:56)  Отдельный. Тот, что вы выделили на этапе линковки. Он используется вашими функциями до запуска шедулера; при запуске он очищается и далее используется в прерываниях Вообще-то при входе в ISR стэкинг делается в тот стек, который был активным на момент прерывания, а уже потом делается переключение стеков. Если конечно исполнение исходно шло в Thread режиме. Таким образом контекст прерванной задачи оказывается уже на её стеке и не нужно его копировать из Handler-стека куда-то в область данных задачи (как было на ARM7). А уже дальнейшая работа ISR (и всех вложенных более приоритетных) идёт на Handler-стеке.
|
|
|
|
|
Dec 20 2016, 21:37
|

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

|
Цитата(jcxz @ Dec 20 2016, 13:19)  А кто его тут понял? Вы? А Вы уверены, что то, как Вы его поняли, совпадает с тем, что имел в виду вопрошающий?  Я абсолютно уверен, что вопрошающий хотел другого. Но тот вопрос, который был задан сам по себе полностью понятен и имеет однозначный ответ.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|