Alternative zu ulseep()?

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hi,
    versuche mich grad daran nen Visualizer mit den digitalen RGB LEDS die es grad beim Aldi gibt für den MPD player zu basteln. (erstmal mit Hilfe von dem Arduino) und hatte die Idee die pcm daten vom MPD player abzugreifen, wie es auch zum Beispiel ncmpcpp für die Visualisierungen macht.

    Auszug aus der mpd.config:

    Code
    audio_output {
        type                    "fifo"
        name                    "my_fifo"
        path                    "~/.config/ncmpcpp/mpd.fifo"
        format                  "44100:16:2"~/.ncmpcpp/config
    }

    Daraus möchte ich dem Arduino dann die Informationen schicken welcher dann die LED Strippe steuert.

    Das Auslesen funktioniert soweit, nur hab ich noch garkeine Erfahrung in dem Bereich und kann mit den Daten nichts anfangen.


    Wenige millisekunden liefern zum Beispiel diese Ausgabe:

    Hat jemand nen Ansatz für mich? Links die mir helfen daraus nen Visualizer zu basteln? könnte ja erstmal als Programm laufen.

    Einmal editiert, zuletzt von gnome (1. Mai 2014 um 23:52)

  • okay nächstes Problem, ich bleibe einfach mal in diesem Thread.
    Kennt jemand ne alternative zu usleep auf die man sich verlassen kann? muss in dem Programm ne kleine Verzögerung einbauen weil sonst der Arduino nicht nachkommt,
    usleep() funktioniert, ist aber sehr unzuverlässig und braucht zwischendurch mal extrem lange was zu Aussetzern führt.
    Hab das ganze jetzt mit ner schleife gelöst in der sinnlose zuweisungen passieren, das lastet den pi aber viel zu sehr aus(80% cpu Auslastung statt <20 mit sleep)

    Hier könnt ihr euch den aktuellen Stand mal ansehen:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Hi

    also wenn usleep "unzuverlässig" ist, dann liegt es daran, dass Raspbian nun mal kein Echtzeitbetriebssystem ist.
    Du könntest aber folgendes versuchen:

    Angenommen du rufst usleep in deinem Programm mit 10000 auf um eben genau 10000 Mikrosekunden zu warten. Statt usleep(10000) machst du aber folgendes:

    Code
    gettimeofday(&before, NULL);
    do {
        usleep(1000); //könntest es auch mal mit usleep(100) oder gar mit nanosleep() versuchen
        gettimeofday(&after, NULL);
    } while (timeValDiff(&before, &after) < 10000);

    und timevalDiff ist dann so in etwa:

    Code
    static long long int timeValDiff(timeval *before, timeval *after)
    {
        long long int microsBefore = before->tv_sec * 1000000;
        microsBefore += before->tv_usec;
        long long int microsAfter = after->tv_sec * 1000000;
        microsAfter += after->tv_usec;
        return microsAfter - microsBefore;
    }
  • Eine saubere Lösung wäre "pigpio" (einfach mal hier im Forum danach suchen).

    "pigpio" ist in C geschrieben und klinkt sich in den DMA-Takt des RPi ein, somit sind recht hochauflösende, genaue Timerinterrupts möglich. Ideal auch für PWM, gleichzeitig an mehreren Ports möglich. Frisst auch nur wenig CPU-Zeit.

    Weitere Infos:
    http://abyz.co.uk/rpi/pigpio/index.html

    Gruß, mmi

  • usleep ist nicht unzuverlässig in dem Sinne... usleep gibt die CPU-kontrolle ab für den angegebenen Zeitraum (Besser für "bis die aktuelle Zeit + die angegebene Zeitspanne). Das heißt der Scheduler, der die Prozesser verwaltet, Hat ab dem Moment wieder den Auftrag, dein Programm zur CPU zu schicken. Wenn es jetzt gerade massiv viele andere Dinge gibt, kann sich das etwas verzögern. Das müsste man auch an der Auslastung sehen können.
    Wenn du eine solche Zeitkritische Anwendung hast, hast du die Möglichkeit, eine andere Schedule-policy zu verwenden, zum Beispiel den FIFO-Scheduler oder den RoundRobin Scheduler.
    Hier das "wie" ganz grob: http://askubuntu.com/questions/5128…om-command-line
    Die beiden Scheduler würden dein Programm priorisieren, brauchen aber Root-Rechte.

Jetzt mitmachen!

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