0

GPIOピン(ARMプラットフォーム、Mach-davinci、カーネル2.6.27)でクロック信号を生成しようとしていますが、これは100kHzのクロックを生成します。優先度の高いタスクレットを使用してそれを行います。理論は単純で、gpioを高く設定し、5usを低く設定し、gpioを低く設定し、別の5usを待つが、奇妙な問題が発生する。まず第一に、この5桁のdalayを得ることはできませんが、それはうまくいきますが、hwパフォーマンスの問題のように見えるので、私は期間= 40usに移動します(〜25kHzを与える)。 2番目の問題は最悪です。 〜10msごとに1回、通常より3倍長く待ちます。私はそれがこの時間を取っているように聞こえると思っていますが、これはプロトコル(これの上で実装されます)の観点から受け入れられません。一時的にハートビート手順を無効にする方法はありますか?それとも最初から間違っているのでしょうか?コメントはありますか?ビットバンギングでLiunxカーネルモジュールで〜100kHzクロック信号を生成する方法は?

+0

わかりません。あなたは無限ループでビジーウェイトとなるタスクレットを書いています! – Demiurg

+0

基本的にはyesですが、無限ではありません。私はその時計が必要です.500msと言えば、300msに近いはずです。はい、私はそれがすべてをブロックすることに気づいていますが、私はどのような選択肢がありますか? ;) – Poll

答えて

2

この種のジョブにタスクレットを使用することはできません。タスクレットは割り込みによって先取りすることができます。場合によっては、タスクレットをプロセスコンテキストで実行することもできます。

このようにする必要がある場合は、割り込みハンドラを使用してください。割り込みを無効にしたり、割り込みを無効にしたり、できるだけ早く行うことができます。

+0

あなたの説明は私が読んだこととは非常に異なりますが、すべてあなたは助けてくれてありがとうございます! – Poll

0

カーネルタイマーよりも高い優先順位でタイマータスクレットを実行できない限り、この種のジッターの影響を常に受け​​ます。あなたは本当にビットギャングでこれを行う必要がありますか?ハードウェアタイマーやPWMジェネレータを使用する方がはるかに簡単です。タイマーを希望のレートで実行するように設定し、ピンを出力に設定すると、完了です。

ビット単位でソフトウェア制御が必要な場合は、タスクレットを短い時間に実行するように設定することで、他のタスクを試行して回避できます。たとえば、40マイクロ秒の遅延の4分の3です。タスクレットでは、正しい40 usタイムスロットになるまで割り込みを無効にしてクロックをポーリングし、I/O状態を設定し、割り込みを再度有効にして終了します。しかし、これは効果的に時計を見てシステムの25%を入力します。

+0

これを行う最も簡単な方法は、USARTやsth、unfortunatellyのように、仕事をするいくつかのhwインターフェイスを取ることです:( – Poll

2

クロックをソフトウェアで非同期で生成することは適切ではありません。お使いのプロセッサは、すでにカーネルや別のドライバで使用されていない内蔵のクロック・ジェネレータの周辺を有することができる

  1. :私はより良い仕事にする2つの選択肢を考えることができます。これらのうちの1つを設定すると、クロックを実行する速度がわかり、パルスがなくなるだけです。

    プロセッサのデータシートを入手して調査してください。

    「クロック」と呼ばれるペリフェラルはありませんが、のような周辺機器は見つからないかもしれませんが、PWM周辺機器のようなサービスを提供できるようなものがあります。

  2. あなたが話している他のデバイスは、実際には通常の時計を必要としない場合があります。 「クロック」ラインを必要とするチップの中には、読み込むビットがあるときにハイになるラインだけが必要で、データラインが変化している間にローになります。この場合、100kHzのものは正確にその周波数のクロックには厳しい要件ではなく、クロックライン(したがってデータライン)の速度の上限に過ぎません。移行することが許可されています。

    そんなに速いクロックよりもCPUを使用すると、2つの半分にこれを分割したい:

    • 「上半分は」正しくデータライン(S)状態を設定し、その後、クロックラインをもたらしますアップ。その後、割り込みまたはカーネルタイマーを使用して、5秒後に下半分を実行するようにスケジュールします。

    • 割り込みまたはタイマーによって呼び出される「ボトムハーフ」では、クロックラインを戻してから、5秒後に再度上半分を実行するようにスケジュールします。

関連する問題