Ich verwende Beagle Bone Black mit Arch Linux ARM OS, um mit dem LTC-6804-Chip über den SPI-Port zu kommunizieren. Ich bin an einem Punkt angelangt, an dem der Interrupt vom Betriebssystem mitten beim Senden des Lesebefehls und beim Empfangen von Messwerten Probleme verursacht, um eine gültige Messung vom Chip zu erhalten. Gibt es eine Möglichkeit, den Teil des Codes zu "schützen", der während der Ausführung unterbrochen wird? Mit anderen Worten, lassen Sie den Sende- und Leseabschnitt ohne Unterbrechung abschließen.
Dies ist ein anderer Ansatz für Ihr Problem und es geht nicht darum, unter Linux zu arbeiten. Stattdessen geht es darum, andere BeagleBone Black-Ressourcen zu verwenden, um das Problem zu lösen.
Neben dem ARM Corex-A8 verfügt der BeagleBone Black über zwei weitere Prozessoren, genannt Programmable Real-Time Unit Subsystem und Industrial Communication Subsystem (PRU-ICSS), oft nur PRU.
Die beiden PRUs werden unabhängig vom ARM ausgeführt, auf dem Linux ausgeführt wird, und sind daher nicht von der Linux-Planung betroffen. sie werden von Linux nicht unterbrochen oder vorweggenommen.
PRUs sind für die Echtzeitverarbeitung vorgesehen und haben Zugriff auf alle E/A. Sie sind RISC-Kerne, die jeweils mit 200 MHz laufen, sollten also schnell genug sein und in der Lage sein, alles zu tun, was Sie brauchen. Sie könnten einen Ihrer SPI-Kommunikationsaufgabe widmen.
Sie können in C oder Assembler programmiert werden. Es gibt mehrere nützliche Artikel im Internet, dieser auf Hackspace enthält nützliche Links zu wichtigen Beispielen und Technologien. IIRC gibt es Beispiele, die zeigen, wie der Haupt-Linux-Prozessor mit einer PRU interagiert.
Bearbeiten:
Dies ist ein Kurs zur Verwendung der PRU .
Sie suchen nach der falschen Lösung für das Problem. Korrigieren Sie stattdessen die Software ordnungsgemäß.
SPI ist vollständig synchron. Da Sie der Meister sind, gehört Ihnen die Uhr. Mit richtig gestalteten SPI-Routinen sollte es keinen Schaden anrichten, Zyklen willkürlich zu unterbrechen. Alles, was tun sollte, ist, die Zeit zwischen den Übergängen zu verlängern, was kein Problem sein sollte.
Kein Interrupt sollte 5ms dauern, das ist ewig ....
Es kann jedoch sein, dass Sie unterbunden werden, in diesem Fall möchten Sie vielleicht einen der Posix-Echtzeit-Scheduler anstelle des Standard-Schedulers verwenden, siehe die Manpages für sched_setscheduler für Details.
Dies ist jedoch weit mehr eine Softwarefrage als eine Hardwarefrage.
Grüße, Dan.
Wenn dies selten vorkommt, setzen Sie ein Flag in der Interrupt-Routine, die von der spi-Leseroutine überprüft wird. Wenn gesetzt, wiederholen Sie die Leseoperation nach dem Löschen des Flags.
pjc50
danteDev
pjc50
danteDev