私はgpio割り込みを扱っています。「/sys/class/gpio/gpio38/value」にファイルがあります。属性値が変更されるたびに通知が必要です。では、ユーザー空間でこれをどのように達成できますか。すでに情報を収集しているので、select()、poll()、または epoll() を使用できます。では、このアプリケーションに適しているのはどれですか? または、/proc/irq などを使用できるかどうか教えてください。ありがとう :)
2 に答える
ここで役立つものを見つけました:
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」用と書いてありますが、あなたのケースに当てはまるのではないかと思います。そうでない場合は、私の回答にコメントしてください。
あなたはそれらのどれでも使うことができます。ここでのポイントは、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
}