Awake a task from a non-maskable interrupt

genarisimo23 wrote on Tuesday, November 19, 2013:


I’m using a non maskable interrupts which priority is above configMAX_SYSCALL_INTERRUPT_PRIORITY parameter, since interrupt source can’t be delayed by the kernel itself. My question is, how can awake or signal a task from a non maskable interrupt? I know that i can’t use any Kernel API.

Thanks in advance

rtel wrote on Tuesday, November 19, 2013:

You cannot do it safely by using any kernel mechanism, in case a lower priority interrupt or a task was already manipulating the kernel data structures.

You don’t say which architecture you are using so I can’t give any definitive suggestions, but it may be possible to pend a lower priority interrupt that is at or below configMAX_SYSCALL_INTERRUPT_PRIORITY, then perform the wake operation from there. The lower priority interrupt should execute after the NMI, before any task level code executes.


genarisimo23 wrote on Tuesday, November 19, 2013:

Thanks for your info Richard, i’m using Kinetis K20 based on Cortex-M4 architecture. The NMI interrupt is from a Timer and has “0” priority. How can i pend interrupt from Timer’s ISR? This new interrupt is a software interrupt or from another peripheral?


edwards3 wrote on Tuesday, November 19, 2013:

All interrupts on Cortex chips can be pended in software. Look up the NVIC hardware manual on the ARM website. It is probably included in the Cortex M3 documentation. You are looking for a Set Pend register, and just need to set a bit in the register then write a handler for the interrupt. There is bound to be lots of interrupts you dont need and can use for this purpose.

genarisimo23 wrote on Tuesday, November 19, 2013:

Lot of thanks MEdwards i’ll take a look at Cortex M3 users manual.