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

 
 
> Расход стека
DreamTwister
сообщение Jan 30 2009, 12:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 5-08-08
Из: Челябинск
Пользователь №: 39 436



FreeRTOS 4.4.0
Микроконтроллер lpc2142

Задачи потребляют очень много стека. Хочется узнать на что они его расходуют.
Просто очень странно, что задача, которая управляет зажиганием 2-х светодиодов, требует 220 байт под стек!
Можно ли с этим что-то сделать?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 27)
FormatCft
сообщение Jan 30 2009, 16:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 331
Регистрация: 22-07-08
Из: Р О С С И Я
Пользователь №: 39 145



Цитата(DreamTwister @ Jan 30 2009, 17:47) *
FreeRTOS 4.4.0
Микроконтроллер lpc2142

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


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


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

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

Главное пользоваться почаще malloc(...), free(...)  rolleyes.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 30 2009, 20:28
Сообщение #3


Гуру
******

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



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


Могу только посторить вопрос - так зачем-же Вы ее такую дивную написали? 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ddiimmaa
сообщение Jan 31 2009, 01:40
Сообщение #4


Участник
*

Группа: Validating
Сообщений: 27
Регистрация: 12-12-08
Из: Ижевск
Пользователь №: 42 419



во FreeRTOS стек ВСЕХ задач используют обработчики прерываний

может в этом косяк?
Go to the top of the page
 
+Quote Post
DreamTwister
сообщение Feb 2 2009, 05:08
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 5-08-08
Из: Челябинск
Пользователь №: 39 436



Что-то тут не так...

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

Может имеет смысл заменить heap_1.c на что-то более подходящее?
Go to the top of the page
 
+Quote Post
ddiimmaa
сообщение Feb 4 2009, 20:45
Сообщение #6


Участник
*

Группа: Validating
Сообщений: 27
Регистрация: 12-12-08
Из: Ижевск
Пользователь №: 42 419



Цитата(DreamTwister @ Feb 2 2009, 09:08) *
Что-то тут не так...

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

Да как вы не понимаете не задача ваш стек ест а обработчик прерываний


--------------------
Вот пишу ОС, может кому пригодиться ;-)
скачайте http://sourceforge.net/projects/irtos/
и вот сайт ещё http://irtos.sourceforge.net/
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Feb 7 2009, 15:02
Сообщение #7


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



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

Вообще-то у ARM под прерывания отдельный стек... Да и сверхоперативных регистров тоже отдельный набор...
Go to the top of the page
 
+Quote Post
DreamTwister
сообщение Feb 9 2009, 07:38
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 5-08-08
Из: Челябинск
Пользователь №: 39 436



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


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

Вот и охота разобраться, как и на что расходуется стек во FreeRTOS.
Go to the top of the page
 
+Quote Post
ddiimmaa
сообщение Feb 14 2009, 14:19
Сообщение #9


Участник
*

Группа: Validating
Сообщений: 27
Регистрация: 12-12-08
Из: Ижевск
Пользователь №: 42 419



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


А извините не знал. Каюсь у меня AVR


--------------------
Вот пишу ОС, может кому пригодиться ;-)
скачайте http://sourceforge.net/projects/irtos/
и вот сайт ещё http://irtos.sourceforge.net/
Go to the top of the page
 
+Quote Post
vitko
сообщение Jan 26 2010, 14:28
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



Объясните пожалуйста.

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

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

Сообщение отредактировал vitko - Jan 26 2010, 14:41
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2010, 21:21
Сообщение #11


Гуру
******

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



Цитата(vitko @ Jan 26 2010, 17:28) *
Объясните пожалуйста.

Полностью зависит от собственно контроллера и того, как написан конкретный порт.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Jan 28 2010, 17:00
Сообщение #12


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



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

А зачем? Либо м/к поддерживает такую возможность на уровне архитектуры и тогда RTOS это принимает как данность. Либо не поддерживает и тогда IMHO лучше облегчать прерывания и обработку, активно кушающую стек, оформлять как отдельную задачу, чем делать программные манипуляции на грани фола связанные с переключением стека.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2010, 17:07
Сообщение #13


Гуру
******

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



Цитата(Aurochs @ Jan 28 2010, 20:00) *
чем делать программные манипуляции на грани фола связанные с переключением стека.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
vitko
сообщение Jan 29 2010, 14:01
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



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


В мелких процессорах (типа AVR) может и понадобиться.
А если еще и переключение контекста делать в каком-будь специально выделенном программом прерывании, а в прерывании от сист.таймера его только инициировать, то и вообще не надо по каждому тику сохранять/восстанавливать контекст. Но это уже будет совсем как в scmRTOS :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 29 2010, 15:18
Сообщение #15


Гуру
******

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



Цитата(vitko @ Jan 29 2010, 17:01) *
Но это уже будет совсем как в scmRTOS :-)

Поскольку в ней как класс отсутствуют задачи одинакового приоритета, то такое упрощение имеет эффект. В системах поддерживающих задачи одинакового приоритета они должны будут переключаться по КАЖДОМУ тику.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Jan 31 2010, 22:04
Сообщение #16


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



Цитата(zltigo @ Jan 28 2010, 19:07) *
Ну а фол-то где?

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

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

Вот именно. И, скорее всего, в 99 случаях из 100 будет необоснованно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 31 2010, 22:42
Сообщение #17


Гуру
******

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



Цитата(Aurochs @ Feb 1 2010, 00:04) *
Какой фол? Было сказано "на грани фола" - согласитесь, что это не одно и то же.



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

 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Feb 1 2010, 00:41
Сообщение #18


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



На грани фола в моем понимании означает, что сильно увеличивается потенциальная опасность возникновения ошибок, приводящих к труднодиагностируемому краху системы.
Если нужен пример, пожалуйста - переключение стека в фиксированную область во вложенных прерываниях.
Хотя для отчаянных ребят, программирующих в стиле "а-ля улыбнитесь, каскадеры" это, конечно, не довод wink.gif . И, честно говоря, нет ни малейшего желания вступать в дебаты по этому поводу. Хотел только предупредить, а дальше уж, как говорится, каждый выбирает для себя...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 1 2010, 00:49
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Счётчик вложености прерываний нужен хотя бы для того, чтобы не заниматься зря перепланировкой при выходе из вложенного прерывания, делать это только при выходе из всех прерываний. А при его наличии не переключать стек во вложенных прерываниях труда не составит.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 1 2010, 06:09
Сообщение #20


Гуру
******

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



Цитата(Aurochs @ Feb 1 2010, 02:41) *
И, честно говоря, нет ни малейшего желания вступать в дебаты....

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 1 2010, 07:02
Сообщение #21


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


В общем смысле любая программа либо работает, либо нет. Занимается она "сложным переключением контекста" или вычислением 2+2 - совершенно без разницы с точки зрения "надежности" работы устройства. Другое дело - нагрузка на голову программиста, но это вопрос профессионализма и навыка.
Go to the top of the page
 
+Quote Post
rexton
сообщение Dec 23 2011, 15:51
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 6-11-11
Пользователь №: 68 153



начал осваивать rtos

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

или что то я не так делаю?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 23 2011, 16:07
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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к оперативы.

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


Контроллер слабоват. Нужен более мощный.
Go to the top of the page
 
+Quote Post
kan35
сообщение Dec 23 2011, 16:12
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(rexton @ Dec 23 2011, 19:51) *
начал осваивать rtos

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

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

Думаю, не ошибусь, если скажу так: выделяете под задачу столько стека, сколько бы выделили для ее работы без операционки в свойствах линкера.
Go to the top of the page
 
+Quote Post
rexton
сообщение Dec 23 2011, 16:45
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 6-11-11
Пользователь №: 68 153



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

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

а 176 - экспериментальным путем получено.
указываю меньше 32 - вообще задача не запускается
а потом добавляю по 16 на каждый уровень вложенности функций, иначе вылетает в vApplicationStackOverflowHook
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 23 2011, 17:09
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(rexton @ Dec 23 2011, 18:45) *
а число 32разрядных слов.


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


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


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

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

void main()
{
   f1()
}


Для этого кода уровень вложенности не 2, столько сколько компилятор сделает.
Go to the top of the page
 
+Quote Post
rexton
сообщение Dec 23 2011, 17:57
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 6-11-11
Пользователь №: 68 153



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


Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 23 2011, 20:08
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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


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

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

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

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

Понятно
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 11:46
Рейтинг@Mail.ru


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