Цитата(kolobok0 @ Jul 8 2014, 09:45)

приблизительно такой-же фарш. Пока "проблемы по железу" всегда упирались в софт. Т.е. обычно из-за
невнятной(читай раскиданной по многим источникам) документации (последнее из этой оперы было - оконный вачдог + его IRQ.
но как всегда - софт наше всё). Но в интернете практически все ответы можно нарыть.
В Вашей связке, я бы пошёл в сокращении софтовой прослойки. Т.е. эмулировал бы обращение к "подозрительному железу"
без "лишнего софта". На мой взгляд - слабые софтовые звенья lwip & freertos. Там есть(скажеи так - встречаются) явные ляпы.
Сведите тестовый пример до "одного экрана" всех исходников. И будет Вам счастье. Ну или по дороге опознаете проблему.
кстати судя по дампам - у вас регистры левые... скорее всего уже загажены отладчиком или чем Вы там ловите. Правильно - опознание
через регистр LR. А вот он мне не нравится. Для пояснения приведу кусочек универсального обработчика на эту тему..
Код
if (((lr & 0x0F) == 1) || ((lr & 0x0F) == 9))
{
CommonProcessingException(&sSave, msp);
}
else if ((lr & 0x0F) == 0x0D)
{
CommonProcessingException(&sSave, psp);
}
У Вас явно не эти три случая. Согласны?
По поводу софта, если сократить прослойку вылетать перестает, НО перестает вылетать, даже если добавить какой-либо новый код к старой прослойке (FreeRTOS и LwIP), вроде как забываешь о проблеме, потом добавляешь еще код, опять начинается. То есть, образ софта немного меняется и ход исполнения соответственно тоже, вылеты исчезают. Почему я и подозреваю, что железо.
Тот дамп что скинул, он без отладчика, просто, в UART скинут. Код вот такой:
Код
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B hard_fault_handler_c
ENDP
Код
void hard_fault_handler_c (unsigned int * hardfault_args)
{
__IO unsigned int stack_ptr;
__IO unsigned int stacked_r0;
__IO unsigned int stacked_r1;
__IO unsigned int stacked_r2;
__IO unsigned int stacked_r3;
__IO unsigned int stacked_r12;
__IO unsigned int stacked_lr;
__IO unsigned int stacked_pc;
__IO unsigned int stacked_psr;
stack_ptr = ((unsigned long) hardfault_args);
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]);
printf ("\n\n[Hard fault handler - all numbers in hex]\n");
printf ("stack_ptr = %x\n", stack_ptr);
printf ("R0 = %x\n", stacked_r0);
printf ("R1 = %x\n", stacked_r1);
printf ("R2 = %x\n", stacked_r2);
printf ("R3 = %x\n", stacked_r3);
printf ("R12 = %x\n", stacked_r12);
printf ("LR [R14] = %x subroutine call return address\n", stacked_lr);
printf ("PC [R15] = %x program counter\n", stacked_pc);
printf ("PSR = %x\n", stacked_psr);
printf ("BFAR = 0x%x\n", (uint32_t)(*((volatile unsigned long *)(0xE000ED38))));
printf ("CFSR = 0x%x\n", (uint32_t)(*((volatile unsigned long *)(0xE000ED28))));
printf ("HFSR = 0x%x\n", (uint32_t)(*((volatile unsigned long *)(0xE000ED2C))));
printf ("DFSR = 0x%x\n", (uint32_t)(*((volatile unsigned long *)(0xE000ED30))));
printf ("AFSR = 0x%x\n", (uint32_t)(*((volatile unsigned long *)(0xE000ED3C))));
printf ("SCB_SHCSR = 0x%x\n", SCB->SHCSR);
memstat ();
while (1);
}
Цитата
Сталкивался с подобным. Помогло отключение, щас точно не помню, какого то буфера в камне. Вроде бы префеч ( ну или как его там ).
Попробую.