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
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.
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.
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.
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.
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.
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...
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...
Frank W. schrieb: > yS 1 yS (Yokto Siemens) = 1 YΩ (Yotta Ohm) = 1 Quadrillion Ohm Aber ich glaube er meint μs (Mikrosekunden).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.