0

我在 Raspberry pi 上使用带有 Raspian 的 python。我连接了一个外围设备,导致我的中断处理程序函数运行。有时,当对第一个中断的响应尚未完成时,会触发中断。所以我添加了一个变量,在进入中断函数时设置,退出时重置,如果在进入函数时发现锁被设置,它会立即退出。

有没有更标准的方式来处理这种事情。

def IrqHandler(self, channel):
    if self.lockout: return
    self.lockout = True;
    # do stuff
    self.lockout = False;
4

2 回答 2

2

IrqHandler如果两次调用足够接近,则您有竞争条件,两个调用都可以看到self.lockout并且False都继续将其设置为True等。

threading模块有一个Lock()对象。通常(默认)这用于阻塞线程直到锁被释放。这意味着所有中断都将排队并轮流运行处理程序。

您还可以创建一个如果已获得锁Lock(False)则将返回的。False这与您在这里的使用很接近

from threading import Lock

def __init__(self):
    self.irq_lock = Lock(False)

def IrqHandler(self, channel):
    if not self.irq_lock.acquire():
        return
    # do stuff
    self.irq_local.release()
于 2013-09-24T18:02:58.017 回答
0

您可以将其与博格模式联系起来。这样,您可以让多个中断实例关注一个状态。还有一个叫做单例,但这里是关于这两个的讨论。 为什么 Borg 模式比 Python 中的 Singleton 模式更好

于 2013-09-24T18:00:56.933 回答