Beim Arduino / ATmega328p verfügen die 16-Bit-Timer / PWM-Module über eine Eingangserfassungseinheit, mit der die genaue Ankunftszeit für eine Eingangsflanke aufgezeichnet werden kann, selbst wenn der Prozessor beschäftigt ist, wenn die Eingangsflanke eintrifft. (Einzelheiten finden Sie im Datenblatt , Abschnitt 20.9 auf Seite 155.)
Verfügt der Raspberry Pi über ein vergleichbares Hardware-Peripheriegerät oder eine andere Möglichkeit, eine Eingangsflanke, die auftritt, während der Prozessor ausgelastet ist, präzise mit einem Zeitstempel zu versehen? Ich habe versucht, das Datenblatt für BCM2835 ARM-Peripheriegeräte zu durchsuchen , konnte jedoch bisher nichts finden, das meinen Anforderungen entspricht.
Ich würde annehmen, dass dies erreicht werden könnte, indem der FIQ verwendet wird, um einen DMA vom System-Timer zu einem anderen Ort auszulösen, aber aus den Registerdokumenten scheint es, dass der FIQ nur für GPU- und Basis-Interrupts eingerichtet werden kann. Ich bin mir nicht sicher, wie ich den FIQ bei GPIO-Interrupts auslösen soll, und selbst wenn ich wüsste, wie, bin ich mir nicht sicher, ob dies eine korrekte Vorgehensweise ist oder ob es eine andere Möglichkeit gibt, dies sauberer zu tun.
Wie kann ich die Ankunftszeit einer Eingangsflanke genau erfassen?
Eine kleine konstante Verzögerung ist kein Problem, da ich sie einfach wieder herausziehen kann, aber für meine Anwendung benötige ich mindestens eine Mikrosekundengenauigkeit oder besser.
Antworten:
Für eine allgemeine Linux-Lösung ist pigpio wahrscheinlich das Beste, was Sie finden werden.
Es verwendet DMA zum Erfassen der GPIO-Pegel und DMA zum Zeitstempeln der Ereigniszeit von der 1-MHz-Systemuhr.
Die neuesten Proben werden den interessierten Prozessen in 1-Millisekunden-Blöcken gemeldet. Dies bedeutet, dass die durchschnittliche Latenz etwa 500 µs beträgt. Dies wäre jedoch normalerweise kein Problem, da jeder Bericht bereits mit einem Zeitstempel versehen wurde.
Wenn Sie die Interrupt-Route wählen, erwarten Sie eine durchschnittliche Latenz zwischen dem GPIO-Ereignis und der Prozessbenachrichtigung im Bereich von 50 bis 100 µs. Natürlich können Ausreißer viel mehr sein, leicht 10 ms, und Sie werden nicht wissen, welche welche ist.
pigpio wird mit 1Msps abtasten, aber ich würde es nicht empfehlen, wenn das System wahrscheinlich mit Netzwerkarbeiten beschäftigt ist. Sie erhalten DMA-Timing-Jitter, wenn der Speicherbus anfängt, beschäftigt zu werden. Ich würde mich an 500ksps oder weniger halten.
Ich sehe keinen Weg, um Ihr 1µs oder besseres Ziel unter Linux zu erreichen.
quelle