The difference between __irq_disable() and irq_lock() is that the former essentially translates to `cpsid i`, whereas `irq_lock()` translates to setting BASEPRI (on cores with BASEPRI). This means that using irq_lock() does not disable zero-latency interrupts (ZLIs), which reduces the potential execution latency of ZLIs. In both isr_wrapper and _arch_isr_direct_pm() (which is just really an implementation of ISR_DIRECT_PM()), we were using __irq_disable() to disable all interrups, including ZLIs. But the code executed with interrupts disabled handles waking up from idle, and so must only be protected against regular interrupts being executed, not ZLIs, which should have no effect on the correct execution of the code. Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no> |
||
|---|---|---|
| .. | ||
| cortex_a_r | ||
| cortex_m | ||
| mmu | ||
| mpu | ||
| offsets | ||
| __aeabi_atexit.c | ||
| CMakeLists.txt | ||
| elf.c | ||
| fatal.c | ||
| gdbstub.c | ||
| header.S | ||
| irq_offload.c | ||
| Kconfig | ||
| Kconfig.vfp | ||
| nmi_on_reset.S | ||
| nmi.c | ||
| swi_tables.ld | ||
| tls.c | ||
| userspace.S | ||
| vector_table.ld | ||
| zimage_header.ld | ||