官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 18|回复: 0

在poll驱动章节使用select替代poll

[复制链接]

14

主题

24

帖子

250

积分

中级会员

Rank: 3Rank: 3

积分
250
发表于 2019-9-10 13:38:19 | 显示全部楼层 |阅读模式
注意:如果点击空白处无法输入,则点击字会有输入提示符 | 则可以使用键盘进行输入!
此板块为[第二期Linux驱动开发]
  • 问题所在章节:第009节_字符设备驱动程序之poll机制
  • 发生问题的运行环境:kernel-2.6.22.6
  • 问题发生描述:使用poll函数操作没有任何问题,但是在应用程序中使用select来替代poll按下按键后还是提示一直超时
# ./poll
key_val = 0x4
key_val = 0x84
time out
time out
key_val = 0x2
key_val = 0x82

# ./select

time out
time out

在使用select的时候会去调用sys_select 做完时间检测后调用core_sys_select拷贝完fds后调用do_select
select--应用
   sys_select    //超时时间检测
      core_sys_select   //拷贝fds到内核空间
         do_select
            poll_initwait   //设置回调函数__pollwait
            while(;;)
            mask = (*f_op->poll)(file, retval ? NULL : wait);   //这个应该就是调用file_operations的poll函数  但是我在驱动程序中添加了打印  如下
                                               //但程序并没有被调用  


static unsigned int button_poll(struct file *filp, struct poll_table_struct *wait)
{
        printk("poll\n");//打印测试是否被调用
        int mask = 0;
        poll_wait(filp, &button_waitq, wait);

        if(1 == button_wait_done)
        {
                mask |= POLLIN | POLLRDNORM;
        }
        return mask;
}





  • 替换的应用程序源码:
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <string.h>
  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>
  • #include <unistd.h>
  • #include <sys/time.h>       
  • /* forthdrvtest
  •   */
  • int main(int argc, char **argv)
  • {
  •         fd_set rfds;
  •         struct timeval tv;
  •         int fd;
  •         unsigned char key_val;
  •         int ret;
  •        
  •         fd = open("/dev/buttons", O_RDWR);
  •         if (fd < 0)
  •         {
  •                 printf("can't open!\n");
  •         }
  •         while (1)
  •         {
  •                 FD_ZERO(&rfds);
  •                  FD_SET(0, &rfds);
  •                 tv.tv_sec = 3;
  •                 tv.tv_usec = 0;
  •                 ret = select(fd+1,&rfds,NULL,NULL,&tv);
  •                 if (ret == 0)
  •                 {
  •                         printf("time out\n");
  •                 }
  •                 else
  •                 {
  •                         read(fd, &key_val, 1);
  •                         printf("key_val = 0x%x\n", key_val);
  •                 }
  •         }
  •        
  •         return 0;
  • }


回复

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2019-9-20 12:47 , Processed in 0.315348 second(s), 9 queries , File On.

Powered by Discuz! X3.3 Licensed

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表