Цитата(Boriska @ Apr 21 2015, 00:40)

При выполнении программы постоянно возникает ошибка IBUSERR. Во время HardFault в стеке содержится один и тот же адрес PC = 0x24.... А вот откуда программа попадает на этот адрес - не понятно. Проект большой, на FreeRTOS. Используется STM32F407.
Подскажите, какие способы отладки можно применить в данном случае? Можно ли воспользоваться MPU, а если можно, то как?
CODE
void hard_fault_handler_c(unsigned int * hardfault_args)
{
unsigned int stacked_r0;
unsigned int stacked_r1;
unsigned int stacked_r2;
unsigned int stacked_r3;
unsigned int stacked_r12;
unsigned int stacked_lr;
unsigned int stacked_pc;
unsigned int stacked_psr;
stacked_r0 = ((unsigned long) hardfault_args[0]);
stacked_r1 = ((unsigned long) hardfault_args[1]);
stacked_r2 = ((unsigned long) hardfault_args[2]);
stacked_r3 = ((unsigned long) hardfault_args[3]);
stacked_r12 = ((unsigned long) hardfault_args[4]);
stacked_lr = ((unsigned long) hardfault_args[5]);
stacked_pc = ((unsigned long) hardfault_args[6]);
stacked_psr = ((unsigned long) hardfault_args[7]);
TRACE ("[Hard fault handler]\n");
TRACE ("R0 = %x\n", stacked_r0);
TRACE ("R1 = %x\n", stacked_r1);
TRACE ("R2 = %x\n", stacked_r2);
TRACE ("R3 = %x\n", stacked_r3);
TRACE ("R12 = %x\n", stacked_r12);
TRACE ("LR = %x\n", stacked_lr);
TRACE ("PC = %x\n", stacked_pc);
TRACE ("PSR = %x\n", stacked_psr);
TRACE ("BFAR = %x\n", (*((volatile unsigned long *)(0xE000ED38))));
TRACE ("CFSR = %x\n", (*((volatile unsigned long *)(0xE000ED28))));
TRACE ("HFSR = %x\n", (*((volatile unsigned long *)(0xE000ED2C))));
TRACE ("DFSR = %x\n", (*((volatile unsigned long *)(0xE000ED30))));
TRACE ("AFSR = %x\n", (*((volatile unsigned long *)(0xE000ED3C))));
while (1);
return;
}
/*******************************************************************************
* Description : This function handles Hard Fault exception.
* Input : -
* Return : -
*******************************************************************************/
void HardFault_Handler(void)
{
// Go to infinite loop when Hard Fault exception occurs
asm("TST LR, #4");
asm("ITE EQ");
asm("MRSEQ R0, MSP");
asm("MRSNE R0, PSP");
asm("B hard_fault_handler_c");
while (1);
}
stacked_lr надо смотреть, если склероз не изменяет, это будет примерно аддресс ассемблерной команды где все грохнулось.
Верить нельзя никому, даже себе. Мне - можно.