INVPC occurs when SVC Handler returns
I use STM32F1 Value Line Discovery Kit.
I want to write SVC handler.
If I implement the following, invpc occurs when running 「POP PC�?in Line 38.
Caller
--------------------------------
__asm volatile(" SVC %0 \n" : : "I" (2));
__asm volatile(" NOP \n");
--------------------------------
Callee
--------------------------------
void SVC_Handler(void)
{
__asm volatile(" TST LR, #0x4 \n"); /* Test EXC_RETURN number in LR bit 2 */
__asm volatile(" ITE EQ \n"); /* if zero (equal) then */
__asm volatile(" MRSEQ R1, MSP \n"); /* Main Stack was used, put MSP in R0 */
__asm volatile(" MRSNE R1, PSP \n"); /* else, Process Stack was used, put MSP in R0 */
__asm volatile(" LDR R0, [R1, #0] \n"); /* Get stacked R0 from stack */
__asm volatile(" LDR R1, [R1, #24] \n"); /* Get stacked PC from stack */
__asm volatile(" LDRB R1, [R1, #-2] \n"); /* Get the immidiate data from the instruction */
__asm volatile(" PUSH {R7} \n");
__asm volatile(" CBNZ R1, svc_handler_1 \n");
__asm volatile(" BL tmp \n");
__asm volatile(" B svc_handler_end \n");
__asm volatile("svc_handler_1: \n");
__asm volatile(" CMP R1, #1 \n");
__asm volatile(" BNE svc_handler_2 \n");
__asm volatile(" BL tmp \n");
__asm volatile(" B svc_handler_end \n");
__asm volatile("svc_handler_2: \n");
__asm volatile(" CMP R1, #2 \n");
__asm volatile(" BNE svc_handler_3 \n");
__asm volatile(" BL tmp \n");
__asm volatile(" B svc_handler_end \n");
__asm volatile("svc_handler_3: \n");
__asm volatile(" CMP R1, #3 \n");
__asm volatile(" BNE svc_handler_end \n");
__asm volatile(" BL tmp \n");
__asm volatile(" B svc_handler_end \n");
__asm volatile("svc_handler_end: \n");
__asm volatile(" POP PC \n");
}
void tmp(void)
{
}
--------------------------------Could you please tell me the solution?
