内核版本:Linux-4.5
在Linux驱动程序中,有时需要等待一个事件的完成,就需要用到completion机制,需要包含头文件<linux/completion.h>
completion类型定义如下:
例程如下(来自drivers/spi/spi-s3c24xx.c):
在Linux驱动程序中,有时需要等待一个事件的完成,就需要用到completion机制,需要包含头文件<linux/completion.h>
completion类型定义如下:
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
说明completion使用等待队列来实现的。
可以使用宏DECLARE_COMPLETION来静态定义并初始化一个completion。
如果要动态初始化一个completion,可以使用函数init_completion()来完成。
要等待一个事件的完成,可以使用wait_for_completion()、wait_for_completion_timeout()函数,例如:
wait_for_completion(&done);
调用了wait_for_completion相关函数之后,调用的线程将睡眠下去。如果要唤醒该线程,那么需要在其他线程中调用complete()、complete_all()。complete只唤醒一个线程,而complete_all则是唤醒所有的线程。
例程如下(来自drivers/spi/spi-s3c24xx.c):
static int s3c24xx_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
{
...
init_completion(&hw->done);
...
wait_for_completion(&hw->done);
}
staic irqreturn_t s3c24xx_spi_irq(int irq, void *dev)
{
...
complete(&hw->done);
...
irq_done:
return IRQ_HANDLED;
}