問題タブ [gpio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - GPIO LED を制御するための C プログラミング
ソフトウェアが内部で正常に動作していることを示すために、GPIO に接続された LED をオンにする必要があるハードウェアがあります (ハードウェアの仕様を見ると、GPIO BCBUSB0 は LED に接続されています)。何らかの理由でソフトウェアが実行されていない場合は、LED がオフになるか赤くなります。
さて、ソフトウェアが実行されている状態を示すために、定期的に Led に信号を送信するウォッチドッグまたは何かを設定する必要があると考えました。何らかの理由で LED が特定の間隔で信号を受信しない場合は、オフにする必要があります。
私は C 言語を使用することに非常に慣れていますが、GPIO をプログラミングして LED をオン/オフする方法についてはまったく知りません。アドバイスや提案は非常に役立ちます。
ありがとう
c - CPUを壊すことなくソフトウェアPWM?
これは学術的な質問ですが (必ずしもそうするつもりはありません)、どのように機能するのか興味があります。私はユーザーランド ソフトウェア (ハードウェアではなく) ソリューションを考えています。
PWM 信号を生成したい (デジタル GPIO ピンの数が少ないが、1 つ以上の場合としましょう)。私はおそらく、Pthread を作成するプログラムを作成し、sleep()
そのスレッドで適切な s などを使用してデューティ サイクルを無限にループして、比率を正しくするでしょう。
これは CPU をひどく壊しませんか? 周波数は 100 Hz 前後になると思います。私は以前にこのようなことをしたことがありませんが、一定のループ、コンテキストの切り替えなどはマルチタスクや CPU の使用には適していないと想像できます。
この場合の CPU の使用とマルチタスクに関するアドバイスはありますか? FWIW シングルコア プロセッサを考えています。答えは、「システムが使用できなくなる」から「関連する数値は、最新のプロセッサに影響を与えるよりも桁違いに小さい」までさまざまです。
最も適切と思われるため、C を想定します。
編集:ハードウェアGPIOピンにアクセスできるマシン上のLinuxまたはその他の汎用POSIXオペレーティングシステムを想定しています。
EDIT:スリープでPWMを実装する方法は明らかだと思いました。疑いを避けるために、次のようなものがあります。
android - メモリからマッピングされていない Pandaboard GPIO バンク
現在、OKL4 Hypervisor を使用して Android と RTOS を一緒に実行し、Pandaboard (OMAP4430) で両方を仮想化しています。電源投入中のある時点で、Linux カーネルが原因でボード上のすべての GPIO バンクがメモリからマップ解除されたように見えます。これは、Hypervisor がこの状態で Android を中断し、RTOS を実行させた場合にのみ問題になるため、一時的なものと思われます。Linux カーネルで電源管理を無効にしてみましたが、違いはないようです。また、テスト ポイントを使用して Pandaboard のすべてのクロックをチェックしましたが、問題ないように見えます。ハイパーバイザーは、すべてのページが正しくマップされていることを報告します。Pandaboard または OMAP でどのような構成を行うと、すべての GPIO バンクがメモリから消える可能性があるかを調べるための助けを探しています。
linux - GPIO ポートアドレスを計算する方法
GPIO30-GPIO37 というラベルの付いた 8 つの I/O ラインを提供するヘッダーを持つ Jetway NF81-T56 マザーボードがあります。私の CentOS6 インストールには GPIO ドライバーがなく、ドライバーを作成しようとしています。Fintek F71869 Super IO チップは、GPIO およびその他の I/O 機能を提供します。0x2e/0x2f ポート経由で GPIO3 レジスタにアクセスして変更できますが、F71869 GPIO レジスタに設定された GPIO BASE_ADDR を使用してデータ ポートにアクセスできませんでした。これらのレジスタを読み取ったところ、GPIO BASE_ADDR が 0x0a00 に設定されています。チップのマニュアルページには次のように記載されています。
インデックス ポートは BASE_ADDR[15:2] + 5 で、データ ポートは BASE_ADDR[15:2] + 6 です。
データ ポートを 0x0f (接続された LED で表示) に設定し、ポート 0x0a00-0x0a7f を読み取ろうとしました。すべてが 0x0f ではなく 0xff を返しました。「BASE_ADDR[15:2]」表記構文を解釈する方法を知っている人はいますか? インターネットで調べたり、メーカーに問い合わせたりしましたが、だめでした。
interrupt - gpioピンはLinuxにエクスポートされません
Linuxユーザースペースでgpioをエクスポートするために、次のことを試みました。
カーネル構成では、
/li>GPIO = 9
/li>used gpio_export(9)
私のコードですべてのgpioをエクスポートしようとしました。ただし、gpioはエクスポートされません。
sysfsでgpioピンをエクスポートする際に何が欠けていますか?
nested - ARM Cortex M3 GPIO 割り込み - 8 ピンのポートごとに 1 つの ISR - すべてのピンを処理する方法
Luminary LM3S8962 マイクロコントローラーとそれに含まれるライブラリ ガイドを使用していますが、これは、ネストされたベクター割り込みを持つ ARM Cortex-M3 に関連するはずです。
GPIO ポート全体に登録できる割り込みサービス ルーチン関数は 1 つだけです。GPIO ポートには通常 8 つのピンがあり、それぞれに割り込みを設定できます。ピンごとに、割り込みが「発生」したかどうか (保留中かどうか) をテストできますよね? ピンごとに、保留中の割り込みをクリアできますよね?
GPIO ポートのピンが ISR をトリガーする場合、プロセッサは ISR 内にあります。次に、ISR にいる間に同じポートの別のピンが割り込みをトリガーするとどうなるでしょうか? どのピンに保留中の割り込みがあるかをコードが検出すると仮定します。- この ISR は中断され、同じコードで新しい ISR が開始されますが、PinInterruptStatus レジスタは更新されていますか? (そうでないことを願っています) - この ISR は完了するまで実行され、その直後に他のピンの割り込みがすぐに実行されますか? (ARM Cortex M3 が割り込みのテールチェーンを実装していることは知っています) - または、すべてのピンがクリアされるまでループし、処理後にピンをクリアする while ループが必要ですか?
たぶんこれが役立ちます:
linux - sysfs を介して GPIOS を出力専用または入力専用に制限する
Ubuntu 11.10 を使用しています。カーネルに独自のドライバーがなかった GPIO チップ用のドライバーを作成しました。
/sys/class/gpio を使用する場合、ユーザーが出力専用ピンを入力に設定したり、その逆に設定したりすることを制限したいと考えています。これは、ボード上の GPIO の多くが入力専用または出力専用であるためです。
関数 gpio_direction_in()、gpio_direction_out()、および gpio_request() 内から制限された GPIO 番号をスキャンできますが、それはちょっとしたハックアラウンドだと思います。
特にこの目的のための機能はありますか?GPIO のドキュメントを調べましたが、何も表示されませんでした。
- アンドリュー
linux - ioremap よりも遅い mmap
Linux 2.6.37 を実行する ARM デバイス用に開発しています。IO ピンをできるだけ速く切り替えようとしています。小さなカーネル モジュールとユーザー空間アプリケーションを作成しました。私は2つのことを試しました:
- を使用してカーネル空間から直接 GPIO 制御レジスタを操作し
ioremap
ます。 mmap()
GPIO 制御レジスタをキャッシュせずに、ユーザー空間から使用します。
どちらの方法も機能しますが、2 番目の方法は最初の方法よりも約 3 倍遅くなります (オシロスコープで観察)。すべてのキャッシュメカニズムを無効にしたと思います。
もちろん、カーネル空間の速度でユーザー空間からの柔軟性と開発の容易さという 2 つの世界を最大限に活用したいと考えています。
mmap()
が よりも遅くなる理由を知っている人はいioremap()
ますか?
これが私のコードです:
カーネル モジュール コード
ユーザー空間のアプリケーション コード
linux - Linux gpio c API
3.2 カーネルが動作する powerpc ボードがあります。sysfs を使用して gpio にアクセスすると、期待どおりに動作します。
ユーザー空間から gpio ピンに直接アクセスする API はありませんか? テキストベースの sysfs インターフェースを扱う必要がありますか?
次のようなものを探します: gpio_set(int no, int val);
ありがとうクラウス
c - C でのポート (GPIO) 値の読み取り (beagleboard-xm)
ubuntu 12.04 を実行する組み込みボード (beagleboard-xm) があります。ポートの値が変化するかどうかを確認するには、GPIO を継続的に読み取る必要があります。私のコードは以下です:
上記のコードはポートを継続的に読み取ります (0
デフォルト)。ただし、ポートを as に変更すると、正しい値の出力を呼び出しますが1
、出力として出力されます。出力する値を保存しないという問題は何ですか。system
printf
0
value2
system()
上記のループの代わりに以下のコードを使用するとwhile
、ファイルを開くことに関するエラーが発生しvalue
ます (値ファイルを開けません)。fopen
行をループの外に置くwhile
と、ファイルの変更が表示されませんvalue
。
私の質問: コードを修正するにはどうすればよいですか? またはどのようにvalue
ファイルを読むべきですか?私が疑問に思っている追加情報として:たとえば、ポートをエクスポートすることの違いは何ですか?system("echo 139 > /sys/class/gpio/export")
また、fp = fopen("/sys/class/gpio/export","w"); fprintf(fp,"%d",139);
どの方法を使用することをお勧めしますか? なんで?
前もって感謝します。