嵌入式Linux poll()不断返回

时间:2013-04-20 09:20:14

标签: linux embedded-linux

我有一个特别的问题。当我知道没有什么可读的时候,民意调查会继续回归。

所以设置如下,我有2个文件描述符,它们构成了一个轮询监视的fd集的一部分。一种是针脚从高到低的变化(GPIO)。另一个是代理输入。代理输入出现问题。

处理顺序为:启动主要功能;然后会进行民意调查;将数据写入代理;民意调查将破裂;接受数据;通过SPI发送数据;接收从设备,想要发送确认的信号,通过将GPIO降低; Poll()感知到这种下降并做出反应; 无限的花粉:(

如果Poll功能没有超时,程序运行正常。我在民意调查中包含超时的那一刻。民意调查不断回归。不知道我在这里做错了什么。

     while(1)
         {
            memset((void*)fdset, 0, sizeof(fdset));
            fdset[0].fd = gpio_fd;
            fdset[0].events = POLLPRI; // POLLPRI - There is urgent data to read 

            fdset[1].fd = proxy_rx;
            fdset[1].events = POLLIN; // POLLIN   - There is data to read
            rc = poll(fdset, nfds, 1000);//POLL_TIMEOUT);

            if (rc < 0)     // Error
            {
                    printf("\npoll() failed/Interrupted!\n");
            }
            else if (rc == 0)       // Timeout occurred
            {
                  printf(" poll() timeout\n");
            }

            else {
                   if (fdset[1].revents & POLLIN)
                   {
                     printf("fdset[1].revents & POLLIN\n");
                    if( (resultR =read(fdset[1].fd,command_buf,10)<0) {                                   
                                    printf("Failed to read Data\n");

                            }
                    if (fdset[0].revents & POLLPRI)
                            //if( (gpio_fd != -1) && (FD_ISSET(gpio_fd, &err)))
                    {
                         lseek(fdset[0].fd, 0, SEEK_SET); // Read from the start of the file
                            len = read(fdset[0].fd, reader, 64);


                     }

这就是我的代码的要点,抱歉不好意思,这个界面让人习惯了。

我还使用了GDB,在调试时,我发现GPIO描述符设置为revents = 0x10,这意味着发生了错误并且POLPRI也发生了。

poll(2) doesn't empty the event queue 在上面的链接中,类似的内容得到了解决但是当我得到POLLIN时,我确实一直在阅读。这有点令人惊讶,这个问题只发生在我包含超时时,如果我用-1替换轮询超时,它可以完美地工作。

请帮助。

1 个答案:

答案 0 :(得分:0)

poll失败(返回-1)时,您应该使用errno执行某些操作,或许通过perror;并且您的nfdspoll的第二个参数)未设置,但它应该是常量2。

可能GCC编译器会发出警告,至少启用所有警告(-Wall),而nfds未设置。

(我猜测nfds未被初始化可能是一些“随机”的大值....因此内核可能正在轮询其他“随机”文件描述符,即{{1索引2之后......)

顺便说一下,你可以fdset你的节目。使用strace名称有点令人困惑(可以引用fdset)。