0

对于基于 MIPS 的嵌入式平台,我正在实现一个小程序来轮询 GPIO,即我正在使用具有基本功能(打开/dev/gpio、读取、写入引脚等)的芯片供应商的用户级 GPIO 库。设计很简单:

int gpio_fd;
fd_set rfds;

gpio_fd = gpio_open(...);

while (1) {
    FD_ZERO(&rfds);
    FD_SET(gpio_fd, &rfds);

    if (select(gpio_fd + 1, &rfds, NULL, NULL, NULL) > 0) {
        if (FD_ISSET(gpio_fd, &rfds)) {
            /* read pins and similar */
        }
    }
}

但是我遇到了一个严重的问题——这个应用程序在最后以“&”运行时,即把它放在后台,消耗 99% 的 CPU,这显然是因为紧密的循环,但我在许多网络代码中观察到类似的方法它工作得很好。

我是否遗漏了什么,这可能是 gpio 库的缺陷吗?

实际上,只有一个 "while(1) ; " 具有相同的效果。它可以是内核的“自然”行为吗?

谢谢。

4

1 回答 1

1

调用应该阻塞,select直到文件描述符可读。

可能发生的情况是设备驱动程序不支持select调用,因此它立即退出而不是阻塞。

另一种可能性是调用gpio_open实际上并没有给你一个真正的 Unix 文件描述符。如果是这样open("/dev/gpio", O_RDWR)或类似的东西,我会对它更有信心。

于 2010-08-31T03:52:06.493 回答