CortexM3 HardFault with FreeRTOS7.5.2

vicui wrote on Friday, December 06, 2013:

ALL

my Cortex M3 happen Hardfault after running some time. it is long sometimes and short sometimes. no rule. and it use FreeRTOS7.5.2, after Hardfault, I dump CPU context as following
[Hard fault handler]
R0 = 2e
R1 = 0
R2 = ffffffff
R3 = 20005f48
R12 = 4f588000
LR = fffffffd
PC = 28024f14
PSR = 21000035
BFAR = e000ed38
CFSR = 100
HFSR = 40000000
DFSR = 0
AFSR = 0

it is strange that PC value is not a valid address, anyone meet same problem ?

rtel wrote on Friday, December 06, 2013:

If the dump was done while you were in the hardfault handler then I would expect the PC to point to code inside the hardfault handler.

I would suggest starting here: http://www.freertos.org/FAQHelp.html for a list of possible problems if the hardfault is occurring in FreeRTOS itself (rather than in your application).

Regards.

vicui wrote on Tuesday, December 10, 2013:

I always enable conf_assert and make sure that there is no assert when hardfault happen. I start to guess HW issue and collect more record about PC value, it may be 0x0Cxxxxxx, 0x28xxxxxx, 0xc8xxxxxx, it is random case

rtel wrote on Tuesday, December 10, 2013:

How are you working out the PC value?

Regards.

vicui wrote on Wednesday, December 11, 2013:

use following code to save cpu context when hardfault happen
IMPORT hard_fault_handler_c
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B hard_fault_handler_c
then, go to hardfault_handle to dump those context

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;

while(1)
{
    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 ("[Hard fault handler]\n");  
    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 = %x\n", stacked_lr);  
    printf ("PC = %x\n", stacked_pc);  
    printf ("PSR = %x\n", stacked_psr);  
    printf ("BFAR = %x\n", (*((volatile unsigned long *)(0xE000ED38))));  
    printf ("CFSR = %x\n", (*((volatile unsigned long *)(0xE000ED28))));  
    printf ("HFSR = %x\n", (*((volatile unsigned long *)(0xE000ED2C))));  
    printf ("DFSR = %x\n", (*((volatile unsigned long *)(0xE000ED30))));  
    printf ("AFSR = %x\n", (*((volatile unsigned long *)(0xE000ED3C))));  
    printf ("SCB_SHCSR = %x\n", SCB->SHCSR);
    getkeychar();
}

}

davedoors wrote on Wednesday, December 11, 2013:

Could the problem be in the printf() from an exception handler? If you look at the value of stacked_pc in the debugger does it match the value printed out?