Cを使用したGPIO状態の読み取り


8

Cの基本的なGPIOプログラミングに慣れるために、この例を実装しました。このコードは、GPIOピンへの書き込み方法を示していますが、ピンの状態の読み取り方法を明示的に示していません。私はと思われるWiringPiは私がしたいと思うので、最終的にはよりよい解決策になり、出力端子の状態を読み、最終的に、しかし一方で、私はドムとゲルトのコードを私のトレッキングを完了したいと思います。それでは、ピンの値をどのように読み取ることができますか?


反対票を説明しますか?
bobthechemist 2013年

2
反対票はばかげています、おそらくあなたはある時点で誰かを怒らせました。埋め合わせるために私から+1してください。
ゴルディロックス

回答:


6

elinuxの例では、メモリマップされたIOを使用しています。カーネルも介してユーザスペースインタフェースエクスポートし/sys/class/gpio1elinuxに文書を。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以外のもので実行されるコードを探している場合は、インターフェイスを使用すると移植性が向上します。


ありがとう。私の言語の行き方はMathematicaだったので、それがRPiに移植されたとき、私は飛びつきました。現在のところ、Wolframのネイティブコマンドを介したGPIOアクセスは少し遅いので、問題が起こらないように十分なcを学習しようとしています。(
つまり

read()/ write()および関連するファイル記述子ファイルストリームではなく)ベースの関数は、実際には標準Cではありませんが、POSIXおよびLinuxの標準です。ここに紹介があります:gnu.org/software/libc/manual/html_node/… 標準のファイルストリームは機能する可能性がありますが、私の経験では、WRT /sysおよびへのWRTにも問題がありました/proc。とにかく、低レベルの記述子を使用することは、不便でも困難でもありません。幸運を!
ゴルディロックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.