2241969e5a
cpu0 thread0: cpu1: sched_yield() nxsched_set_priority() nxsched_running_setpriority() nxsched_reprioritize_rtr() nxsched_add_readytorun() up_cpu_pause() IRQ enter arm64_pause_handler() enter_critical_section() begin up_cpu_paused() pick thread0 arm64_restorestate() set thread0 tcb->xcp.regs to CURRENT_REGS up_switch_context() thread0 -> thread1 arm64_syscall() case SYS_switch_context change thread0 tcb->xcp.regs restore_critical_section() enter_critical_section() done leave_critical_section() IRQ leave with restore CURRENT_REGS ERROR !!! Reason: As descript above, cpu0 swith task: thread0 -> thread1, and the syscall() execute slowly, this time cpu1 pick thread0 to run at up_cpu_paused(). Then cpu0 syscall execute, cpu1 IRQ leave error. Resolve: Move arm64_restorestate() after enter_critical_section() done This is a continued fix with: https://github.com/apache/nuttx/pull/6833 Signed-off-by: ligd <liguiding1@xiaomi.com> |
||
---|---|---|
.. | ||
CMakeLists.txt | ||
Make.defs | ||
irq.h | ||
irq_attach.c | ||
irq_chain.c | ||
irq_csection.c | ||
irq_dispatch.c | ||
irq_foreach.c | ||
irq_initialize.c | ||
irq_procfs.c | ||
irq_spinlock.c | ||
irq_unexpectedisr.c |