0

Ich versuche, Taktsignal auf GPIO-Pin (ARM-Plattform, mach-davinci, Kernel 2.6.27) zu generieren, die etwas über 100kHz haben wird. Dazu verwenden Sie ein Tasklet mit hoher Priorität. Die Theorie ist einfach, setze gpio hoch, udelay für 5us, setze gpio tief, warte noch 5us, aber seltsame Probleme tauchen auf. Zuallererst, kann nicht 5us von Dalay bekommen, aber es ist in Ordnung, sieht aus wie hw Leistungsproblem, so wechselte ich auf Punkt = 40us (gibt ~ 25kHz). Zweites Problem ist am schlimmsten. Einmal pro ~ 10ms wartet 3x länger als üblich. Ich denke, dass es Hearbeat ist, der diese Zeit nimmt, aber das ist inakzeptabel vom Standpunkt des Protokolls (der darüber hinaus implementiert wird). Gibt es eine Möglichkeit, die Heartbeat-Prozedur vorübergehend zu deaktivieren, sagen wir 500ms? Oder mache ich es von Anfang an falsch? Irgendwelche Kommentare?Wie generiere ich ~ 100kHz Taktsignal im Liunx Kernel Modul mit Bit-Banging?

+0

Kein sicher, ob ich verstehen. Sie schreiben ein Tasklet, das in einer Endlosschleife beschäftigt ist! – Demiurg

+0

Grundsätzlich ja, aber nicht unendlich, ich brauche diese Uhr für, sagen wir 500ms, es sollte noch näher bei 300ms liegen. Ja, ich bin mir bewusst, dass es alles blockieren wird, aber welche Wahl habe ich? ;) – Poll

Antwort

2

Sie können das Tasklet für diese Art von Job nicht verwenden. Tasklets können durch Interrupts vorweggenommen werden. In einigen Fällen kann Ihr Tasklet sogar im Prozesskontext ausgeführt werden!

Wenn Sie unbedingt so vorgehen müssen, verwenden Sie einen Interrupt-Handler - steigen Sie ein, deaktivieren Sie Interrupts, tun Sie alles, was Sie tun müssen, und steigen Sie so schnell wie möglich aus.

+0

Oh ... Ihre Beschreibung unterscheidet sich sehr von dem, was ich gelesen habe, aber alles sagt, dass du recht hast, danke für deine Hilfe! – Poll

0

Sofern Sie Ihr Timer-Tasklet nicht mit einer höheren Priorität als den Kernel-Timer ausführen können, sind Sie für diese Art von Jitter anfällig. Sie müssen das wirklich durch Bit-Ganging tun? Es wäre viel einfacher, einen Hardware-Timer oder einen PWM-Generator zu verwenden. Konfigurieren Sie den Timer so, dass er mit Ihrer gewünschten Geschwindigkeit läuft, setzen Sie den Pin auf Ausgabe, und Sie sind fertig.

Wenn Sie eine Softwaresteuerung für jede Bitperiode benötigen, können Sie versuchen, die anderen Aufgaben zu umgehen, indem Sie Ihr Tasklet so einrichten, dass es in einem kurzen Zeitraum ausgeführt wird, etwa drei Viertel Ihrer 40-us-Verzögerung. Deaktivieren Sie im Tasklet die Interrupts, und rufen Sie die Uhr ab, bis Sie zum richtigen 40-us-Zeitfenster gelangen, den E/A-Status festlegen, Interrupts wieder aktivieren und beenden. Aber das macht effektiv 25% Ihres Systems beim Betrachten einer Uhr aus.

+0

Einfachste Möglichkeit, das zu tun, nehmen Sie einige hw-Schnittstelle, um die Arbeit zu tun, wie USART oder etw, leider ist alles genommen :( – Poll

2

Das asynchrone Generieren der Uhr in der Software ist nicht richtig. Ich kann von zwei Alternativen denken, die besser funktioniert:

  1. Ihr Prozessor über einen eingebauten in Taktgenerator Peripherie haben kann, die nicht bereits durch den Kernel oder einem anderen Treiber verwendet wird. Wenn Sie eine davon einstellen, sagen Sie ihm, wie schnell die Uhr läuft, und die Pulse werden gerade leer.

    Holen Sie sich das Datenblatt Ihres Prozessors und studieren Sie es.

    Sie könnten ein Peripheriegerät namens "per se" nicht finden, aber vielleicht finden Sie etwas ähnliches, das Sie in Betrieb nehmen können, wie ein PWM-Peripheriegerät.

  2. Das andere Gerät, mit dem Sie sprechen, benötigt möglicherweise keine normale Uhr. Einige Chips, die eine "Takt" -Leitung benötigen, benötigen lediglich eine Leitung, die hoch geht, wenn ein Bit zu lesen ist, das dann niedrig wird, während sich die Datenleitung (en) ändern. Wenn dies der Fall ist, ist das 100 kHz-Ding, das Sie lesen, keine harte Voraussetzung für eine Uhr genau dieser Frequenz, es ist nur eine obere Grenze dafür, wie schnell die Taktleitung (und somit die Datenleitung (en)) ist. dürfen übergehen.

    mit einer CPU so viel schneller als die Uhr, können Sie dies in zwei Hälften geteilt werden sollen:

    • Die „obere Hälfte“ setzt die Datenleitung (en) Zustand richtig, bringt dann die Taktleitung oben. Dann plant es die untere Hälfte, um 5 μs später zu laufen, unter Verwendung eines Interrupts oder eines Kernel-Timers.

    • In der "unteren Hälfte", die durch den Interrupt oder den Timer aufgerufen wird, die Taktleitung wieder herunterfahren, dann die obere Hälfte so programmieren, dass sie 5 μs später wieder läuft.