Я сделал то же самое, что вы предложили для dsPIC, используя CMX-Tiny +, однако при проверке стека я также сохраняю «отметку скрытия» для каждого стека. Вместо того, чтобы проверять значение в верхней части стека, я выполняю итерацию сверху, чтобы найти первое не сигнатурное значение, а если оно выше, чем ранее, я сохраняю его в статической переменной. Это делается в задаче с наименьшим приоритетом, поэтому она выполняется всякий раз, когда ничего не запланировано (по сути, заменяя цикл простоя; в вашей ОСРВ вы можете подключить цикл простоя и сделать это там). Это означает, что обычно он проверяется чаще, чем периодическая проверка 10 мс; за это время можно было прикрутить весь планировщик.
Моя методология заключается в том, чтобы затем увеличить размеры стеков, применить код, затем проверить метки прилива, чтобы определить запас для каждой задачи (и стека ISR - не забывайте об этом!), И соответствующим образом скорректировать стеки, если Мне нужно восстановить «потраченное впустую» пространство из стеков негабаритного размера (я не беспокоюсь, если пространство не требуется в противном случае).
Преимущество этого подхода состоит в том, что вы не ждете, пока стек не сломается, чтобы обнаружить потенциальную проблему; Вы отслеживаете его по мере разработки и регистрации изменений. Это полезно, поскольку если повреждение соответствует TCB или адресу возврата, ваш планировщик может быть настолько сломан, что проверка никогда не активируется после переполнения.
Некоторые RTOS имеют эту встроенную функциональность (embOS, vxWorks, о которых я знаю). Операционные системы, использующие аппаратное обеспечение MMU, могут работать лучше, если поместить стек в защищенное пространство памяти, поэтому переполнение приведет к прерыванию данных. Возможно, это «лучший путь», который вы ищете; ARM9 имеет MMU, но ОС, которые его поддерживают, как правило, стоят дороже. QNX Neutrino возможно?
Дополнительные примечания
Если вы не хотите выполнять проверку приливов вручную, просто увеличьте размеры стеков, скажем, до 1 КБ, а затем в задаче проверки стеков перехватите условие, когда запас упадет ниже 1 КБ. Таким образом, вы, скорее всего, перехватите условие ошибки, пока планировщик все еще жизнеспособен. Это не доказательство, но если вы начнете распределять объекты достаточно большими, чтобы удар был разбит одним ударом, в любом случае в вашей голове должен прозвучать сигнал тревоги - это более распространенный медленный ползучий стек, вызванный все более глубоким вложением функций, и тому подобное, что это будет помогите.
Clifford.