是否有一种直接的机制来识别给定函数是在中断上下文中调用还是从进程上下文中调用。这是问题的第一部分。第二部分是:如何同步 2 个进程,一个在中断上下文中,另一个在进程上下文中。如果我的理解是正确的,我们不能在中断上下文中对进程使用互斥锁,因为它不允许休眠。另一方面,如果我使用自旋锁,另一个进程将使用 CPU 周期。同步这两个进程的最佳方法是什么。如果我的理解完全错误,请纠正我。
您可以使用 in_irq() 函数判断函数是否作为 IRQ 处理程序运行。但我不认为使用它是一个很好的做法。您应该仅从代码中看到函数在哪个上下文中运行。否则我会说你的代码设计不好。
至于同步机制——你是对的,你必须使用自旋锁,因为你需要在原子上下文中进行同步(例如中断)——并不是说你在这里有很多选择。您也说得对,等待旋转锁时会浪费很多 CPU 周期,因此您应该尝试尽量减少锁定下的代码量。
补充 Sam 的答案 - 您应该设计具有下半部分和上半部分的中断处理程序。这使您可以在中断处理程序中具有最少的代码(上半部分)(在驱动程序中请求 irq 时注册),其余代码(下半部分)可以使用工作队列进行计划。您可以将上半部分(您只是处理中断并从设备执行一些最小的红色/写入)置于由自旋锁保护的原子上下文中,这样等待自旋锁浪费的 CPU 周期数更少。