Forum: Mikrocontroller und Digitale Elektronik Zykluszeit abhängig vom programmdurchlaufzeit?


von Toni E. (johny123)


Lesenswert?

Wenn die Zykluszeit meines mikrocontrollers bspw. 10 ms beträgt, der 
Programmcode aber 20 Mikrosekunden braucht um ganz durchzulaufen, wird 
der programmcode alle 10ms neu gestartet auch wenn sich der programmcode 
ändert und größer wird?

Bedeutet das auch, dass eine Funktion immer im selben zeitlichen Abstand 
gestartet wird? Also 10ms zykluszeit, oder ändert sich der Abstand in 
jedem Durchlauf?

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

Toni E. schrieb:
> wird der programmcode alle 10ms neu gestartet auch wenn sich der
> programmcode ändert und größer wird

Wenn du einen Timer für dein einfaches Zeitscheiben-Scheduling nutzt, 
ja.

Im allgemeinen haben Mikrocontroller an sich keine Zykluszeit wie SPSen, 
außer man bringt es ihnen bei.

mfg mf

von J. S. (jojos)


Lesenswert?

Der μC hat keine Zykluszeit, sowas macht das spezifische Programm und 
das kann man so oder so oder anders machen.

von Rainer W. (rawi)


Lesenswert?

Toni E. schrieb:
> ... wird der programmcode alle 10ms neu gestartet ...

Nein, solange du nicht irgendwelche Dinge mit Watchdog o.ä. 
programmierst, läuft des Programm immer durch.

von Veit D. (devil-elec)


Lesenswert?

Toni E. schrieb:
> Wenn die Zykluszeit meines mikrocontrollers bspw. 10 ms beträgt, der
> Programmcode aber 20 Mikrosekunden braucht um ganz durchzulaufen, wird
> der programmcode alle 10ms neu gestartet auch wenn sich der programmcode
> ändert und größer wird?

Hallo,

die Zykluszeit deines Controllers sind deine 20us. Während eines 
Programmdurchlaufes wird immer wieder geschaut was zu tun ist. Deine 
10ms Aktion ist nur eine Folge davon. Die Zykluszeit wird in der Praxis 
immer leicht variieren je nach Programmstruktur.

> Bedeutet das auch, dass eine Funktion immer im selben zeitlichen Abstand
> gestartet wird? Also 10ms zykluszeit, oder ändert sich der Abstand in
> jedem Durchlauf?

Das hängt davon ab wie die zeitliche Abhängigkeit programmiert ist.

von Christoph M. (mchris)


Lesenswert?

Toni E:
>Wenn die Zykluszeit meines mikrocontrollers bspw. 10 ms beträgt, der
>Programmcode aber 20 Mikrosekunden braucht um ganz durchzulaufen, wird
>der programmcode alle 10ms neu gestartet auch wenn sich der programmcode
>ändert und größer wird?

Wenn der Programmcode unterschiedlich lange braucht, kannst Du eine 
Schleife mit einem Timer synchronisieren:

Beitrag "Re: rollover save timer in c"

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Toni E. schrieb:
> Wenn die Zykluszeit meines mikrocontrollers bspw. 10 ms beträgt
Ein üblicher RISC-Prozessor mit 10 MHz Taktfrequenz braucht für 1 
Maschinenzyklus 100ns. Also ist diese "Zykluszeit" 100ns. Weil das um 
den Faktor 100000 niedriger ist als deine Angabe, kann diese Zykluszeit 
nicht gemeint sein. Also die Frage: was ist in deinem Satz mit 
"Zykluszeit" gemeint?

> der Programmcode aber 20 Mikrosekunden braucht um ganz durchzulaufen
Dann wäre die Zykluszeit meines Programms 20µs. Denn das Abwarten bis 
zum nächsten 10ms-Tic bedeutet 9,98 ms Rechenzeitvergeudung, was in 
einer Nutzungseffizienz von 0,2% gipfelt. Oder andersrum: 99,8% der von 
deinem µC aufgenommenen Energie ist vergeudet. Miserable Bilanz.

> wird der programmcode alle 10ms neu gestartet auch wenn sich der
> programmcode ändert und größer wird?
Zeig doch einfach mal deinen Code...

: Bearbeitet durch Moderator
von Axel S. (a-za-z0-9)


Lesenswert?

Toni E. schrieb:
> Wenn die Zykluszeit meines mikrocontrollers bspw. 10 ms beträgt, der
> Programmcode aber 20 Mikrosekunden braucht um ganz durchzulaufen, wird
> der programmcode alle 10ms neu gestartet ...

Du schreibst hier einmal Milli- und das andere Mal Mikrosekunden. Ist 
das ein Schreibfehler?

> Bedeutet das auch, dass eine Funktion immer im selben zeitlichen Abstand
> gestartet wird? Also 10ms zykluszeit, oder ändert sich der Abstand in
> jedem Durchlauf?

Ein Mikrocontroller hat nicht so etwas wie eine Zykluszeit (bzw. 
bezeichnet der Begriff da was ganz anderes, siehe Lothars Post). Ein 
Mikrocontroller ist keine SPS.

Ein Mikrocontroller arbeitet sein Programm ab. Meist ein Programm, das 
in einer Endlosschleife läuft. Und dann kann jeder Schleifendurchlauf 
mit einer Uhr synchronisiert sein. Aber das ist nicht zwingend so, 
sondern eher ein seltener Spezialfall. Und dann hängt es von der 
Implementierung ab, ob ein einmal begonnener Schleifendurchlauf nach 
einer festen Zeit abgebrochen wird, oder ob die Schleife einfach länger 
dauert. In den weitaus meisten Fällen letzteres.

Wenn ein Mikrocontroller zu festen Zeitpunkten etwas ausführen soll, 
gibt es i.d.R. bessere Methoden dafür. Etwa einen Timer mit einer 
ISR[1]. Aber auch da gibt es natürlich das Problem, daß der Code in der 
ISR nicht länger dauern darf als bis zum nächsten Timer-Interrupt. Auch 
in diesem Fall wird sonst ein Interrupt "verpaßt", sprich einfach 
ausgelassen.


[1] ISR = Interrupt Service Routine.

: Bearbeitet durch User
von Achim H. (pluto25)


Lesenswert?

Lothar M. schrieb:
>  was in einer Nutzungseffizienz von 0,2% gipfelt
Anstelle 10MHz mit 128kHz takten  = Effizienz 9x % ;-)

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Toni E. schrieb:
> Wenn die Zykluszeit meines mikrocontrollers bspw. 10 ms beträgt, der
> Programmcode aber 20 Mikrosekunden braucht um ganz durchzulaufen, wird
> der programmcode alle 10ms neu gestartet auch wenn sich der programmcode
> ändert und größer wird?
Bisher dachte ich, das Konzept "Zykluszeit" halbwegs verstanden zu 
haben.
Du machst mir zweifeln.

Welche Bedeutung hat für dich das Wort "Zykluszeit"?

von Veit D. (devil-elec)


Lesenswert?

Axel S. schrieb:

> Ein Mikrocontroller hat nicht so etwas wie eine Zykluszeit (bzw.
> bezeichnet der Begriff da was ganz anderes, siehe Lothars Post). Ein
> Mikrocontroller ist keine SPS.

Hier muss ich leider widersprechen. Egal ob µC oder SPS. Die Definition 
der Zykluszeit ist immer gleich. Ein Durchlauf des Programms definiert 
die Zykluszeit. Die kann und wird auf einem µC und auch SPS je nach 
Programmverzweigungen immer schwanken. Die Besonderheit einer SPS ist 
noch das man eine Mindest- und Maximal-Zykluszeit einstellen kann und 
diese überwacht werden.

Bevor darüber Diskussionen aufkommen. Steht alles im Siemens 
Funktionshandbuch.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Nichts gegen die Siemens Handbücher, aber sind sie hier anwendbar?
Und wenn, dann würde der TO doch sicher zuerst da nachschauen.
Sonderlich geheim sind die ja nicht.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

es beschreibt was die Zykluszeit bei einer SPS ist. Nämlich die Zeit 
genau eines Programmdurchlaufes. Das ist auf einem µC genau das Gleiche. 
Darum ist die Begrifflichkeit für SPS und µC auch gleich. Mehr wollte 
ich nicht sagen.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Veit D. schrieb:
> Darum ist die Begrifflichkeit für SPS und µC auch gleich.
Ähnlich, mag sein....
Vom TO habe ich nichts von SPS gehört.

Auf µC werden auch mal Round-Robin Verfahren eingesetzt. Dann bekommt 
der Begriff schon einen anderen "Geschmack".

Beitrag #7582163 wurde vom Autor gelöscht.
von Veit D. (devil-elec)


Lesenswert?

Hallo,

du hast aber schon gesehen das ich mich ursprünglich auf Axel bezogen 
und ihn zitiert habe?

von Lu (oszi45)


Lesenswert?

Toni E. schrieb:
> oder ändert sich der Abstand in jedem Durchlauf?
Kommt auf Dein Programm an. Wenn eine CPU verschiedene Befehle bekommt, 
können diese verschieden lang brauchen.

Axel S. schrieb:
> Wenn ein Mikrocontroller zu festen Zeitpunkten etwas ausführen soll,
> gibt es i.d.R. bessere Methoden dafür. Etwa einen Timer mit einer ...

von Axel S. (a-za-z0-9)


Lesenswert?

Veit D. schrieb:
> Axel S. schrieb:
>
>> Ein Mikrocontroller hat nicht so etwas wie eine Zykluszeit (bzw.
>> bezeichnet der Begriff da was ganz anderes, siehe Lothars Post). Ein
>> Mikrocontroller ist keine SPS.
>
> Hier muss ich leider widersprechen. Egal ob µC oder SPS. Die Definition
> der Zykluszeit ist immer gleich. Ein Durchlauf des Programms definiert
> die Zykluszeit.

Und wenn ich gar kein Hauptprogramm im herkömmlichen Sinn habe, sondern 
alles in ISR (Plural) erledige? Dann besteht mein "Hauptprogramm" aus 
Initialisierung und einer sehr kurzen Endlosschleife. Eventuell noch mit 
einem SLEEP darin. Sowas habe ich auch schon gemacht.

Ganz allgemein stimmt das mit der Zykluszeit nicht mehr, sobald man 
irgendeine Art von Nebenläufigkeit hat.

von Peter (pittyj)


Lesenswert?

Veit D. schrieb:
>> Ein Mikrocontroller hat nicht so etwas wie eine Zykluszeit (bzw.
>> bezeichnet der Begriff da was ganz anderes, siehe Lothars Post). Ein
>> Mikrocontroller ist keine SPS.
>
> Hier muss ich leider widersprechen. Egal ob µC oder SPS. Die Definition
> der Zykluszeit ist immer gleich. Ein Durchlauf des Programms definiert
> die Zykluszeit. Die kann und wird auf einem µC und auch SPS je nach
> Programmverzweigungen immer schwanken. Die Besonderheit einer SPS ist
> noch das man eine Mindest- und Maximal-Zykluszeit einstellen kann und
> diese überwacht werden.
>
> Bevor darüber Diskussionen aufkommen. Steht alles im Siemens
> Funktionshandbuch.

Also ich programmiere auf Controllern jetzt >15 Jahre. Diverse Modelle, 
diverse Einsatzgebiete.
Aber so etwas wie Zykluszeit hatte ich noch nie. Es gibt dort kein 
Programm, welches durchläuft. Das Programm läuft immer, und kommt nie an 
ein Ende. So etwas ist gar nicht vorgesehen. Gewisse Dinge lauf alle 
10mS, andere jede Sekunden, wiederum andere nur auf Interrupt, oder bei 
externem Input.
Manchmal habe ich auch mehrere Threads, die parallel laufen, vollkommen 
asynchron.

Die einzige Zykluszeit kenne ich bei meiner Freundin. Aber das ist eine 
andere Geschichte.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> Also ich programmiere auf Controllern jetzt >15 Jahre. Diverse Modelle,
> diverse Einsatzgebiete.
> Aber so etwas wie Zykluszeit hatte ich noch nie.
Weil meine Programme auf µC üblicherweise Zustandsautomaten in der 
Mainloop sind, ist 1 Durchlauf der Mainloop ein "Zyklus". Wenn diese 
Zykluszeit größer als 10ms wird, dann habe ich noch Verbesserungbedarf 
und muss z.B. irgendwelche Berechnungen in 2 "Häppchen" unterteilen.

> Gewisse Dinge lauf alle 10mS, andere jede Sekunden, wiederum andere nur
> auf Interrupt, oder bei externem Input.
> Manchmal habe ich auch mehrere Threads, die parallel laufen, vollkommen
> asynchron.
Dieses Modell geht von "unendlicher" Rechenleistung aus. Es geht von 
Null Jitter auf den Zeitscheiben und jederzeitiger umgehender Reaktion 
auf einen Interrupt aus. Da wundert sich dann so mancher, warum sein 
Programm manchmal "stolpert". Frag mal unsere Softies. So mancher meint, 
ein Quadcore könne tatsächlich "gleichzeitig" auf den einzigen 
Speicherbus zugreifen.

Axel S. schrieb:
> alles in ISR (Plural) erledige? Sowas habe ich auch schon gemacht.
Ja, bei Abhängigkeiten hat mann dann aber pfeilschnell ein 
Semaphorenproblem an der Backe. Wenn z.B. ein Read-Modify-Write 
Portzugriff  wie z.B. das Manipulieren eines einzelnen Bits im Port 
unterbrochen wird und in dieser unterbrechenden ISR am selben Port 
ebenfalls ein Pin beschrieben werden soll.

Da hat man dann Glück, wenn es beim verwendeten µC nur 1 Interruptlevel 
gibt...

: Bearbeitet durch Moderator
von Axel S. (a-za-z0-9)


Lesenswert?

Lothar M. schrieb:
> Axel S. schrieb:

>> alles in ISR (Plural) erledige? Sowas habe ich auch schon gemacht.

> Ja, bei Abhängigkeiten hat mann dann aber pfeilschnell ein
> Semaphorenproblem an der Backe. Wenn z.B. ein Read-Modify-Write
> Portzugriff wie z.B. das Manipulieren eines einzelnen Bits im Port
> unterbrochen wird und in dieser unterbrechenden ISR am selben Port
> ebenfalls ein Pin beschrieben werden soll.

Ja, man muß schon wissen was man macht. Immer und überall. Sonst bleibt 
man auf ewig im Sandkasten sitzen.

Das mag zwar gut mit der politischen Richtung zusammenstimmen die die 
Infantilisierung aller Lebensbereiche eifrig vorangetreibt (Stichwort: 
betreutes Denken), aber es ist auch die Ursache des stetigen Abrutschens 
Deutschlands, ja des gesamten Westens im Vergleich mit z.B. China.

Ansonsten war das nur ein Beispiel, wie man ein µC-Programm ohne ständig 
durchlaufene Hauptschleife schreiben kann. Eine andere wäre eine 
blockierende Hauptschleife, weil es ohne das entsprechende Ereignis 
schlicht nichts zu tun gibt. Nicht jede Vorgehensweise paßt für alle 
Probleme. Aber zum Glück haben wir ja einen µC (und keine SPS) und wir 
haben die Wahl.

von Peter D. (peda)


Lesenswert?

Axel S. schrieb:
> Und wenn ich gar kein Hauptprogramm im herkömmlichen Sinn habe, sondern
> alles in ISR (Plural) erledige?

Dann kann man doch viel besser in der Mainloop die Flags pollen und den 
Code ausführen. Das geht sogar nen Tick schneller als sich ständig den 
Interruptoverhead (Kontext sichern, wiederherstellen) ans Bein zu 
binden. Und der Compiler kann viel besser optimieren 
(Registervariablen), da nur eine Instanz. Daher auch kein 
volatile/atomic Hassle notwendig. Außerdem kann kein häufiger Interrupt 
die langsamen verdrängen, jeder kommt mal dran.
Interrupts sollte man nur für die Tasks anlegen, die andere unterbrechen 
müssen, d.h. einen höheren Level auch benötigen.

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.