C routine abbrechen nach Timeout

Gast #4071468
Lesenswert?
• ▲
▼
Hallo,

ich habe eine Frage, kann ich eine C routine nach Timeout abbrechen?

Beispiel:

void function1()
{
    u8 result = callfunctionOnOtherCore();
    berechnung();
}

d.h. wenn die Funktion: callfunctionOnOtherCore() innerhalb 100µs kein 
Ergebnis liefert, soll sie abgebrochen werden und mit 
berechnung-Funktion weiter fortgesetzt werden?

zur Info: die Funktion: callfunctionOnOtherCore liegt auf einem anderen 
Kern.
#4071515
Lesenswert?
• ▲
▼
frager schrieb:
> zur Info: die Funktion: callfunctionOnOtherCore liegt auf einem anderen
> Kern.

Die Antwort hängt - wie so oft - vom Kontext ab, in dem das stattfindet. 
Bei den üblichen Betriebssystemen vgl. Windows/*ix ist das meist kein 
Problem, egal auf welchem Core. "Meist" deshalb, weil ein 
Thread/Prozess, der in einem Device Driver hängt, nicht immer 
abschiessbar ist.

Bei Bare Metal Programmierung ist das ebenfalls möglich und in Form von 
Watchdogs auch recht verbreitet. Aber der sauberste und einzig sichere 
Ausweg aus der als Folge möglichen Ressourcenkrise (z.B. I2C/... Status 
bleibt mittendrin hängen) ist ein Reset, weshalb Watchdogs üblicherweise 
damit operieren. Ohne Reset kann es funktionieren, oder kann alles 
durcheinander bringen, je nachdem wo abgebrochen wurde.

Wer also in Bare Metal Programmierung so ein Problem hat, der schreibt 
die betreffende Funktion so, dass sie selbst ihre Laufzeit kontrolliert 
und ggf. abbricht. Das ist sehr verbreitet und unterhalb der Axt "Reset" 
der sinnvollste Weg.
#4071780
Lesenswert?
• ▲
▼
A. K. schrieb:
> frager schrieb:
>> zur Info: die Funktion: callfunctionOnOtherCore liegt auf einem anderen
>> Kern.
>
> Die Antwort hängt - wie so oft - vom Kontext ab, in dem das stattfindet.
> Bei den üblichen Betriebssystemen vgl. Windows/*ix ist das meist kein
> Problem, egal auf welchem Core.

Naja, sagen wir mal so: Es gibt einen Weg, das zu machen, aber es ist 
selten eine gute Idee, weil es sehr schnell zu Ressourcen-Lecks und 
Deadlocks führt.

> Wer also in Bare Metal Programmierung so ein Problem hat, der schreibt
> die betreffende Funktion so, dass sie selbst ihre Laufzeit kontrolliert
> und ggf. abbricht. Das ist sehr verbreitet und unterhalb der Axt "Reset"
> der sinnvollste Weg.

Das ist nicht nur auf Bare Metal so.
Gast #4072147
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:
> Unter C kann man vor dem Aufruf der Funktion einen setjmp() setzen
> und
> dann aus dem Timerinterrupt longjmp() ausführen.
>
> Z.B. mit dem AVR-GCC geht das, ob die ungenannte Architektur das auch
> kann.

Wenn ich extern mit einem Timerinterrupt überwache brauche ich nur ein 
Label oder eine Adresse für den PC. Ich muss mir aber vorm 
Unterprogrammaufruf noch den Stackpointer merken.
#4072175
Lesenswert?
• ▲
▼
voll easy schrieb:
> Wenn ich extern mit einem Timerinterrupt überwache brauche ich nur ein
> Label oder eine Adresse für den PC. Ich muss mir aber vorm
> Unterprogrammaufruf noch den Stackpointer merken.

Und alle im Aufrufer genutzten und bei einem Aufruf bewahrten Register 
(callee-saved), so die Plattform welche hat. Womit du circa bei setjmp 
angekommen bist.
Persönliche Seite #4072860
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:
> Unter C kann man vor dem Aufruf der Funktion einen setjmp() setzen und
> dann aus dem Timerinterrupt longjmp() ausführen.

Und was soll das bringen?  Der Interrupt bzw. longjmp müsste ja auf dem 
anderen Core ausgelöst werden.  Willst du den anderen Core anhalten 
oder ein Hardware-Interrupt triggern, der im anderen Core eine IRQ 
auslöst?
#4073036
Lesenswert?
• ▲
▼
@Johann L. (gjlayde) Benutzerseite

>Und was soll das bringen?  Der Interrupt bzw. longjmp müsste ja auf dem
>anderen Core ausgelöst werden.  Willst du den anderen Core anhalten
>oder ein Hardware-Interrupt triggern, der im anderen Core eine IRQ
>auslöst?

Das ist die Kernfrage!

SCNR
#4073042
Lesenswert?
• ▲
▼
Wenn function1() auf Core A liegt und callfunctionOnOtherCore() auf Core 
B, dann ist das kein normales C. Oder callfunctionOnOtherCore() liegt 
doch auf Core A, wedelt aber mit dem Zauberstab um eine Funktion auf B 
auszulösen. Ohne die Mechanik dieser Magie zu kennen ist dann eine 
Antwort nicht möglich.

Wenn andererseits function1() bereits auf Core B läuft, dann geht 
setjmp/longjmp, indem man einen Interrupt auf Core B auslöst.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.