[英]Prevent interrupt routine running multiple instances
我在Raspberry pi上使用帶有Raspian的python。 我有一個外設附加,導致我的中斷處理函數運行。 有時,當第一個中斷的響應尚未完成時,中斷會被觸發。 所以我添加了一個變量,該變量在輸入中斷函數時設置並在退出時復位,如果在進入函數時,它發現鎖定已設置,它將立即退出。
是否有更標准的方式來處理這類事情。
def IrqHandler(self, channel):
if self.lockout: return
self.lockout = True;
# do stuff
self.lockout = False;
如果IrqHandler
被調用兩次足夠靠近,你有一個競爭條件,兩個調用都可以看到self.lockout
為False
並且兩者都繼續設置為True
等。
threading
模塊有一個Lock()
對象。 通常(默認值),這用於阻止線程,直到鎖被釋放。 這意味着所有中斷都將排隊並輪流運行Handler。
您還可以創建一個Lock(False)
,如果已獲取Lock,它將返回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()
你可以用borg模式綁定它。 這樣你可以有幾個中斷實例關注一個狀態。 還有一個叫做單身人士,但這里是對這兩個人的討論。 為什么Borg模式比Python中的Singleton模式更好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.