Cの基本的なGPIOプログラミングに慣れるために、この例を実装しました。このコードは、GPIOピンへの書き込み方法を示していますが、ピンの状態の読み取り方法を明示的に示していません。私はと思われるWiringPiは私がしたいと思うので、最終的にはよりよい解決策になり、出力端子の状態を読み、最終的に、しかし一方で、私はドムとゲルトのコードを私のトレッキングを完了したいと思います。それでは、ピンの値をどのように読み取ることができますか?
Cの基本的なGPIOプログラミングに慣れるために、この例を実装しました。このコードは、GPIOピンへの書き込み方法を示していますが、ピンの状態の読み取り方法を明示的に示していません。私はと思われるWiringPiは私がしたいと思うので、最終的にはよりよい解決策になり、出力端子の状態を読み、最終的に、しかし一方で、私はドムとゲルトのコードを私のトレッキングを完了したいと思います。それでは、ピンの値をどのように読み取ることができますか?
回答:
elinuxの例では、メモリマップされたIOを使用しています。カーネルも介してユーザスペースインタフェースエクスポートし/sys/class/gpio
、1もelinuxに文書を。Cでの作業では、明らかにの代わりにread()
/ を使用します。高レベルのストリームベースの関数を使用しないでください。write()
echo
一部のプログラマーは、システムコールで実行する必要があると信じていることにファイルインターフェイスを使用するように指示されたときに、少し動揺します。 これは純粋にスタイルの問題です。 つまり、まったく同じものです。「追加のI / Oオーバーヘッド」などはありません。この場合、ファイルは実際のファイルではなく、カーネルインターフェイスであるため、ファイルにアクセスします。 これまでに使用した他のシステムABIとまったく同じですが、違いがあります。/proc
と/sys
ノードの使用はカーネル開発者に長い間好まれてきましたが、はっきりsysfs()
とman 2 sysfs
言っている事実にもかかわらず、たとえば、システムコールをできる限り使用することを決心している人々を見ています。
このSystem-V派生のシステムコールは廃止されました。使用しないでください。 / procを備えたシステムでは、同じ情報を/ proc / filesystemsから取得できます。代わりにそのインターフェースを使用してください。
これは、/proc
インターフェイスを使用するように指示するCライブラリのmanページです。それがあなたを納得させるのに十分でないなら、何もありません。 /sys
同じようなものです 要点:C固有のAPIの代わりにファイルノードを使用しているからといって、実際のプログラミングが行われていない、またはパフォーマンスが低下するなどの理由ではありません。一部の人々は、それが実際に優れた機能であると言うかもしれません。これは、OSカーネルを作成した人々が推奨する方法でもあります。
GPIOインターフェイスの簡単な紹介は、次の場所にあります[kernel-src]/Documentation/ABI/testing/sysfs-gpio
。
GPIOs are only made available to userspace by an explicit
"export" operation. If a given GPIO is not claimed for use by
kernel code, it may be exported by userspace (and unexported later).
Kernel code may export it for complete or partial access.
GPIOs are identified as they are inside the kernel, using integers in
the range 0..INT_MAX. See Documentation/gpio.txt for more information.
/sys/class/gpio
/export ... asks the kernel to export a GPIO to userspace
/unexport ... to return a GPIO to the kernel
/gpioN ... for each exported GPIO #N
/value ... always readable, writes fail for input GPIOs
/direction ... r/w as: in, out (default low); write: high, low
/edge ... r/w as: none, falling, rising, both
/gpiochipN ... for each gpiochip; #N is its first GPIO
/base ... (r/o) same as N
/label ... (r/o) descriptive, not necessarily unique
/ngpio ... (r/o) number of GPIOs; numbered N to N + (ngpio - 1)
elinuxだけでなく、さまざまなチュートリアルなどがオンラインであるようです。私はI2Cのみを使用してきました。それ以外の場合は、より直接的な答えを示します。
GPIOにアクセスするカーネルスペースコードの記述に興味がある場合は、こちらをご覧ください。ただし、特定のデバイス用のドライバーを記述し、独自のユーザースペースAPIを作成する場合にのみ役立ちます。
1. memマップされたIOも読み取り/書き込みを使用する必要があるため、ここで1つの方法が他の方法よりも優れているかどうかはわかりません。/sys
ラズベリーpi以外のもので実行されるコードを探している場合は、インターフェイスを使用すると移植性が向上します。
read()
/ write()
および関連するファイル記述子(ファイルストリームではなく)ベースの関数は、実際には標準Cではありませんが、POSIXおよびLinuxの標準です。ここに紹介があります:gnu.org/software/libc/manual/html_node/… 標準のファイルストリームは機能する可能性がありますが、私の経験では、WRT /sys
およびへのWRTにも問題がありました/proc
。とにかく、低レベルの記述子を使用することは、不便でも困難でもありません。幸運を!