Schützen Sie den kritischen Abschnitt des Benutzerbereichs vor Unterbrechungen

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.

Verschieben Sie den zeitkritischen Code in einen Betriebssystemtreiber, dann können Sie Interrupts aktivieren/deaktivieren.
Ein detailliertes Beispiel oder Lesematerial/Website wird sehr geschätzt. Dies ist mein erstes Projekt, das sich mit Linux beschäftigt.
Ich werde das Buch einfach kaufen. Ich habe den Link gelesen, bevor ich hier gepostet habe. Die Antwort scheint so, als wäre es nicht möglich, das zu erreichen, was ich will.

Antworten (4)

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 .

Das klingt vielversprechend, ich werde darauf eingehen.
@danteDev - Wenn Sie nach Begriffen wie BeagleBone und PRU oder PRI-ICSS suchen, werden eine Reihe nützlich aussehender Links angezeigt. Der Hackspace-Artikel schien eine Reihe hilfreicher Artikel zu enthalten und ein guter Ausgangspunkt zu sein. In den ersten Artikeln ging es um die Verwendung des PRU-Assemblers, was machbar, aber mühsam aussah. Als TI jedoch den C-Compiler veröffentlichte, schien alles viel benutzerfreundlicher zu sein.

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.

Das Problem ist, dass der Slave in den Schlafmodus fällt (5 Millisekunden), wenn die Unterbrechung länger dauert als der Timer-Countdown in den Schlafmodus während der Unterbrechung. Ist es immer noch der gleiche Fall?
@dant: Das ist ein seltsamer Slave, wenn er nach 5 ms wirklich in den Ruhezustand geht, wobei die Chipauswahl noch aktiviert ist . 5 ms ist eine sehr sehr lange Zeit für einen Interrupt. Entweder haben Sie eine sehr schlecht konzipierte Unterbrechungsstrategie, oder etwas anderes ist im Gange. Das riecht eher nach einem Nicht-Echtzeit-Betriebssystem, das einen von vielen Prozessen für eine Weile anhält, nicht nach einem Interrupt, der die horrend lange Zeit von 5 ms benötigt.
Ja, es sind viele Prozesse im Gange, und ich werde im Verlauf weitere Prozesse hinzufügen. Ist das ein Problem? Ich habe den Teil "Design-Interrupt" nicht berührt, also scheint ein schlecht gestalteter Interrupt für das User-Space-Programm nicht relevant zu sein, habe ich recht? Vom User-Space-Programm sende ich einfach den Lesebefehl und das Leseergebnis vom Slave, so einfach ist das. Was dazwischen passiert, keine Ahnung. Oh, ich muss betonen, dieses Problem tritt in seltenen Fällen auf, ungefähr 1 ungültig von 10000 gelesen. Ich möchte dieses Problem herausfinden und lösen.

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.

Kein Scherz, ich habe gelegentlich mehr als 10 ms beobachtet, aber nicht mehr als 15 ms. Preempt und Interrupt sind nicht dasselbe? Bitte verweisen Sie mich auf den richtigen Link, wenn dies nicht geeignet ist, hier gepostet zu werden. Ich werde mir aber den "sched_setscheduler" durchlesen.

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.

Ja, es kommt in sehr seltenen Fällen vor, aber es ist sehr kritisch für die Zuverlässigkeit des Systems. Ein detailliertes Beispiel oder Lesematerial/Website wird sehr geschätzt. Dies ist mein erstes Projekt, das sich mit Linux beschäftigt.