Interrupts auf ARMv6 für Prozess deaktivieren

Antworten
Seren200018
Beiträge: 2
Registriert: Do 27. Feb 2014, 11:05

Interrupts auf ARMv6 für Prozess deaktivieren

Beitrag von Seren200018 »

Hallo Lazarus Community

ich habe im moment folgendes Problem. Zum Ansteuern eines DA Wandlers möchte ich einen Raspberry Pi (armV6) verwenden. Die Bitrate soll dabei etwa 10khz betragen. Das Problem ist allerdings das es aufgrund der Interrupts immer wieder zu ungewollten Pausen in der Ausgabe kommt. Aus diesem Grund wollte ich Interrupts für die kurze 16bit Wandlung deaktivieren und anschließend wieder aktivieren. Ich habe bereits einige Beispiele dafür mithilfe des Assemblers gefunden, allerdings bekomme ich bei der kompilierung immer wieder den Fehler das SPSR unbekannt ist.

Arm gibt als Beispielcode den folgenden Assembler Code an:

Code: Alles auswählen

disable_IRQ
                LDMFD   SP!, {R8, R12}    ; Load R8, SPSR
                ORR     R12, R12, #0x80   ; Set IRQ flag to disable it
                MSR     SPSR_cxsf, R12    ; Set SPSR
                LDMFD   SP!, {R12, PC}^   ; Restore R12 and Return
 
enable_IRQ
                LDMFD   SP!, {R8, R12}    ; Load R8, SPSR
                BIC     R12, R12, #0x80   ; Set IRQ flag to disable it
                MSR     SPSR_cxsf, R12    ; Set SPSR
                LDMFD   SP!, {R12, PC}^   ; Restore R12 and Return


Als Lazarus Version verwende ich 0.9.30.4-6
FPC : 2.6

Schon einmal vielen Dank für eure Hilfe

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Interrupts auf ARMv6 für Prozess deaktivieren

Beitrag von mschnell »

Ganz schlechte Idee !!!

Interrupt deaktivieren geht in einem Userland-Programm nicht. Das geht nur im Kernel Mode.

Wenn Du sowas machen willst, solltest Du einen Device-Driver schreiben. Geht aber nur in C.

In einem Programm, das in einem komplexen Betriebssystem läuft, das nicht speziell für "realtime" spezifiziert ist (also z.B. Windows oder "normales" Linux), musst Du immer damit rechnen, dass dein Programm von irgendwelchen Betriebssystem-Vorgängen lange (durchaus einige Sekunden lang) aufgehalten werden kann.

In Linux ist da ein Interrupt-gesteuerter Device-Treiber besser (aber auch nicht "beliebig" schnell, weil der Kernel schon mal Interrupts deaktiviert und die Service-Routine Deines Treibers verzögert wird).

Es gibt verschiedene "realtime" Linux Varianten, mit denen Du Programme so laufen lassen kannst, dass sie einer maximaler Latenz genügen. Die sollte dann bei der Betriebssystem/Hardware-Kombination spezifiziert sein. Realtime-Programme haben aber meist eine spezielle API zum Betriebssystem. Ich weiß nicht, ob fpc die benutzen kann.

Notwendig ist in den meisten Fällen, eine Trennung der Funktionalität des Userland-Programms und der realtime-Arbeit. Zwischen den beiden Teilen sollte mit Hilfe von FiFos (Queues/Pipes) kommuniziert werden.

Abgesehen von den angesprochenen Realtime-Betriebssystem gibt es noch verschiedene andere Verfahren:

- Hardware mit mehreren Prozessoren, von denen einige dem Betriebssystem zugeordnet werden und andere dem Realtime-Prozess. Das geht (theopretisch) sowohl mit Multiprozessor-ARM-Chips als auch mit "asymetrischer" Hardware, wie z.b. der Chip des Beaglebone, der zwei kleine Koprozessoren hat.

- ich habe das bisher meist mit einem externen Prozessor-Chips gemacht, z.B. ein PIC, der über USB mit dem Haupt-Board gekoppelt ist.

-Michael
Zuletzt geändert von mschnell am Do 27. Feb 2014, 19:46, insgesamt 4-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Interrupts auf ARMv6 für Prozess deaktivieren

Beitrag von m.fuchs »

mschnell hat geschrieben:Wenn Du sowas machen willst, solltest Du einen Device-Driver schreiben. Geht aber nur in C.

Warum?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Interrupts auf ARMv6 für Prozess deaktivieren

Beitrag von Christian »

baam *abo* :)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Seren200018
Beiträge: 2
Registriert: Do 27. Feb 2014, 11:05

Re: Interrupts auf ARMv6 für Prozess deaktivieren

Beitrag von Seren200018 »

Danke schon einmal für die Antworten.

Kannst du mir eine Quelle empfehlen zur Treiber Programmierung? Soetwas musste ich bis jetzt noch nicht machen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Interrupts auf ARMv6 für Prozess deaktivieren

Beitrag von mschnell »

Seren200018 hat geschrieben:Kannst du mir eine Quelle empfehlen zur Treiber Programmierung? Soetwas musste ich bis jetzt noch nicht machen.


Die Bibel: "Linux Device Drivers" von Rubini / Corbert / Kroah-Hartman

Kann man, soweit ich weiß, sogar im Internet lesen.

-Michael

Antworten