2016-10-03 18 views
0

我对驱动程序环境中的自旋锁和延迟有一个普遍问题。我有一个可以在gpio中读写的Linux驱动程序。读写操作在单个引脚上完成,并且完全基于时序(HDQ协议)。最初的驱动程序是使用udelay()调用实现的,最糟糕的场景是大约500 us。 驱动程序没有实现任何中断,只是在使用常规gpio_get_value()gpio_set_value()的特定GPIO中进行定期读写。 在这些延迟之间,驱动程序包含自旋锁。这有多安全?我对自旋锁所包含的这些延迟有点担忧。在Linux驱动程序环境中的微秒延迟和螺旋锁

回答

2

udelay可以安全地用于原子段(即在自旋锁或中断内)。所有的细节请看the kernel timers howto

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