Расчет размера стека в FreeRtos или TI rtos

Недавно я работал с Rtos и создал несколько задач для выполнения необходимых действий. Хотя кажется, что каждый раз, когда я создаю новую задачу с конфигурацией xTaskCreate или TI GUI, я просто стараюсь сохранить размер своего стека, чтобы стек не переполнялся. Есть ли способ рассчитать максимальный размер стека, используемый моей задачей в отношении этих событий? 1. Стек, используемый глобальной и локальной переменной 2. Стек, используемый максимальным количеством рекурсий функции 3. Включая переключение контекста прерывания


person Ashish    schedule 08.06.2017    source источник


Ответы (2)


Компилятор, уровень оптимизации компилятора, архитектура процессора, размещение локальных переменных и глубина вложенности вызовов функций — все это оказывает большое влияние на размер стека. ОСРВ оказывает минимальное влияние. Например, FreeRTOS добавит примерно 60 байт в стек на Cortex-M, который используется для хранения контекста задачи, когда задача не выполняется. Какой бы метод вы ни использовали для расчета использования стека в своем проекте, отличном от RTOS, его можно использовать и в вашем проекте RTOS, а затем добавьте примерно 60 байт.

Вы можете рассчитать эти вещи, и это может быть важно в критически важных для безопасности приложениях, но в других случаях более прагматичный подход состоит в том, чтобы попробовать и посмотреть — использовать функции RTOS, чтобы измерить, сколько стека фактически используется, и использовать стек. обнаружение переполнения - затем настраивайте, пока не найдете что-то оптимальное. http://www.freertos.org/Stacks-and-stack-overflow-checking.html http://www.freertos.org/uxTaskGetStackHighWaterMark.html

person Richard    schedule 09.06.2017

Я использовал этот код:

TaskHandle_t cipTask;
UBaseType_t uxHighWaterMark;
/* Print actual size of stack has used */
for (;;) {  
  uxHighWaterMark = uxTaskGetStackHighWaterMark(cipTask);
  Serial.println(uxHighWaterMark);
}
person HSIoT Industrial 4.0    schedule 13.07.2020