組み込み MIPS ベースのプラットフォーム用に、GPIO をポーリングする小さなプログラムを実装しています。つまり、チップ ベンダーのユーザー レベルの GPIO ライブラリを基本機能 (open /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) ;」を 1 つだけ実行するだけで同じ効果が得られます。それはカーネルの「自然な」動作でしょうか?
ありがとう。