8

私はgpio割り込みを扱っています。「/sys/class/gpio/gpio38/value」にファイルがあります。属性値が変更されるたびに通知が必要です。では、ユーザー空間でこれをどのように達成できますか。すでに情報を収集しているので、select()、poll()、または epoll() を使用できます。では、このアプリケーションに適しているのはどれですか? または、/proc/irq などを使用できるかどうか教えてください。ありがとう :)

4

2 に答える 2

3

ここで役立つものを見つけました:

GPIO 信号には /sys/class/gpio/gpio42/ (GPIO #42 用) のようなパスがあり、次の読み取り/書き込み属性があります。

「値」 ... 0 (低) または 1 (高) として読み取ります。GPIO が出力として設定されている場合、この値を書き込むことができます。ゼロ以外の値は高値として扱われます。

ピンが割り込みを生成する割り込みとして構成でき、割り込みを生成するように構成されている場合 (「エッジ」の説明を参照)、そのファイルで poll(2) を実行すると、割り込みが発生するたびに poll(2) が返されます。引き金になった。poll(2) を使用する場合は、イベント POLLPRI および POLLERR を設定します。select(2) を使用する場合は、exceptfds にファイル記述子を設定します。poll(2) が戻った後、lseek(2) で sysfs ファイルの先頭に移動して新しい値を読み取るか、ファイルを閉じて再度開いて値を読み取ります。

「gpio42」用と書いてありますが、あなたのケースに当てはまるのではないかと思います。そうでない場合は、私の回答にコメントしてください。

于 2012-09-22T08:05:40.087 に答える
1

あなたはそれらのどれでも使うことができます。ここでのポイントは、GPIOラインの値のsysfsファイルを開くことです(たとえば/sys/class/gpio/gpio42/value、それをブロックします。

ライン状態の変化は、書き込みではなく例外条件として通知されます(直感的かもしれません)。

選択の場合:

fd_set exceptfds;
int    res;    

FD_ZERO(&exceptfds);
FD_SET(gpioFileDesc, &exceptfds);

res = select(gpioFileDesc+1, 
             NULL,               // readfds - not needed
             NULL,               // writefds - not needed
             &exceptfds,
             NULL);              // timeout (never)

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds))
{
     // GPIO line changed
}
于 2012-09-23T19:07:52.830 に答える