对于基于 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) ; " 具有相同的效果。它可以是内核的“自然”行为吗?
谢谢。