Linux驱动程序上下文中的微秒延迟和自旋锁

Linux驱动程序上下文中的微秒延迟和自旋锁,linux,driver,mutex,spinlock,Linux,Driver,Mutex,Spinlock,我有一个关于驱动程序上下文中的自旋锁和延迟的一般性问题。我有一个在gpio中读写的Linux驱动程序。读写操作在单个管脚中完成,完全基于时间(HDQ协议)。最初的驱动程序是使用udelay()调用实现的,最糟糕的情况是大约500us。 驱动程序不执行任何中断操作,只使用常规的GPIO_get_value()和GPIO_set_value()在特定GPIO中进行常规读写操作。 在这些延迟之间,驱动程序包含自旋锁。这有多安全?我有点担心自旋锁带来的延迟。udelay可以安全地用于原子部分(即自旋锁或

我有一个关于驱动程序上下文中的自旋锁和延迟的一般性问题。我有一个在gpio中读写的Linux驱动程序。读写操作在单个管脚中完成,完全基于时间(HDQ协议)。最初的驱动程序是使用udelay()调用实现的,最糟糕的情况是大约500us。 驱动程序不执行任何中断操作,只使用常规的GPIO_get_value()GPIO_set_value()在特定GPIO中进行常规读写操作。
在这些延迟之间,驱动程序包含自旋锁。这有多安全?我有点担心自旋锁带来的延迟。

udelay
可以安全地用于原子部分(即自旋锁或中断)。看看所有的细节


您可能会担心性能,因为
udelay
正忙着等待。然而,当使用可调度睡眠时,很难确保满足时间要求,因为它们不精确。在大多数处理器上,
usleep
应该足够精确,但它不如
udelay
那么确定。此外,在调用
usleep
时不能保持自旋锁,因此必须使用不同的同步机制。

udelay
可以安全地用于原子部分(即自旋锁或中断)。看看所有的细节

您可能会担心性能,因为
udelay
正忙着等待。然而,当使用可调度睡眠时,很难确保满足时间要求,因为它们不精确。在大多数处理器上,
usleep
应该足够精确,但它不如
udelay
那么确定。此外,您在调用
usleep
时无法保持自旋锁,因此必须使用不同的同步机制