0

組み込み 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 つだけ実行するだけで同じ効果が得られます。それはカーネルの「自然な」動作でしょうか?

ありがとう。

4

1 に答える 1

1

selectファイル記述子が読み取り可能になるまで、呼び出しはブロックされます。

発生している可能性があるのは、デバイス ドライバーがselect呼び出しをサポートしていないため、ブロックするのではなく、すぐに終了することです。

もう 1 つの可能性は、 への呼び出しがgpio_open実際には実際の Unix ファイル記述子を提供しないことです。もしそうなら、open("/dev/gpio", O_RDWR)私はそれをもっと信じていたでしょう。

于 2010-08-31T03:52:06.493 に答える