Linux Completion

内核版本:Linux-4.5

在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>