Недавно я работал с Rtos и создал несколько задач для выполнения необходимых действий. Хотя кажется, что каждый раз, когда я создаю новую задачу с конфигурацией xTaskCreate или TI GUI, я просто стараюсь сохранить размер своего стека, чтобы стек не переполнялся. Есть ли способ рассчитать максимальный размер стека, используемый моей задачей в отношении этих событий? 1. Стек, используемый глобальной и локальной переменной 2. Стек, используемый максимальным количеством рекурсий функции 3. Включая переключение контекста прерывания
Расчет размера стека в FreeRtos или TI rtos
Ответы (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 а>
Я использовал этот код:
TaskHandle_t cipTask;
UBaseType_t uxHighWaterMark;
/* Print actual size of stack has used */
for (;;) {
uxHighWaterMark = uxTaskGetStackHighWaterMark(cipTask);
Serial.println(uxHighWaterMark);
}