Forum: Mikrocontroller und Digitale Elektronik Funktion nach Prio aufrufen


von P. F. (pfuhsy)


Lesenswert?

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

von Daniel R. (daro6)


Lesenswert?

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.

von P. F. (pfuhsy)


Lesenswert?

Daniel R. schrieb:
> Versuche lieber die lange
> Funktion in mehrere kleine Teilfunktionen auf und dann kannst du
> zwischendurch die andere Funktion ausführen lassen.

Das klingt gut. Danke für den Tipp.

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

Ich nehme mal an, es geht um einen Microcontroller.
Das gibt es so gut wie immer Uart funktionen, die per Interrupt laufen. 
Dann verbraucht sie  so gut wie keine Zeit mehr. Ein paar yS vielleicht.
Vielleicht hilft dir das ja.

von Guest (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

Peter F. schrieb:
> die andere aber schon alleine 0,7s braucht

Wenn du irgendwo in deinem Code delay benutzt, schmeiß es raus und 
programmiere es vernünftig.

von Daniel R. (daro6)


Lesenswert?

chris schrieb:
> Peter F. schrieb:
>> die andere aber schon alleine 0,7s braucht
>
> Wenn du irgendwo in deinem Code delay benutzt, schmeiß es raus und
> programmiere es vernünftig.

Oder auf die Hardware wartest...

von c-hater (Gast)


Lesenswert?

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...

von John (Gast)


Lesenswert?

Frank W. schrieb:
> yS

1 yS (Yokto Siemens) = 1 YΩ (Yotta Ohm) = 1 Quadrillion Ohm

Aber ich glaube er meint μs (Mikrosekunden).

von Peter D. (peda)


Lesenswert?

0,7s für die UART klingt so, als wenn Du keinen Interupt benutzt, 
sondern pollst.
Stelle sie auf FIFO mit Interrupt um.
Natürlich kannst Du dann trotzdem nicht alle 0,5s senden, wenn das 
Senden 0,7s dauert.

von Karl M. (Gast)


Lesenswert?

Guten Morgen,

John schrieb:
>> yS
>
> 1 yS (Yokto Siemens) = 1 YΩ (Yotta Ohm) = 1 Quadrillion Ohm
Wer hier ein "=" Gleichheitszeichen setzt, meint im mathematischen Sinn 
bestimmt etwas anderes.

https://de.wikipedia.org/wiki/Siemens_(Einheit)
1
S = 1/ Ohm = 1 /(V /A) = A /V

> Aber ich glaube er meint μs (Mikrosekunden).
Ja

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.