Frage

ähnlich wie bei dieser Frage , würde ich die Ausführungszeit einer Funktion begrenzen möchte in C. ich stelle mir vor, dass C ++ Ausnahmen verwendet werden, um ein ähnliches Ergebnis wie dieser Python Lösung. Obwohl es nicht ideal ist, ein solcher Ansatz ist vollständig nicht verfügbar in Ebene C.

Ich frage mich also, wie könnte ich unterbrechen die Ausführung einer Funktion nach einem bestimmten Zeitintervall in C auf einem Posix-System? Bei relativ einfachen Situationen ein bisschen dummer ganz gut funktioniert, aber das trägt einen fairen Betrag von Code orthogonal zur Problemlösung. Sagen wir, ich habe eine Funktion, etwa so:

void boil(egg *e) {
    while (true)
    do_boil(e);
}

Ich will laufen kochen auf einem Ei * laufen, es alle 50 us unterbrochen wird, etwas zu überprüfen zu tun wie folgt:

egg *e = init_egg();
while (true) {
    preempt_in(50, (void) (*boil), 1, e);
    /* Now boil(e) is executed for 50μs, 
       then control flow is returned to the
       statement prior to the call to preempt_in.
     */
    if (e->cooked_val > 100)
        break;
}

Ich weiß, dass pthreads verwendet werden könnte, dies zu tun, aber ich bin eher daran interessiert, ihre Verwendung zu vermeiden. I könnte Schalter zwischen ucontext_t ist in einem SIGALRM Handler, aber die POSIX-Standard stellt fest, dass die Verwendung von SetContext / swapcontext ist nicht in der Tat in einem Signal-Handler und verwendet werden, stelle ich fest, unterschiedliche Verhaltensweisen zwischen Linux und Solaris Systeme, wenn dabei.

Ist dieser Effekt möglich zu erreichen? Wenn ja, in einer tragbaren Weise?

War es hilfreich?

Lösung

Just zu beachten, dass die allgemeine Fähigkeit Sie hier suchen heißt Kosten Durchsetzung . Zum Beispiel in diesem Artikel von Wellings oder in Leung et. al. der große Buch . Die oben genannten Antworten konzentrieren sich auf die es im Userspace zu erreichen; einige RTOS oder Sprachen unterstützt es (nicht Linux) als allgemeine Mechanismus.

Ein Beispiel Betriebssystem, das bietet das ist die AUTOSAR OS (spez verknüpft) . Beachten Sie, dass dieses Betriebssystem bietet Ausführungszeit Durchsetzung , die aus etwas anders Frist Durchsetzung. Ausführungszeit Durchsetzung hält immer schwieriger, als es auf eine gewisse Fähigkeit beruht, um die tatsächlichen Kosten aufgewendet zu messen (in der Regel mit Hardware-Zusammenarbeit). Mit der Komplexität der Prozessoren von heute, dann ist es schwierig und teuer, diese zu messen - nicht zu erwähnen, dass die Bedeutung der Messungen (durch nicht-lineare Ausführung und allerlei anderer coolen Sachen) sind schwer zu interpretieren - und damit schwer Ereignis zu berechnen a ( Worst- oder Common-) Fall Schätzung eines bestimmten Abschnitts der Ausführungszeit des Codes.

Ein wenig Off-Topic, aber Ada bietet eine strengere Reihe von Funktionen auf der Sprachebene hier, das hilft Ihnen nicht, aber man konnte herausfinden, wie diese Ada Anforderungen in Linux implementiert. Die Ada Sprache spec ist einzigartig in eine Begründung Dokument Bereitstellung finden Sie im Abschnitt Echtzeit-preemptive Abbruch als Ausgangspunkt.

Andere Tipps

Sie können entweder Threads verwenden, oder haben die Funktion Umfrage einen Timer (oder einen globalen Variable Satz von SIGALRM Handler), dann speichern seinen Zustand und Ausgang, wenn die vorgesehene Zeit abgelaufen ist. Die Verwendung von ucontext_t ist veraltet und soll nie in neuem Code verwendet werden, überhaupt, viel weniger von Signal-Handler.

Die Lösung, die ich plötzlich Lust kommt mir: gehe! Ich werde Setup ein Sprungpunkt kurz nach der Funktion, die ich zu begrenzen möchten, stellen Sie einen Timer und in der Signal-Handler, die beschäftigt sich mit der SIG * ALRM einfach nach der Funktion der Anweisung springen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top