对于嵌入式MIPS平台我正在实现一个小程序来轮询GPIO,即我正在使用具有基本功能的芯片供应商的用户级GPIO库(打开/ dev / 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);”也会产生同样的效果。它可以是内核的“自然”行为吗?
感谢。
答案 0 :(得分:1)
select
调用应该阻塞,直到文件描述符可读。
可能发生的情况是设备驱动程序不支持select
调用,因此它会立即退出而不是阻止。
另一种可能性是对gpio_open
的调用实际上并没有给你一个真正的Unix文件描述符。如果那是open("/dev/gpio", O_RDWR)
或类似的东西,我会更加相信它。