Перейти к содержанию
    

Как отловить переполнение стека, LPC2142.

Решаю вопросы по оптимизации работы оперативной памяти, так как ее стало не хватать.

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

 

unsigned portSHORT usTaskCheckFreeStackSpace( const unsigned portCHAR *pucStackByte )

 

Что нужно в нее передавать? Вершину стека?

Откуда вызывать данную функция?

Я так понял, что ее можно вызвать из выполняемой задачи и посмотреть, сколько эта задача "кушает" сетка.

 

Или я что-то не понимаю.

 

Компилятор - IAR. Версия ОС - FreeRTOS 4.4.0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или я что-то не понимаю.

Да принцип простой, как лом - стек при инициализации задачи заполняется каким либо значением, далее в совершенно любой момент и из любой задачи можно посмотреть где начинается/кончается заполнение этим самым water mark. На конкретные вопросы не отвечу, поскольку у меня относительно оригинального варианта FreeRTOS это переписано было сразу-же. Но там все очень просто - гляньте исходник....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поковырял я исходники, но смысл проблемы особо не изменился.

 

В функции xTaskCreate объявляется ряд структур, а именно:

pxCurrentTCB

pxNewTCB.

 

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

 

Или там есть более простой способ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в том, что они все локальные и никуда не передаются.

Как их лучше оттуда выковырять?

Написать некую свою локальную-же функцию, или посмотреть уже готовую функцию/макрос в исходнике. Чем, например Вас не устраивает в первом приближении uxTaskGetStackHighWaterMark( xTaskHandle xTask ) ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно, но это функции в своей версии ОС я так и не увидел, зато обнаружилась:

 

vTaskList( portCHAR *pcWriteBuffer );.

 

Для дебага сойдет, я думаю. Тем более там можно просматривать многие другие параметры задач.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно, но это функции в своей версии ОС я так и не увидел, зато обнаружилась:

Стесняюсь спросить, а какого не взять текущую версию?

vTaskList( portCHAR *pcWriteBuffer );.

Ее и переписать в первую очередь, ибо использовать для распечатки отдельный буфер просто не разумно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да уж, использовать лишние 100 байт для мониторинга задач - не есть хорошо.

Но для самопроверки сойдет и такая функция, все равно из конечной прошивки она будет убрана.

 

Это мой первый опыт работы с операционными системами реального времени, чувствуется сильная нехватка опыта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...