Using what I think is the proper Seeed bootloader/SoftDevice image:
A couple of assumptions about the image content, that appear to be correct:
0x1000 is the address of the SoftDevice interrupt vector table
0xF4000 is the address of the BootLoader interrupt vector table
As I’ve come to understand this, the address of the first level interrupt vector table used when processing an SVC instruction is located at address 0x2000 0000.
At program load time (using Ozone), normal code, I see the vector table address at 0x2000 0000 is 0xF4000. the bootloader vector table. ( The Nordic image has an address of 0x1000, SD address space).
If I manually reset the vector table address within main() to the location of the SoftDevice vector table (rather than BootLoader) via:
main ()
{
#define MYBOOTLDR (*((volatile unsigned long *) 0x20000000))
MYBOOTLDR = 0x1000;
...
}
Then we do return as expected and proceed to execute the first task.
It seems to me that the bootloader SVC_Handler() is not properly handling an SVC of 0. It’s not clear to me what is currently happening. It would seem the handler should forward execution to perhaps the SoftDevice SVC_Handler, which might then forward to the app level SVC_Handler if the SVC is not targeting Bootloader or SD.
But then again, this is not real clear to me.
Looking at the source for this bootloader might help.