GPIOピン(ARMプラットフォーム、Mach-davinci、カーネル2.6.27)でクロック信号を生成しようとしていますが、これは100kHzのクロックを生成します。優先度の高いタスクレットを使用してそれを行います。理論は単純で、gpioを高く設定し、5usを低く設定し、gpioを低く設定し、別の5usを待つが、奇妙な問題が発生する。まず第一に、この5桁のdalayを得ることはできませんが、それはうまくいきますが、hwパフォーマンスの問題のように見えるので、私は期間= 40usに移動します(〜25kHzを与える)。 2番目の問題は最悪です。 〜10msごとに1回、通常より3倍長く待ちます。私はそれがこの時間を取っているように聞こえると思っていますが、これはプロトコル(これの上で実装されます)の観点から受け入れられません。一時的にハートビート手順を無効にする方法はありますか?それとも最初から間違っているのでしょうか?コメントはありますか?ビットバンギングでLiunxカーネルモジュールで〜100kHzクロック信号を生成する方法は?
答えて
この種のジョブにタスクレットを使用することはできません。タスクレットは割り込みによって先取りすることができます。場合によっては、タスクレットをプロセスコンテキストで実行することもできます。
このようにする必要がある場合は、割り込みハンドラを使用してください。割り込みを無効にしたり、割り込みを無効にしたり、できるだけ早く行うことができます。
あなたの説明は私が読んだこととは非常に異なりますが、すべてあなたは助けてくれてありがとうございます! – Poll
カーネルタイマーよりも高い優先順位でタイマータスクレットを実行できない限り、この種のジッターの影響を常に受けます。あなたは本当にビットギャングでこれを行う必要がありますか?ハードウェアタイマーやPWMジェネレータを使用する方がはるかに簡単です。タイマーを希望のレートで実行するように設定し、ピンを出力に設定すると、完了です。
ビット単位でソフトウェア制御が必要な場合は、タスクレットを短い時間に実行するように設定することで、他のタスクを試行して回避できます。たとえば、40マイクロ秒の遅延の4分の3です。タスクレットでは、正しい40 usタイムスロットになるまで割り込みを無効にしてクロックをポーリングし、I/O状態を設定し、割り込みを再度有効にして終了します。しかし、これは効果的に時計を見てシステムの25%を入力します。
これを行う最も簡単な方法は、USARTやsth、unfortunatellyのように、仕事をするいくつかのhwインターフェイスを取ることです:( – Poll
クロックをソフトウェアで非同期で生成することは適切ではありません。お使いのプロセッサは、すでにカーネルや別のドライバで使用されていない内蔵のクロック・ジェネレータの周辺を有することができる
:私はより良い仕事にする2つの選択肢を考えることができます。これらのうちの1つを設定すると、クロックを実行する速度がわかり、パルスがなくなるだけです。
プロセッサのデータシートを入手して調査してください。
「クロック」と呼ばれるペリフェラルはありませんが、のような周辺機器は見つからないかもしれませんが、PWM周辺機器のようなサービスを提供できるようなものがあります。
あなたが話している他のデバイスは、実際には通常の時計を必要としない場合があります。 「クロック」ラインを必要とするチップの中には、読み込むビットがあるときにハイになるラインだけが必要で、データラインが変化している間にローになります。この場合、100kHzのものは正確にその周波数のクロックには厳しい要件ではなく、クロックライン(したがってデータライン)の速度の上限に過ぎません。移行することが許可されています。
そんなに速いクロックよりもCPUを使用すると、2つの半分にこれを分割したい:
「上半分は」正しくデータライン(S)状態を設定し、その後、クロックラインをもたらしますアップ。その後、割り込みまたはカーネルタイマーを使用して、5秒後に下半分を実行するようにスケジュールします。
割り込みまたはタイマーによって呼び出される「ボトムハーフ」では、クロックラインを戻してから、5秒後に再度上半分を実行するようにスケジュールします。
- 1. クエリでシリアル番号を生成する方法は?
- 2. 信号をASK(Amplitude Shift Keying)信号で変調する方法
- 3. clojureで長い番号をランダムに生成する方法
- 4. attr_encryptedで使用する暗号鍵の生成方法
- 5. bashスクリプトの内部で信号を発生させる方法は?
- 6. ユーザー登録後、登録番号(UserId)を生成してユーザーにメールで送信する方法は?
- 7. HTTP POSTの暗号化パスワードを生成する方法は?
- 8. VS2005:ビルド番号を自動的に生成する方法は?
- 9. 分散モデルで他のプロセスの実行を停止する信号を生成する方法
- 10. haskellでウィンドウ上の信号を処理する方法は?
- 11. QWebEngineViewでlinkClicked(QUrl)信号をエミュレートする方法は?
- 12. MapViewで常に動く信号を表現する方法は?
- 13. Linuxカーネルモジュール内でファイルを読み書きする方法は?
- 14. VB6でMicrosoft Outlookの送信トレイに電子メールメッセージを生成する方法は?
- 15. SASは、シーケンス番号をエレガントな方法で生成(繰り返し)します
- 16. Tkで最大化信号を捕まえる方法は?
- 17. Javaで最大CPUクロックを取得する方法
- 18. LinuxでRaspberryPiのI2Cクロックを100Kに設定する方法
- 19. ユニークなデビットノート番号を自動的に生成する方法
- 20. コピーブースト::信号を作成するには?
- 21. mysqlの範囲内で一意の番号を生成する方法
- 22. BehatでURLを生成する方法
- 23. awesome_nested_setでネストリストを生成する方法
- 24. djangoでURLを生成する方法
- 25. プログラムでキープレスを生成する方法
- 26. ノンフォームアプリケーションでキーストロークを生成する方法
- 27. OpenALでホワイトノイズを生成して再生する方法は?
- 28. apache cassandraでプライマリキー(自動生成シーケンス)を生成する方法
- 29. ハッシュ暗号で安全なログインページを作成する方法は?
- 30. iPhoneでWiFi信号を判別する方法
わかりません。あなたは無限ループでビジーウェイトとなるタスクレットを書いています! – Demiurg
基本的にはyesですが、無限ではありません。私はその時計が必要です.500msと言えば、300msに近いはずです。はい、私はそれがすべてをブロックすることに気づいていますが、私はどのような選択肢がありますか? ;) – Poll