Alle 100ms funktion aufrufen



  • Hallo zusammen,

    ich würde gerne alle 100ms eine Funktion ausführen um Daten zu senden. Die 100ms müssen nicht so genau eingehalten werden, so +-10ms wären ausreichend.
    Hardwarebasis ist ein PhyboardWega mit AM335x ARM Cortex-A8 Prozessor. Betriebssytem ist Yocto Linux.

    Wie mache ich das am besten?
    Ich steh da im Augenblick auf dem Schlauch wie man das realisieren kann und bin daher für Vorschläge dankbar. 🙄


  • Global Moderator

    Ich vermute mal, das eigentliche Programm soll parallel weiter laufen? In dem Fall: Steuerthread aufmachen. Dieser startet alle 100 ms einen weiteren Thread mit der Funktion. Zu klärende Fragen: Was ist, wenn der vorherige Sendevorgang noch nicht fertig ist bzw. ob die Abschlusszeit des vorherigen Sendevorgangs eine Rolle spielt.

    Das geht eventuell auch wesentlich einfacher, wenn es ausreicht, falls der Abstand vom Abschluss des vorherigen Sendevorgang zum Beginn des nächsten Sendevorgangs 100 ms betragen soll, bzw. dass die Dauer des Sendevorgangs vernachlässigbar kurz ist. In dem Fall reicht es, einfach 100 ms zu warten.



  • Recounter schrieb:

    Wie mache ich das am besten?

    Zum Beispiel über einen periodischen Timer-Interrupt. Wie man den einrichtet, müsste in der Doku zu dem Board stehen.



  • Ich vermute mal, das eigentliche Programm soll parallel weiter laufen? In dem Fall: Steuerthread aufmachen. Dieser startet alle 100 ms einen weiteren Thread mit der Funktion. Zu klärende Fragen: Was ist, wenn der vorherige Sendevorgang noch nicht fertig ist bzw. ob die Abschlusszeit des vorherigen Sendevorgangs eine Rolle spielt.

    Das geht eventuell auch wesentlich einfacher, wenn es ausreicht, falls der Abstand vom Abschluss des vorherigen Sendevorgang zum Beginn des nächsten Sendevorgangs 100 ms betragen soll, bzw. dass die Dauer des Sendevorgangs vernachlässigbar kurz ist. In dem Fall reicht es, einfach 100 ms zu warten.

    Ich hatte mir auch überlegt einen Thread dafür aufzumachen, der andere Thread kann dann den Rest des Programmes übernehmen.
    Also die Sendezeit ist so kurz, dass diese keine Rolle spielt. Sprich einfach periodisch alle 100ms ein Ereignis aufrufen reicht vollkommen aus.

    Zum Beispiel über einen periodischen Timer-Interrupt. Wie man den einrichtet, müsste in der Doku zu dem Board stehen.

    Da steht leider garnichts zum Thema Timer. Lediglich in der ARM-Doku zum Prozessor stehen Infos, aber ich habe leider keine Zeit mich mit Programmierung auf Registerebene auseinanderzusetzen. Gibt es denn keine Standardisierten Methoden unter Linux dafür, sodass man sich als Benutzer nicht explizit darum kümmern muss?



  • Hardware-unabhängig bietet Linux das hier: http://man7.org/linux/man-pages/man2/timer_create.2.html



  • setitimer sollte wohl passen, falls dein Compiler das hat.



  • Also ich habe das ganze jetzt ganz simpel mit einem seperaten Thread gelöst:

    #include <unistd.h>
    ...

    while(1)
    {
    usleep(100000);
    //Sende Nachricht
    }

    Klappt vorerst wunderbar! 😃
    Vielen Dank aber für eure Hilfe und Vorschläge! 🙂



  • setitimer kommt ohne Threads aus.