When a watchdog timeout occurs, it could be the result of many causes. The code could be 'out in space' due to a bad pointer corrupting anything it wants to. It could be due to a fault condition that did not affect data space. Who knows?
Since the watchdog reset is considered a 'hard reset' we know where it will then start execution from.
If I want to save existing data ram into flash prior to executing __main() I would think the place to do this would be here:
; Reset Handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, =__main BX R0 ENDP
I could jump into a routine which calls an IAP command to save RAM to flash and then return to finish the startup.
I would have to EXPORT the routine I want to jump to as well as load the LR with the return value. Is there anything else that I am missing?
BTW: the processor is a Cortex M3 core.
Thanks.
What about $Super$$ ? The OP can override __main that way.
This seems to do what I want (albeit crude .asm code).
But a side effect is that when I do an SVC call I get a hard fault (still working on it - is probably related as I was not getting them before).
; Reset Handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT GoFlash LDR R0, =0x400FC180 ; load RSID LDR R0, [R0] ; load value at RSID TST R0,#0x02 ; Is W/D timeout? BNE __GoBoot ; No, skip next BL GoFlash ; Go Save Flash __GoBoot LDR LR, =0 ; Boot LDR R0, =__main BX R0 ENDP
Tamir, I need to look into this $Super$$ - what it is about.
See your linker and utilities guide, paragraph 4.5 ("Using $Super$$ and $Sub$$ to override symbol definitions").
My bad.
Same .asm code is used for both. Did open my damn eyes enough.
__asm void SVC_Handler(void) { IMPORT SVC_Handler_C TST lr, #4 MRSEQ r0, MSP MRSNE r0, PSP B SVC_Handler_C } __asm void HardFault_Handler(void) { IMPORT HardFault_Handler_C TST LR, #4 MRSEQ R0, MSP MRSNE R0, PSP B HardFault_Handler_C }
FYI: The above code seems to work fine - so far.