在驱动入门实验班的课程里讲到了APP使用驱动程序的四种方式。分别是:阻塞、非阻塞、poll、异步通知。
本文是在前面所描述的概念之上,对驱动程序交互流程的解读。
1. 非阻塞
应用程序 open 时,传入O_NONBLOCK 标记位

对于 if 判断只需要使用is_key_buf_empty()判断环形缓冲区是否有数据
- 无数据,
is_key_buf_empty()为真,立即返回-EAGAIN - 有数据,
wait_event_interruptible()函数就不起作用,直接从缓冲区里拷贝数据,然后返回
注意:非阻塞起作用的前提是驱动程序“尊重O_NONBLOCK 标记位。
2. 阻塞
应用程序 open 时,不带 O_NONBLOCK 标记位

对于 if 判断,直接失效。因为(file->f_flags & O_NONBLOCK)为假
当没有数据时,调用 wait_event_interruptible()函数,进入等待,直到条件!is_key_buf_empty()为真!等待时:
- 改变程序状态,休眠的程序不参与调度;
- 把自己记录在 gpio_wait 里,gpio_wait 是等待队列头;
#define wait_event_interruptible(wq_head, condition) \
({

最低0.47元/天 解锁文章
1649

被折叠的 条评论
为什么被折叠?



