Good morning everyone,
I am implementing a custom radio protocol on NRF52 without using the SoftDevice at the moment. For some reason, I get a HardFault which I am trying to understand.
I am working on an NRF52832 dev board with the JLink attached, I am using the Segger Embedded Studio and I have configured the sdk_config to show the output of the NRF_LOG_ERROR.
To be sure that this works fine, at the beginning of my main, I put an NRF_LOG_ERROR ("Application start") and this is displayed as expected while in debug mode.
I included the files hardfault_handler_gcc.c and hardfault_implementation.c, and when the HardFault occurs, I see that the debugger correctly stop at the first instruction of the HardFault_Handler function as shown below
void HardFault_Handler(void) { __ASM volatile( " tst lr, #4 \n" /* PSP is quite simple and does not require additional handler */ " itt ne \n" " mrsne r0, psp \n" /* Jump to the handler, do not store LR - returning from handler just exits exception */ " bne HardFault_Handler_Continue \n" /* Processing MSP requires stack checking */ " mrs r0, msp \n" " ldr r1, =__StackTop \n" " ldr r2, =__StackLimit \n" /* MSP is in the range of the stack area */ " cmp r0, r1 \n" " bhi HardFault_MoveSP \n" " cmp r0, r2 \n" " bhi HardFault_Handler_Continue \n" "HardFault_MoveSP: \n" " mov sp, r1 \n" " mov r0, #0 \n" #if HARDFAULT_HANDLER_GDB_PSP_BACKTRACE " mov r3, sp \n" /* Remember old SP */ " mov sp, r0 \n" /* SP changed the pointer when hardfault was generated - we cannot just switch to PSP in exception */ " push {r3,lr} \n" /* Save old SP and LR on the task stack */ #if !defined(__SES_ARM) " .cfi_def_cfa_offset 8 \n" " .cfi_offset 14, -4 \n" #endif /* No information about saved SP above (no .cfi_offset 13, -8). * In other case this would direct us back to using always MSP while backtracking */ " ldr r3, =%0 \n" " blx r3 \n" " pop {r3,lr} \n" " mov sp, r3 \n" " bx lr \n" #else // HARDFAULT_HANDLER_GDB_PSP_BACKTRACE " ldr r3, =%0 \n" " bx r3 \n" #endif " .ltorg \n" : : "X"(HardFault_c_handler) ); } "HardFault_Handler_Continue: \n"
Then, if I push the "Continue" button in the debug mode of SES, the execution continues until the NRF_BREAKPOINT_COND instruction of hardfault_implementation.c , but the problem is that no NRF_LOG_ERROR is output on the Debug Terminal. So, of course, this limits drastically the utilility of this function....
If I try to go step by step in the debug mode, sometimes the system stops in the nrf_fprintf_format.c class, at a strlen instruction (line 109)....some other times it stops in a function
__STATIC_INLINE void nrf_log_backend_panic_set(nrf_log_backend_t const * p_backend) defined in nrf_log_backend_interface....
Do you have any clue what I am missing, or if this is a normal behaviour caused by the weird hardfault?
Thanks in advance for your help!