This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

NVIC does not tail-chain to PendSV ISR

I'm trying to implement context switching from handler mode to thread mode using PendSV. I set the PendSV pending bit inside an ISR with SCB->ICSR = SCB->ICSR | SCB_ICSR_PENDSVSET_Msk. After setting the PendSV pending bit, I can see that the PendSV exception is pending: SCB->ICSR = 0x10000813 (I think the ISRPREEMPT bit should be set as well but it's not).

NVIC should tail-chain to my PendSV handler before unstacking. Instead ISR unstacking occurs, a return to exception is executed, and a few thread-level instructions are executed, before the PendSV handler is called.

The SoftDevice is present but has not been enabled.

Any ideas on what might be causing this? Thanks.

Parents
  • I think you're right. I placed a while (true) continue in the first exception handler and this is what the stack looks like:

    0x2000fe90: 0x2000feb8  0xfffffff9  0x20007899  0x00000000
    0x2000fea0: 0x00000000  0x20007899  0x000007ff  0x000266bf
    0x2000feb0: 0x00026404  0x21000000  0x00000000  0x20007b40
    0x2000fec0: 0x00000000  0x00000000  0x20007bbc  0x0000eb04
    0x2000fed0: 0x00000001  0x00000000  0x0000eb04  0x00000001
    0x2000fee0: 0x20007b98  0x20007c3c  0x2000ff08  0x00024b0d
    0x2000fef0: 0x20007b98  0x00000000  0x20007898  0x20007899
    0x2000ff00: 0x00000001  0x00000002  0x00000000  0x20007798
    

    The two words at the top of the stack were pushed by the exception handler.

Reply
  • I think you're right. I placed a while (true) continue in the first exception handler and this is what the stack looks like:

    0x2000fe90: 0x2000feb8  0xfffffff9  0x20007899  0x00000000
    0x2000fea0: 0x00000000  0x20007899  0x000007ff  0x000266bf
    0x2000feb0: 0x00026404  0x21000000  0x00000000  0x20007b40
    0x2000fec0: 0x00000000  0x00000000  0x20007bbc  0x0000eb04
    0x2000fed0: 0x00000001  0x00000000  0x0000eb04  0x00000001
    0x2000fee0: 0x20007b98  0x20007c3c  0x2000ff08  0x00024b0d
    0x2000fef0: 0x20007b98  0x00000000  0x20007898  0x20007899
    0x2000ff00: 0x00000001  0x00000002  0x00000000  0x20007798
    

    The two words at the top of the stack were pushed by the exception handler.

Children
No Data
Related