Funktion nach Prio aufrufen

OP #4593827
Hallo zusammen,

ich hab in meinen Code 2 Funktionsaufrufe die nacheinander abgearbeitet 
werden. Nun ist es aber so, dass die eine Funktion die andere etwas 
stört. Das liegt daran, dass die eine Funktion ca. alle 0,5s aufgerufen 
werden sollte, die andere aber schon alleine 0,7s braucht bis sie 
abgearbeitet ist.
Die Funktion die "gestört" wird steuert einen Ausgang an und die andere 
die diese "Störung" verursacht, sendet ein Protkoll per UART.

Gibt eine Möglichkeit, die Funktion, ich nenne sie mal "UART-Funktion", 
unterbrechen zulassen und dann weiter zumachen, sobald die andere fertig 
ist. So eine Art selbst verzeugter Interrupt oder muss ich da einfach 
etwas Gehirnschmalz investieren ?

Gruss
#4593836
Du könntest die gestörte Funktion von einem Timer-Interrupt aufrufen 
lassen. Das ist aber kein schöner Stil. Versuche lieber die lange 
Funktion in mehrere kleine Teilfunktionen auf und dann kannst du 
zwischendurch die andere Funktion ausführen lassen.
Gast #4593854
Wenn du es richtig machen willst: Preemtive Scheduling aus einem Systick 
Interrupt mit ordentlichem Realtime Scheduling und Context Switches. 
Dafür nutzt man normal ein RTOS.
Gast #4593874
Peter F. schrieb:

> ich hab in meinen Code 2 Funktionsaufrufe die nacheinander abgearbeitet
> werden. Nun ist es aber so, dass die eine Funktion die andere etwas
> stört. Das liegt daran, dass die eine Funktion ca. alle 0,5s aufgerufen
> werden sollte, die andere aber schon alleine 0,7s braucht bis sie
> abgearbeitet ist.

0,7s??? Was macht diese Funktion? Berechnet sie den Sinn des Universums 
oder was? Also hier sollte man als erstes mal tiefer graben.

Wahrscheinlich braucht sie nur deshalb so lange, weil unzählige 
längliche delay() darin stecken. Wenn das der Fall ist, ist die Funktion 
einfach nur schwachsinnig programmiert. Die Funktionalität der Funktion 
ist in eine state-machine zu transformieren.

> Gibt eine Möglichkeit, die Funktion, ich nenne sie mal "UART-Funktion",
> unterbrechen zulassen und dann weiter zumachen, sobald die andere fertig
> ist. So eine Art selbst verzeugter Interrupt oder muss ich da einfach
> etwas Gehirnschmalz investieren ?

Wenn die Funktion einen guten Grund hat, so lange zu dauern (delay ist 
kein guter Grund) dann ist natürlich Gehirnschmalz zu investieren.

Man muss dann die Möglichkeit schaffen, eine Art Hintergrund-Task 
abzuarbeiten. Für unfähige C-Programmierer ist der einfachste Weg dahin 
die Verwendung eines Multitasking-OS. Da haben andere, fähigere Leute 
bereits diese Arbeit erledigt. Allerdings: natürlich nicht optimal auf 
das konkrete Problem zugeschnitten und dementsprechend mit an Sicherheit 
grenzender Wahrscheinlichkeit suboptimal für das konkrete Problem. Vor 
allem ist damit zu rechnen, dass Programmteile, die eine Quasi-Realtime 
voraussetzen, dann nicht mehr erwartungsgemäß funktionieren. U.a. 
sämtliche delays...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.