Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Расход стека
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
DreamTwister
FreeRTOS 4.4.0
Микроконтроллер lpc2142

Задачи потребляют очень много стека. Хочется узнать на что они его расходуют.
Просто очень странно, что задача, которая управляет зажиганием 2-х светодиодов, требует 220 байт под стек!
Можно ли с этим что-то сделать?
FormatCft
Цитата(DreamTwister @ Jan 30 2009, 17:47) *
FreeRTOS 4.4.0
Микроконтроллер lpc2142

Задачи потребляют очень много стека. Хочется узнать на что они его расходуют.
Просто очень странно, что задача, которая управляет зажиганием 2-х светодиодов, требует 220 байт под стек!
Можно ли с этим что-то сделать?


каким сделали такой и есть. 


Основная причина множество локальных данных. Большие массивы структуры.

У меня все потоки используют по 120байт, какими бы тяжелыми они не были.

Главное пользоваться почаще malloc(...), free(...)  rolleyes.gif
zltigo
Цитата(DreamTwister @ Jan 30 2009, 15:47) *
задача, которая управляет зажиганием 2-х светодиодов, требует 220 байт под стек!


Могу только посторить вопрос - так зачем-же Вы ее такую дивную написали? 
ddiimmaa
во FreeRTOS стек ВСЕХ задач используют обработчики прерываний

может в этом косяк?
DreamTwister
Что-то тут не так...

Закрыл комментариями все содержимое задачи, оставил только for(;;). Потребление не изменилось. Может проблема в том, что для "измерения" потребления стека я использую vTaskList?

Может имеет смысл заменить heap_1.c на что-то более подходящее?
ddiimmaa
Цитата(DreamTwister @ Feb 2 2009, 09:08) *
Что-то тут не так...

Закрыл комментариями все содержимое задачи, оставил только for(;;). Потребление не изменилось. Может проблема в том, что для "измерения" потребления стека я использую vTaskList?

Да как вы не понимаете не задача ваш стек ест а обработчик прерываний
HARMHARM
Цитата(ddiimmaa @ Feb 4 2009, 22:45) *
Да как вы не понимаете не задача ваш стек ест а обработчик прерываний

Вообще-то у ARM под прерывания отдельный стек... Да и сверхоперативных регистров тоже отдельный набор...
DreamTwister
Цитата(HARMHARM @ Feb 7 2009, 20:02) *
Вообще-то у ARM под прерывания отдельный стек... Да и сверхоперативных регистров тоже отдельный набор...


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

Вот и охота разобраться, как и на что расходуется стек во FreeRTOS.
ddiimmaa
Цитата(HARMHARM @ Feb 7 2009, 19:02) *
Вообще-то у ARM под прерывания отдельный стек... Да и сверхоперативных регистров тоже отдельный набор...


А извините не знал. Каюсь у меня AVR
vitko
Объясните пожалуйста.

Правильно ли я понимаю, что в freeRTOS прерывания используют стек текущей задачи, и соответственно стеки задач должны иметь запас на хранение контекста(-ов) прерываний ?

В самой freeRTOS нету средств для, скажем, переключения всех прерываний на отдельный стек, как в scmRTOS ? Ддя небольших процессоров было бы нелишне.
zltigo
Цитата(vitko @ Jan 26 2010, 17:28) *
Объясните пожалуйста.

Полностью зависит от собственно контроллера и того, как написан конкретный порт.
Aurochs
Цитата(vitko @ Jan 26 2010, 16:28) *
В самой freeRTOS нету средств для, скажем, переключения всех прерываний на отдельный стек, как в scmRTOS ?.

А зачем? Либо м/к поддерживает такую возможность на уровне архитектуры и тогда RTOS это принимает как данность. Либо не поддерживает и тогда IMHO лучше облегчать прерывания и обработку, активно кушающую стек, оформлять как отдельную задачу, чем делать программные манипуляции на грани фола связанные с переключением стека.
zltigo
Цитата(Aurochs @ Jan 28 2010, 20:00) *
чем делать программные манипуляции на грани фола связанные с переключением стека.

Ну а фол-то где? Несколько команд изменяющих и восстанавливающих указатель стека - добавляются по месту легко и непренужденно. Если, оно конечно, это надо.
vitko
Цитата(zltigo @ Jan 28 2010, 19:07) *
... Несколько команд изменяющих и восстанавливающих указатель стека - добавляются по месту легко и непренужденно. Если, оно конечно, это надо.


В мелких процессорах (типа AVR) может и понадобиться.
А если еще и переключение контекста делать в каком-будь специально выделенном программом прерывании, а в прерывании от сист.таймера его только инициировать, то и вообще не надо по каждому тику сохранять/восстанавливать контекст. Но это уже будет совсем как в scmRTOS :-)
zltigo
Цитата(vitko @ Jan 29 2010, 17:01) *
Но это уже будет совсем как в scmRTOS :-)

Поскольку в ней как класс отсутствуют задачи одинакового приоритета, то такое упрощение имеет эффект. В системах поддерживающих задачи одинакового приоритета они должны будут переключаться по КАЖДОМУ тику.
Aurochs
Цитата(zltigo @ Jan 28 2010, 19:07) *
Ну а фол-то где?

Какой фол? Было сказано "на грани фола" - согласитесь, что это не одно и то же.
Цитата(zltigo @ Jan 28 2010, 19:07) *
Несколько команд изменяющих и восстанавливающих указатель стека - добавляются по месту легко и непренужденно.

Не спорю.
Цитата(zltigo @ Jan 28 2010, 19:07) *
Если, оно конечно, это надо.

Вот именно. И, скорее всего, в 99 случаях из 100 будет необоснованно.
zltigo
Цитата(Aurochs @ Feb 1 2010, 00:04) *
Какой фол? Было сказано "на грани фола" - согласитесь, что это не одно и то же.



Хочу знать что за фол о нахождении на грани которого Вы говорите. 

 
Aurochs
На грани фола в моем понимании означает, что сильно увеличивается потенциальная опасность возникновения ошибок, приводящих к труднодиагностируемому краху системы.
Если нужен пример, пожалуйста - переключение стека в фиксированную область во вложенных прерываниях.
Хотя для отчаянных ребят, программирующих в стиле "а-ля улыбнитесь, каскадеры" это, конечно, не довод wink.gif . И, честно говоря, нет ни малейшего желания вступать в дебаты по этому поводу. Хотел только предупредить, а дальше уж, как говорится, каждый выбирает для себя...
ReAl
Счётчик вложености прерываний нужен хотя бы для того, чтобы не заниматься зря перепланировкой при выходе из вложенного прерывания, делать это только при выходе из всех прерываний. А при его наличии не переключать стек во вложенных прерываниях труда не составит.
zltigo
Цитата(Aurochs @ Feb 1 2010, 02:41) *
И, честно говоря, нет ни малейшего желания вступать в дебаты....

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


В общем смысле любая программа либо работает, либо нет. Занимается она "сложным переключением контекста" или вычислением 2+2 - совершенно без разницы с точки зрения "надежности" работы устройства. Другое дело - нагрузка на голову программиста, но это вопрос профессионализма и навыка.
rexton
начал осваивать rtos

правильно ли я понимаю что при создании задачи размер стека надо указывать в зависимости от того, сколько вложенных функций будет в самой задаче?
то есть если в задаче глубина вложенности функций будет например 10, то и размер стека надо указывать >176? то есть такая задача отожрет >704 байта оперативы. что в общем то не кашерно при наличии 8к оперативы.

или что то я не так делаю?
_Артём_
Цитата(rexton @ Dec 23 2011, 17:51) *
начал осваивать rtos

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


Про локальные переменные тоже надо не забывать.


Цитата(rexton @ Dec 23 2011, 17:51) *
то есть если в задаче глубина вложенности функций будет например 10, то и размер стека надо указывать >176? то есть такая задача отожрет


Почему именно 176?
Каждый уровень потребляет 17,6 байта?

Цитата(rexton @ Dec 23 2011, 17:51) *
>704 байта оперативы. что в общем то не кашерно при наличии 8к оперативы.

или что то я не так делаю?


Контроллер слабоват. Нужен более мощный.
kan35
Цитата(rexton @ Dec 23 2011, 19:51) *
начал осваивать rtos

правильно ли я понимаю что при создании задачи размер стека надо указывать в зависимости от того, сколько вложенных функций будет в самой задаче?
то есть если в задаче глубина вложенности функций будет например 10, то и размер стека надо указывать >176? то есть такая задача отожрет >704 байта оперативы. что в общем то не кашерно при наличии 8к оперативы.

или что то я не так делаю?

Думаю, не ошибусь, если скажу так: выделяете под задачу столько стека, сколько бы выделили для ее работы без операционки в свойствах линкера.
rexton
Цитата(_Артём_ @ Dec 23 2011, 19:07) *
Почему именно 176?
Каждый уровень потребляет 17,6 байта?

ну не 17,6 байта. Я так понял что указываемое значение - это не число байт, а число 32разрядных слов.

а 176 - экспериментальным путем получено.
указываю меньше 32 - вообще задача не запускается
а потом добавляю по 16 на каждый уровень вложенности функций, иначе вылетает в vApplicationStackOverflowHook
_Артём_
Цитата(rexton @ Dec 23 2011, 18:45) *
а число 32разрядных слов.


А какая архитектура?


Цитата(rexton @ Dec 23 2011, 18:45) *
а потом добавляю по 16 на каждый уровень вложенности функций, иначе вылетает в vApplicationStackOverflowHook


ИМХО сомнительный подход.
Могу ошибаться, но мне кажется, что уровень вложенности не равен количеству вызовов функций:

Код
void f2()
{
}
void f1()
{
    f2();
}

void main()
{
   f1()
}


Для этого кода уровень вложенности не 2, столько сколько компилятор сделает.
rexton
согласен. тогда получается лишняя заморочка по расчету того сколько же стека нужно задаче....
а камень - stm32f100rb


_Артём_
Цитата(rexton @ Dec 23 2011, 19:57) *
согласен.


C чем именно согласны?

Цитата(rexton @ Dec 23 2011, 19:57) *
тогда получается лишняя заморочка по расчету того сколько же стека нужно задаче....

Лишняя?
Стек надо как-то учитывать....
Если стека не хватает работать не будет. А говорите - лишняя.

Цитата(rexton @ Dec 23 2011, 19:57) *
а камень - stm32f100rb

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