Ответ: Способы отследить переполнение стека Применительно к IAR:
1) резервировать стек по максимуму
2) во встроенном отладчике IAR есть контроль переполнения стека. Debug\View\Stack - покажет красивую картинку использования стека
3) программные трюки: на языке С
// Вызвать эту функцию один раз в начале main()
void sys_check_stack_init(void)
{
#pragma segment="CSTACK"
unsigned short * p = (unsigned short *)__segment_begin("CSTACK");
*p++ = 0xDEAD;
*p = 0xDEAD;
}
// Проверка на переполнение стека. Вызывать периодически.
// Если два слова в конце стека затерлись, то шабаш - ребут, можно // ругнуться system_panic
void sys_check_stack_(void)
{
#pragma segment="CSTACK"
unsigned short * p = (unsigned short *)__segment_begin("CSTACK");
if( (p[0] != 0xDEAD) || (p[1] != 0xDEAD) ) exit(0);
}
4) проверять глубину стека и фиксировать PC при котором он максимален (в отладочных целях). Пишется на асме, типа того:
; unsigned int sys_check_stack( void ); sys_check_stack mov.w #SFE(CSTACK), r12 sub.w sp, r12 cmp.w r12, stack_depth_ jc ?sys_check_stack_exit mov r12, stack_depth_ mov @sp, stack_pc_ ?sys_check_stack_exit: ret ; unsigned short sys_stack_info( unsigned short *address ); sys_stack_info tst.w r12 jeq ?sys_stack_info_p1 mov.w stack_pc_, 0(r12) ?sys_stack_info_p1: mov.w stack_depth_, r12 ret