核心问题在于,在enter_critical_section函数的实现上,Nuttx存在打脸行为,具体点说,就是SMP版本的enter_critical_section和UP(单核)版本的enter_critical_section语义不一致。
UP版本的enter_critical_section实现:
单核版本的enter_critical_section实现符合经典的RTOS实现策略,就是关闭中断,在单核系统中,中断一关闭代表所有的异步执行流都被控制住了,后面的执行流就可以完全被软件控制了,也就是everything is in the control.,RTT, Zephyr,UCOS等系统都是这么干的,没什么问题。
但是在来看看奇葩的SMP版的实现: