Jump to content

    

Расход стека

FreeRTOS 4.4.0

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

 

Задачи потребляют очень много стека. Хочется узнать на что они его расходуют.

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

Можно ли с этим что-то сделать?

Share this post


Link to post
Share on other sites
FreeRTOS 4.4.0

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

 

Задачи потребляют очень много стека. Хочется узнать на что они его расходуют.

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

Можно ли с этим что-то сделать?

 

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

 

 

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

 

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

 

Главное пользоваться почаще malloc(...), free(...)  :rolleyes:

Share this post


Link to post
Share on other sites
задача, которая управляет зажиганием 2-х светодиодов, требует 220 байт под стек!

 

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

Share this post


Link to post
Share on other sites

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

 

может в этом косяк?

Share this post


Link to post
Share on other sites

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

 

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

 

Может имеет смысл заменить heap_1.c на что-то более подходящее?

Share this post


Link to post
Share on other sites
Что-то тут не так...

 

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

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

Share this post


Link to post
Share on other sites
Да как вы не понимаете не задача ваш стек ест а обработчик прерываний

Вообще-то у ARM под прерывания отдельный стек... Да и сверхоперативных регистров тоже отдельный набор...

Share this post


Link to post
Share on other sites
Вообще-то у ARM под прерывания отдельный стек... Да и сверхоперативных регистров тоже отдельный набор...

 

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

 

Вот и охота разобраться, как и на что расходуется стек во FreeRTOS.

Share this post


Link to post
Share on other sites
Вообще-то у ARM под прерывания отдельный стек... Да и сверхоперативных регистров тоже отдельный набор...

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

Edited by vitko

Share this post


Link to post
Share on other sites
Объясните пожалуйста.

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

Share this post


Link to post
Share on other sites
В самой freeRTOS нету средств для, скажем, переключения всех прерываний на отдельный стек, как в scmRTOS ?.

А зачем? Либо м/к поддерживает такую возможность на уровне архитектуры и тогда RTOS это принимает как данность. Либо не поддерживает и тогда IMHO лучше облегчать прерывания и обработку, активно кушающую стек, оформлять как отдельную задачу, чем делать программные манипуляции на грани фола связанные с переключением стека.

Share this post


Link to post
Share on other sites
чем делать программные манипуляции на грани фола связанные с переключением стека.

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

Share this post


Link to post
Share on other sites
... Несколько команд изменяющих и восстанавливающих указатель стека - добавляются по месту легко и непренужденно. Если, оно конечно, это надо.

 

В мелких процессорах (типа AVR) может и понадобиться.

А если еще и переключение контекста делать в каком-будь специально выделенном программом прерывании, а в прерывании от сист.таймера его только инициировать, то и вообще не надо по каждому тику сохранять/восстанавливать контекст. Но это уже будет совсем как в scmRTOS :-)

Share this post


Link to post
Share on other sites
Но это уже будет совсем как в scmRTOS :-)

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this