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
  • Then I rebuild the program and in the PendSV exception handler I PUSH {R0, LR} then call a function which also enters a while (true) loop. And the stack looks like this:

    0x2000fe88: 0x2000feb8  0x0002e10d  0x00000038  0xfffffff9
    0x2000fe98: 0x20007899  0x00000000  0x00000000  0x20007899
    0x2000fea8: 0x000007ff  0x000266bf  0x00026404  0x21000000
    0x2000feb8: 0x00000000  0x20007b40  0x00000000  0x00000000
    0x2000fec8: 0x20007bbc  0x0000eb04  0x00000001  0x00000000
    0x2000fed8: 0x0000eb04  0x00000001  0x20007b98  0x20007c3c
    0x2000fee8: 0x2000ff08  0x00024b0d  0x20007b98  0x00000000
    0x2000fef8: 0x20007898  0x20007899  0x00000001  0x00000002
    

    Now those two words at the top of the previous stack have been replaced by four words - 2 from the PendSV handler and 2 from my C function.

Reply
  • Then I rebuild the program and in the PendSV exception handler I PUSH {R0, LR} then call a function which also enters a while (true) loop. And the stack looks like this:

    0x2000fe88: 0x2000feb8  0x0002e10d  0x00000038  0xfffffff9
    0x2000fe98: 0x20007899  0x00000000  0x00000000  0x20007899
    0x2000fea8: 0x000007ff  0x000266bf  0x00026404  0x21000000
    0x2000feb8: 0x00000000  0x20007b40  0x00000000  0x00000000
    0x2000fec8: 0x20007bbc  0x0000eb04  0x00000001  0x00000000
    0x2000fed8: 0x0000eb04  0x00000001  0x20007b98  0x20007c3c
    0x2000fee8: 0x2000ff08  0x00024b0d  0x20007b98  0x00000000
    0x2000fef8: 0x20007898  0x20007899  0x00000001  0x00000002
    

    Now those two words at the top of the previous stack have been replaced by four words - 2 from the PendSV handler and 2 from my C function.

Children
No Data
Related