我有一个关于螺旋锁和驱动程序上下文延迟的一般问题。我有一个可以在gpio中读写的Linux驱动程序。读写操作在一个引脚内完成,完全基于时序( HDQ协议)。原始驱动程序使用udelay()调用实现,最糟糕的情况是 500 us 。 驱动程序不使用常规 gpio_get_value()和 gpio_set_value()在特定GPIO中实现任何中断,定期读取和写入。 在这些延迟之间,驱动程序包含自旋锁。这有多安全?我有点担心自旋锁所包含的这些延迟。
答案 0 :(得分:2)
udelay
可以安全地用于原子部分(即在自旋锁或中断内)。查看the kernel timers howto了解所有细节。
你可能会担心性能,因为udelay
正忙着等待。但是,当使用可调度睡眠时,很难确保满足时序要求,因为它们不精确。在大多数处理器上,usleep
应该足够准确,但不如udelay
更确定。此外,在调用usleep
时,您无法保持自旋锁,因此必须使用不同的同步机制。