IAR C-SPY: предупреждение о переполнении стека Печать
Добавил(а) microsin   

В некоторых случаях отладчик C-SPY выдает предупреждения о переполнении стека, хотя причины для такого предупреждения нет, поскольку в стеке имеется достаточно свободного места:

The stack 'CSTACK' is filled to 100% (4096 bytes used out of 4096).
The warning threshold is set to 90%

Когда проект создается, то его опции устанавливаются в значения по умолчанию. Одно из таких значений - разрешение проверки стека (C stack checking). Это хорошая возможность выявления потенциальных ошибок при написании и отладке обычных встраиваемых приложений. Проверка стека в C-SPY изначально встроена в среду разработки IAR Embedded Workbench (в более ранних версиях эта проверка была реализована через плагин C-SPY).

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

[Решение проблемы]

Можно запретить появление предупреждающего сообщения C stack checking, если снять галочку 'Warn when stack pointer is out of bounds' через диалог Tools -> Options... > раздел Stack.

IAR C stack checking

Для старых версий IAR Embedded Workbench, которые используют C-SPY stack plugin, запретите этот плагин снятием галочки в меню Project -> Options -> Debugger -> Plugins -> Stack.

При использовании RTOS не разрешайте проверку стека C-SPY. Возможно, что в плагине для RTOS есть возможность разрешения проверки переполнения стека для задачи.

[Другие проблемные ситуации]

Если приложение не использует RTOS, причины для предупреждения о переполнении стека могут быть следующие.

• Предупреждение корректно, требуется внести изменения во встраиваемое приложение (как минимум увеличить пространство под стек).
• Приложение было (как минимум частично) собрано без отладочной информации. Имейте в виду, что C stack(s) checking без отладочной информации не будет работать так, как это было предусмотрено. В этой ситуации запретите функцию C stack(s) checking.

[Ссылки]

1. Stack overflow Technical Note 57348 site:iar.com.
2. FreeRTOS: использование стека и проверка стека на переполнение.
3. FreeRTOS: практическое применение, часть 6 (устранение проблем).
4. Проектирование стека и кучи в IAR.
5. FreeRTOS, STM32: отладка ошибок и исключений.