Chinaunix首页 | 论坛 | 博客
  • 博客访问: 466943
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-21 09:30
文章分类

全部博文(100)

文章存档

2017年(1)

2016年(16)

2015年(83)

我的朋友

分类: 嵌入式

2015-07-04 02:14:07

第4个驱动中采用了poll机制。我们希望如果没有按键按下,5秒后也能有返回值,提示超时。,这是可以采用poll机制。
当app执行后,先执行poll函数,5秒内有按键按下,poll函数返回非0值,此时可以立即读取按键值;poll返回值为0,则没有按键按下,打印超时信息。
poll机制和等待队列是独立的,也可以完成app的休眠。poll和select是一样的机制。
poll机制的作用是可以在没有按键按下时,不去执行读操作;当驱动中检测到按键数据时,poll函数立即返回非0值,此时app根据返回值,认为可以执行读操作。
简而言之,poll可以避免在无按键按下时,read函数一直无返回值。poll可以给app指定超时时间。
看应用程序的代码就明白了:

点击(此处)折叠或打开

  1. int main(int argc, char **argv)
  2. {
  3.     int fd;
  4.     unsigned char key_val;
  5.     int ret;

  6.     struct pollfd fds[1];
  7.     
  8.     fd = open("/dev/buttons", O_RDWR);
  9.     if (fd < 0)
  10.     {
  11.         printf("can't open!\n");
  12.     }

  13.     fds[0].fd = fd;
  14.     fds[0].events = POLLIN;
  15.     while (1)
  16.     {
  17.         ret = poll(fds, 1, 5000);//进入poll函数,在驱动代码中,poll函数会判断是否有按键按下,如果5s内没有按键,则函数返回0
  18.         if (ret == 0)
  19.         {
  20.             printf("time out\n");//提示超时,继续while死循环
  21.         }
  22.         else//返回值为非0则打印按键值
  23.         {
  24.             read(fd, &key_val, 1);
  25.             printf("key_val = 0x%x\n", key_val);
  26.         }
  27.     }
  28.     
  29.     return 0;
  30. }
之前一直误解了poll机制,以为poll和等待队列不能同时工作,实际上,应用程序是先执行poll函数,根据返回值判断是否可读,如果过了超时时间还没有按键数据,则返回“超时”;如果有按键按下,则立即返回“可读”。韦东山老师说,过了超时时间没有按键值就会进入休眠,还没完全理解。
poll机制是在非阻塞访问中使用的。
非阻塞其实只是在应用程序的open函数指定打开方式(O_NONBLOCK),在驱动代码中需要对打开方式进行判断,然后针对非阻塞执行poll或者等待队列。

阅读(1122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~