ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
1 июля
64748 Топик полностью
Kurt (08.08.2006 12:43, просмотров: 4) ответил РДимка на Еще вопрос: как отследить переполнение стека?
Ответ: Способы отследить переполнение стека Применительно к 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