Raspberry Software-Interrupt

  • Hallo,

    der ein oder andere kennt mich sicherlich aus einem anderen Teilbereich dieses Forums.

    Ich hätte eine Frage bezüglich des Raspberry Pis und Interrupt Routinen.

    Ich habe schon einiges im Netz und auch hier im Forum gelesen aber ich bin nicht auf die Antwort meines Problems gestoßen.

    Ich möchte ein System bauen, welches schnell arbeiten soll (100ns). Mir geht es auch hauptsächlich darum das Programm zu verstehen.

    Zu meiner Aufgabe:
    Ich möchte eine Software Interrupt Routine schreiben (in C oder Phyton), welche mind. (schneller wäre besser) alle 100ns aufgerufen wird.

    Ist dies mit dem Pi überhaupt möglich? Und wenn ja wie kann ich dies realisieren?
    Theoretisch wäre ja eine Auflösung von 1,43ns möglich.

    Vielen Dank für eure Antwort / Anregung

    <--Heute ist ein guter Tag zum basteln-->

  • Hallo Tell, danke für deine Antwort.

    Die Interrupt Routine soll dafür zuständig sein einen Timer hochzuzählen.

    Eigendlich brauche ich alle 40ns einen Timerwert.

    Aufgabe des Pi ist es innerhalb dieser Zeit einen Ausgang zu setzen und einen Eingang zu lesen.

    Er muss in dieser Zeit nichts anderes machen. Von daher kann ich alle störenden Elemente, welche den Pi unnötig langsam machen deaktivieren.

    <--Heute ist ein guter Tag zum basteln-->

  • Hallo Xeriox,

    wenn Du alle 100 ns einen Interrupt erzeugen möchtest, dann darf die Interrupt-Prozedur ca. 20-30 ns dauern. Ansonsonsten ist der Raspberry nur mit der Abarbeitung der Interrupt-Routine beschäftigt - wie Tell es schon zutreffend gesagt hatte.

    Wenn Du mal einfache Zeitmessungen von simplen C-Befehlen durchführst, wirst du feststellen, dass praktisch nichts in ein solches Zeitfenster passt.

    Ich kenne jetzt die ARM-Prozessor-Architektur gar nicht. Von anderen Prozessoren weiss ich, dass es praktisch keine Prozessor-Befehle gibt, deren Abarbeitung nur einen Prozessortakt benötigt. Die meisten erfordern zwei oder drei Prozessortakte.

    Somit würdest Du in rund 25 ns nur ca. 10 Prozessor-Befehle bearbeiten können. Dann nämlich sollte der Interrupt verlassen werden, weil der der Rest des Systems (Linux-OS, Deine Anwendung, die durch den Interrupt unterbrochen wird, ...) - bevor der nächste Interrupt ausgelöst wird.

    Kurzum, die Performance eines solchen Systems würde sehr bescheiden ausfallen - falls es überhaupt noch stabil läuft.

    Von den 100 ns solltest du mal in Richtung 10 bis 100 Mikrosekunden gehen... Das ist immer noch schnell genug für die meisten Prozesse.

    Was hast Du eigentlich vor?

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (8. Oktober 2017 um 19:45)

  • Hallo Xeriox!


    Er muss in dieser Zeit nichts anderes machen. Von daher kann ich alle störenden Elemente, welche den Pi unnötig langsam machen deaktivieren.


    Das wird für die gewünschte feine Auflösung nicht viel helfen, da der Kernel nicht echtzeitfähig ist.

    Was Du aber probieren kannst, ist "pigpio". Such' mal zumindest hier im Forum danach.
    Es hängt sich direkt in den DMA-Takt des RPI ein und umgeht somit den Kernel. Dadurch sollten Auflösungen bis ca. 1 MHz möglich sein.

    Gruß, mmi

  • Viele Dank für eure Beiträge.

    Die Anwendung für mein Problem ist folgendes:

    ich habe einen A/D-Wandler, welchen ich über 2 SPI Schnittstellen mit dem Raspberry Pi auslesen möchte.

    Der A/D-Wandler hat eine Rate von 1,5 MSPS pro Kanal.

    Ich hatte im Internet gelesen, dass der Pi bis zu 65 MSPS über die SPI-Schnittstelle auslesen kann von daher wunder ich mich jetzt, dass die Zeit ein Problem darstellt, er hat ja schließlich 700MHz Taktung...

    <--Heute ist ein guter Tag zum basteln-->

  • Hallo Xeriox,

    ok, aber warum willst Du das über einen Interrupt auslesen?

    Die Abfrage sollte eigentlich so aussehen:
    - warten auf einen Pegelwandel (der signalisiert, dass ein Messwert ansteht)
    - Bit für Bit aus dem Schieberegister ziehen
    - wenn alle Bits gelesen sind, dies dem A/D-Wandler mitteilen, damit der den nächsten Wert bereitstellt.

    Wenn Dein System den SPI-Standards folgt, dann steht der Messwert ohnehin in

    Code
    /dev/spidev0.0

    oder

    Code
    /dev/spidev0.1

    Den Inhalt kannst Du dann ganz leicht auslesen - da spielt die Prozessortaktung / Interrupt-Gedöns keine Rolle.

    Ansonsten gibt es für zahlreiche AD-Wandler Libraries zum Schreiben und Auslesen von Werten.

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Achso, danke Andreas.

    Du meinst, dass für SPI ein seperates Register zuständig ist?

    Ich habe das Problem, dass ich übersehen habe dass der Raspberry B+ nur eine SPI-Schnittstelle hat. Ich brauche aber zwei, deswegen wollte ich SPI über die GPIO simulieren...

    Könntest du mir bitte erklären wofür spidev0.0 und spidev0.1 zuständig ist?

    <--Heute ist ein guter Tag zum basteln-->

  • Hallo Xeriox,


    Achso, danke Andreas.

    Du meinst, dass für SPI ein seperates Register zuständig ist?

    Ich habe das Problem, dass ich übersehen habe dass der Raspberry B+ nur eine SPI-Schnittstelle hat. Ich brauche aber zwei, deswegen wollte ich SPI über die GPIO simulieren...

    Könntest du mir bitte erklären wofür spidev0.0 und spidev0.1 zuständig ist?

    ich meine gar nichts ;)

    Alles Weitere kannst Du hier nachlesen:
    http://www.raspberrypi.org/wp-content/upl…Peripherals.pdf


    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!