Threading für I/O in Rechtzeit-Embedded Systemen



  • Hallo,

    ich hab ein Realzeit Embedded System und würde darauf gern ein bisschen Software entwickeln.

    Der Großteil meiner Anwendung wird aus ein paar Zustandsmaschinen rausgeneriert und ich muss das alles jetzt nur noch geeignet auf eine Leitung rausschreiben.

    Beispiel: Meine Zustandsgeneratoren geben mir Funktionen zurück, die folgende Karakteristiken haben:

    void task_1(); // soll alle x ms aufgerufen werden
    void task_2(); // soll alle y ms aufgerufen werden
    void task_3(); // soll alle z ms aufgerufen werden
    

    Diesie Funktionen berechnen Werte und schreiben sie in statische Strukturen Output_1 (für Task 1), Output_2 (für task 2) usw. und analog werden Werte aus Strukturen Input_1 usw. Das ist einfach, wie der Codegenerator Code erzeugt und daran will ich wenig ändern. Ausserdem gilt, dass die Periodendauer deutlich größer ist, als die Dauer der Funktion.

    Um diese globalen Variablen rauszuschreiben, habe ich nun eine Funktion write und eine read-Funktion, die auf irgendein Medium draufschreiben, von dem gelesen werden muss. Da wird empfangsseitig erwartet, dass alle Variablen von Output_1 alle x ms rausgeschrieben werden. Das Lesen sollte dabei vermutlich irgendwie asynchron funktionieren, aber eben über diese read-Funktion (nicht über Interrupts, wie man es sonst oft im Embedded-Bereich macht).

    Meine Frage ist nun, wie man hier ein Taskmodell strukturiert.

    [code]
    int main() {
    periodic_task(task_1, x);
    periodic_task(task_2, y);
    periodic_task(task_3, z);

    periodic_task(write_Output_1, x);
    periodic_task(write_Output_2, y);
    ...

    periodic_task(read_all, min(x,y,z));

    while(1) ;
    }
    [code]
    Wobei mir periodic_task die Funktionen entsprechend alle n ms aufruft und dafür sorgt, dass sie nicht von anderen Funktionen unterbrochen werden.

    Ist das das offizielle Vorgehen? Oder muss ich noch irgendwas dazu festlegen (eine "Anfangsstartreihenfolge" bsp)?

    Oder führt man Funktionen wie
    [code]void fun_1() { task_1(); write_Output_1(); }[code] ein? Aber dann ist Output nicht mehr exakt getimed ... Und das reading so unterzubringen scheint mir auch nicht optimal gelöst!

    Habe leider vom Embedded-Bereich wenig Ahnung, das wäre sehr schön, wenn mir da jemand etwas helfen könnte und mich auf den richtigen Weg bringt!

    Viele Grüße



  • Soso, du willst also die totale Rechtzeit...



  • Klar, aber bis dahin reicht mir auch ne Antwort oder ein Link 🙂


Log in to reply