Forum: Mikrocontroller und Digitale Elektronik zeitgleicher Abarbeitung mehrerer Programme


von Michael (Gast)


Lesenswert?

hallo
    "und wieder ein neuer"

ich beschäftige mich seit kurzem mit der Programmierung von
Mikrokontrollern.
mein erstes Großprojekt soll eine Uhr mit dcf empfang werden

    "schon wieder gibt es doch schon tausende"

Mit PHP konnte ich bereits einige Programmiererfahrungen sammeln, so
dass ich mich in die Programmierung mit Assembler gut reingefunden
habe.
Die Programmierung der Uhr möchte ich auch weitestgehend alleine
hinbekommen.
Jedoch könntet ihr mir bei einer Verständnisfrage weiterhelfen:
Meine Uhr soll möglichst aus dem Kontroller, Leeds, einem Widerstand
für den Reset und einem Kondensator um Stromschwankungen abzufangen
bestehen. Ich möchte möglichst wenig Peri-pheriegeräte verwenden. Also
auch keinen externen Quarz oder Oszillator.
Programmiert wird ein atmega16 in Assembler.

zum ersten wisst ihr, inwieweit ich die Ausgänge des Kontroller
belasten kann?

und zum zweiten und das ist wohl mein hauptsächliches Problem:

Können verschiedene Programme zeitgleich abgearbeitet werden?

Zur Verdeutlichung meiner Frage... bis jetzt nutze ich eine 3 bit
Countdown zur Erzeugung eines 1Hz Signals mit dem ich meine Uhr
vorwärts treibe. Wenn ich nun aber diese Schleife verlasse, um ein
Unterprogramm aufzurufen (Stundenton, Tastendruck, DCF Empfang usw.)
würde der Zähler meiner Uhr stehen bleiben und die Uhr genau um die
Zeit des ausgeführten Programms nachgehen. Kann ich also irgendwie
meinem 3 bit Countdown im Hintergrund laufen lassen, ohne das dieser
durch meine anderen Programme unterbrochen wird?

vielen Dank für eure Bemühungen

Gruß ich

von Alex (Gast)


Lesenswert?

Ausgangsbelastung:
-> Datenblatt

paralleles Arbeiten:
-> nicht auf einem 8-Bit Controller

Die Lösung für dein Problem könnten z.B. Interrupts sein. Nimm eines
der diversen verfügbaren Codebeispiele und orientiere dich daran. Es
gibt verschiedene Lösungsansätze.

von Daniel (Gast)


Lesenswert?

Hallo,

also für erstens gibt es im Datenblatt Hinweise, daher kann ich das aus
dem Stehgreif auch nicht sagen.
Bei zweitens gibt es wohl meherere Möglichkeiten :
1. Wenn die Bearbeitung eines Zeitgeberereignisses nur wenig Zeit in
Anspruch nimmt und/oder die restlichen Aufgaben auch mal dmit
klarkommen kurz zu warten, dann bietet sich die Bearbeitung eines
Zeitgeberereignisses mit einem Interrupt an. Im Klartext : Zähler löst
einen Interrupt aus - Programm bearbeitet das Ereignis (z.B. nächsten
Sekundenwert auf dem Display anzeigen) und dann geht deer Rest weiter.
2. Ein Echtzeitbetriebssystem (klingt hart, ist aber bei AVR möglich).
Als lohnender Hinguckpunkt kann man sich mal freeRTOS
(www.freeRTOS.org) anschauen. Es ist nicht soo schwer dafür
Appliaktionen zu entwickeln und gut als Einstieg in Betriebssysteme zu
gebrauchen. Da es auch ganz gut skaliert, ist es auch für low-end
Mikrocontroller (AVRs gehören da nun mal dazu) ganz gut zu gebrauchen.

MfG, Daniel.

von ERDI - Soft (Gast)


Lesenswert?

Nimm nen Timer für deine Uhr und nen externen 32,768kHz Quarz. So
brauchst du nicht ständig auf DCF zu synchronisieren und hast trotz
internem Haupttakt nen anständig genauen Sekundentakt.
Guck im Datenblatt nach asynchronem Timer.

von Peter Dannegger (Gast)


Lesenswert?

Man kann mit 8-Bittern sehr wohl sehr viele Prozesse parallel
abarbeiten.

Der Trick ist eine Main-Loop, in der alle Prozesse schnell
hintereinander ablaufen.
Dadurch entsteht der Eindruck, daß sie quasi gleichzeitig ausgeführt
werden.
Dabei sind die Prozesse so zu programmieren, daß sie nicht stopppen
dürfen (Delay oder warten auf ein Signal) sondern dann für die
ungenutzte Rechenzeit wieder zum Main zurück kehren.


Hier mal ein Beispiel:

http://www.mikrocontroller.net/forum/read-4-23408.html#new


Peter

von Michael (Gast)


Lesenswert?

ok
ich danke euch.
ich werd mich mal in alle richtungen durchprobieren. und mal schauen ob
ich eines davon verwenden kann.

bei der belastung der ausgänge wollte ich es mir leicht machen (ich bin
faul ich weiß) und schauen ob es jemand von euch sofort parat hat.
nungut ich werde ins datenblatt schauen.

vieln dank für eure hilfe


gruß ich

von Alex (Gast)


Lesenswert?

"Man kann mit 8-Bittern sehr wohl sehr viele Prozesse parallel
abarbeiten."

"alle Prozesse schnell hintereinander ablaufen"

Du bestätigst mich :-)

von Rahul (Gast)


Lesenswert?

Wie soll es auch gehen, dass ein Prozessor sich gleichzeitig mit
mehreren Sachen beschäftigen kann?

Multitasking ist immer mit einem zeitlichen Versatz behaftet.
Bei vernünftigen Systemen ist dieser zeitliche Versatz als konstant
festgelegt (Zeitfenster für jede Aufgabe).
Windows arbeitet nach einem anderen Prinzip...

von Daniel (Gast)


Lesenswert?

Hallo schon wieder :

"Multitasking ist immer mit einem zeitlichen Versatz behaftet."
Stimmt nicht, wenn ein explizit multitaskingfähiger Prozessor verwendet
wird, oder die Prozesse aufeinander synchronisiert sind.

"Bei vernünftigen Systemen ist dieser zeitliche Versatz als konstant
festgelegt (Zeitfenster für jede Aufgabe)."
Stimmt leider überhaupt nicht, das Zeitscheibenverfahren wird nur in
einer Unterklasse von Multitaskingsystemen verwendet. Zum Beispiel
müssen Echtzeitbetriebssysteme nach einem anderen Prinzip arbeiten, bei
dem höherpriorisierte Prozesse so lange areiten, wie sie wollen und dann
erst wieder die niedriger priorisierten Prozesse drankommen, sonst kann
das Zeitverhalten nur schwer kontrolliert werden (oder ist eben
starr).

"Windows arbeitet nach einem anderen Prinzip..."
Da muss ich die vollkommen zustimmen :-)

MfG, Daniel

von Rahul (Gast)


Lesenswert?

jetzt weiß ich auch wieder, was da noch gefehlt hat.
Das mit den Prioritäten...

von Peter Dannegger (Gast)


Lesenswert?

Auch bei Multitasking läuft alles auf einer CPU nacheinander ab. Nur ein
Multiprozessorsystem kann echt parallel arbeiten.

Multitaskingsysteme können Prozesse an beliebiger Stelle unterbrechen,
d.h. auch, wenn sie auf etwas warten.

Der große Nachteil ist dabei, sie können die Programme im ungünstigsten
Zeitpunkt unterbrechen, d.h. wenn sie gerade die größte Menge an
Reccourcen (SRAM) belegt haben. Es muß also für jeden Prozess das
Maximum an SRAM freigehalten werden.

Der 2. Große Nachteil ist, daß auch die Aktualisierung von Parametern
unterbrochen werden kann, d.h. ungültige Daten an einen anderen Prozeß
übergeben werden.

Daher ist es auf µCs deutlich einfacher und sicherer die Prozesse
nacheinander in der Main-Loop auszuführen.


Peter

von Daniel (Gast)


Lesenswert?

Hallo Peter,

ich muss Dir im Bezug auf die Aussage : "Parallelität ist nur auf
Multiprozessorsystemen möglich" wirdersprechen. Es exsitieren
definitiv Mikroprozessoren und auch Controller, welche explizit mehrere
Kontrollfäden gleichzeitig ausführen. Keine Unterbrechungen der
Einzelprozesse findet dabei statt.

Man kann des Weiteren auch die anderen Probleme, welche Du angesprochen
hast lösen. Dafür existieren in Betriebssystemen schließlich
Synchronisationsobjekte. Sogar das kooperative, geschützte und
exhtzeitfähige Zugreifen auf Peripherie, welche man mal nicht so eben
umschalten kann, ist definitiv möglich und wird auch eingesetzt.

Ich stimme Dir aber sofort zu, wenn Du sagst, dass dies natürlich zu
einem gewissen Eigenresourcenverbrauch führt. Es gibt
selbstverständlich keinen Grund in einer Wetterstation für den
Wohnzimmerschrank Echtzeitbetriebssysteme einzusetzen, bei der
zunehmenden Komplexität von Autromatisierungsgeräten ist dies ein Trend
der nicht wegzuleugnen ist. Man kann selbstverständlich beide Wege
beschreiten (also einerseits alles durch Überlegung im Vorfeld und eine
geschickte zeitliche Steuerung erledigen oder andererseits  ein
Betribessystem und Tasksysnchronisierung verwenden), die  Abwägung ,
was zu Einsatzt kommt, wird wahrscheinlich in jedem Einzelfall nötig
sein.

MfG, Daniel

von Alex (Gast)


Lesenswert?

@Daniel

" mehrere Kontrollfäden gleichzeitig ausführen"

Da wäre ich an einem konkreten Beispiel interessiert.

von Rufus T. Firefly (Gast)


Lesenswert?

Könnte hier von Intels "Hyperthreading" die Rede sein? Ein P4 ist weit
entfernt von einem µC, aber ein Prozessor soll das Teil ja angeblich
sein. Ich hielte es eher für eine Art datenverarbeitende Kochplatte,
aber das tut hier nichts zur Sache.

von Alex (Gast)


Lesenswert?

Hyperthreading emuliert ja nur einen zweiten Rechenkern, quasi als
Zwischenschritt zu Prozessoren mit mehreren Kernen.

von Mike (Gast)


Lesenswert?

Meiner Meinung nach können DSPs zumindestens in gewissem Umfang Beehle
parallel abarbeiten. Wobei das natürlich nciht bei allen Befehlen
klappt, also keine echte Parallelität.

von Peter Dannegger (Gast)


Lesenswert?

Die DSPs können nur mehrere Befehle einer Befehlssequenz einlesen und
dann parallel ausführen, d.h. die Befehle gehören alle zu einem
einzigen Prozeß.

Für echte Parallelität zweier Prozesse ohne Taskumschaltung müßte die
CPU ja 2 Programmcounter haben.


Peter

von A.K. (Gast)


Lesenswert?

"Echtzeitbetriebssysteme" klingt riesig. Kann sein es ist nicht
anderes als ein Satz von Routinen zur Verwaltung von Prozessen, Timern,
Semaphoren und Messages. Beispiel AvrX: unter 1,5KB.

Unterscheiden muss man zwei Varianten: (1) preemtives Multitasking und
(2) kooperatives Multitasking. AvrX kann nur (1), FreeRTOS beides.

Bei (1) können Prozesse an beliebiger Stelle unterbrochen werden. Was
einserseits schnelle Reaktionen ermöglicht, andererseits die von Peter
erwähnten Probleme im Umgang mit gemeinsam benutzten Daten zur Folge
hat. Freilich: Das sind exakt die gleichen Probleme die man auch mit
von Interrupts benutzten Daten und Ports hat. Nichts neues also, nur
mehr davon.

In (2) findet die Umschaltung zwischen Prozessen ausschliesslich an
dafür vorgesehenen Stellen statt. Probleme mit gemeinsamen Variablen
entstehen also nicht. Zum Ausgleich muss der Programmierer dafür
sorgen, dass die häufig genug auftreten, sonst leidet die
Reaktionsfähigkeit.

Die Programmierung ist durchaus etwas komplexer - schon weil man das
erst einmal lernen muss. Andererseits können die entstehenden Programme
übersichtlicher und insbesondere lesbarer sein. Denn in der klassischen
µC-Programmierung verteilt sich der Code einer Teilaufgabe auf diverse
zunächst zusammenhanglose Häppchen, in Hauptprogramm und Interrupts. In
welcher Reihenfolge das abgearbeitet wird, erschliesst sich dem Leser
(oder Programmierer der sich den eigenen Mist nach Jahren wieder
ansehen muss) dabei allenfalls durch die i.d.R. nicht vorhandenen
Doku.

In RTOS bleibt der Programmablauf geschlossen am Stück im jeweiligen
Hauptprogramm. In Interrupts passiert wenig, idealerweise wird dort nur
der betroffene Prozess wieder aufgeweckt.

Ein weiterer Vorteil: Man ist schon grundstzlich vorbereitet auf die
PC-Programmiertechnik der kommenden Jahre und Jahrzehnte. Denn was
heute mit P4-Hyperthreading schon akut ist - mit den neuen Multicores
wird es mehr und mehr selbstverständlich: in einem einzigen Progeamm
mehreren Prozessoren auslasten zu können.

von Andreas Siebel (Gast)


Lesenswert?

Echte Parallelität gibt es nur mit mehreren unabhängigen Rechenwerken
und eigentlich auch Speichern. Denn was macht der eine wenn der andere
auf den SPeicher zugreift?!?!  WARTEN... und das spricht eindeutig
gegen  Parallelität.

Zu Echtzeitbetriebsystemen: Ein Merkmal ist die definierte Zeit, die
jedem Proßess eingeräumt wird und eine definierte Zeit wann er
abgearbeitet wird. Nimmt man jetzt Priorisierung, dann ist ein System
nicht mehr Echtzeitfähig, weil Prozesse höherer Priorität die
niedrigerer Priorität verdrängen können.

von A.K. (Gast)


Lesenswert?

Ich nehme an, Du gibst wichtigen Prozessen immer die niedrigste
Priorität, damit sie möglichst leicht von unwichtigen Prozessen mit
hoher Priorität verdrängt werden können?

Im Ernst: Du kannst in jeden noch so echtzeitfähigen System Programme
schreiben, die kein bischen echtzeitfähig sind.

Priortäten dienen natürlich umgekehrt dazu, echtzeitrelevante
Programmteile (hohe Prio) von den anderen (niedrige Prio) unterschieden
zu können. Meist gibt's nämlich beide.

von Andreas Siebel (Gast)


Lesenswert?

@A.K.

EIn echtes Echtzeitbetriebsystem garantiert den Proßessen zu einer
bestimmten Zeit eine bestimmte Mindestrechenzeit zu bekommen. Was der
Benutzer dann mit den Einzelnen Proßessen anfängt ist seine Sachen.

Gibt es aber eine Priorisierung kann ich "mir" als Prozess nicht mehr
sicher sein und bin vom gut dünken der "anderen" abhängig. Denn die
können sich ja selber als "total wichtig" bezeichnen.

von A.K. (Gast)


Lesenswert?

"Was der Benutzer dann mit den Einzelnen Proßessen anfängt ist seine
Sachen."

"Denn die können sich ja selber als "total wichtig" bezeichnen."

Wovon bitte reden wir hier? Echtzeitsysteme sind doch keine
Timesharing-Systeme wie in den 70ern. Da war es essentiell, dass nicht
ein Anwender alle anderen Anwender rauswerfen konnte. Aber hier geht es
um Microcontroller. Um Programme deren Teile immer miteinander
kooperieren können. Oder benutzt man bei dir die Heizungssteuerung
nebenbei auch fürs Homebanking?

Natürlich kann der Prozess sich als wichtig deklarieren und damit elle
lahmlegen. Der Prozess, beispielsweise eine Analogdatenerfassung, kann
auch nur so zum Spass auch mal ganz was anderes machen. Er kann wenn er
will auch mal so eben im Flash rumlöschen. Macht diese Möglichkeit jeden
AVR,MSP430,ARM7 prinziell nicht echtzeitfähig?

von A.K. (Gast)


Lesenswert?

"Um Programme deren Teile immer miteinander kooperieren können."

Sollte heissen: ... immer miteinander kooperieren müssen.

von Michael (Gast)


Lesenswert?

ich weiß: ich habe gefragt...

aber ich bin maßlos überfordert


muß ich nen neuen thread anfangen oder kann mir einer von euch noch
sagen wie dieses problem sonst üblicherweise gelöst wird.
ich könnte mir noch vorstelle, am ende jeden unterprogrammes den zähler
meines contdown genau um die takte zu verkürzen die mein unterprogramm
braucht. aber wie mache ich das bei programmen, die länger als eine
sekunde sind bzw die genau die schaltzeit einer sekunde erwischen. dann
steht meine uhr wieder.

viele grüße

ich

von A.K. (Gast)


Lesenswert?

"muß ich nen neuen thread anfangen"

Und gib ihm einen harmloseren und mehr dem Problem zugewandten Titel.

von Andreas Siebel (Gast)


Lesenswert?

@A.K.

Ich wollte zur Begriffsbestimmung beitragen.

Mit Begriffen wie "RTOS" wird immer leicht durch die Gegend geworfen.
Multiproßessfähigkeit ist ja was anderes.

Die Echtzeitfähigkeit eines Betriebssystemes hat mit dem Prozessor nix
zu tun. Hab ich auch nicht behauptet. Es ist eine Eigenschaft des
Betriebssystems. Echtzeit heisst auch nicht schnell. Kannst ja dein
Echtzeitbetriebssystem auch spezifizieren mit "Jeder Proßess bekommt
in der jeder Minute mindestens 10 ms. Es muss nur garantieren, dass
dieses passiert.

von A.K. (Gast)


Lesenswert?

"Die Echtzeitfähigkeit eines Betriebssystemes hat mit dem Prozessor nix
zu tun. Hab ich auch nicht behauptet."

Indirekt schon. Wenn bei dir ein Prozess nicht das Recht haben darf,
sich die höchste Priorität zu geben, dann darf er analog auch nicht das
Recht haben, den Controller umzuprogrammieren. Und der Prozessor brauch
dann eine Rechteverwaltung (MMU, User/Supervisor-Mode).

Denn kein Programm/Prozess, keine Funktion in einem Microcontroller
darf sich daneben benehmen. Darf nicht, auch wenn's technisch ginge.
Also darf er auch die Prio nur ändern, wenn es der Anforderung
entspricht. Und dann ist es ok.

Aber Du verwechselst ohnehin Echtzeit- mit Mehrbenutzersystemen.
Zumindest im hier üblichen Kontext. Die Echtzeitsysteme, von denen hier
die Rede ist, sind prinzipiell keine Mehrbenutzersysteme, sondern für
solche Microcontroller.

Hier ist auch nicht die Rede von der berüchtigten Frage, inwieweit
Windows oder Linux echtzeitfähig sind. Das ist eine gänzlich andere
Grössenordnung.

von Michael (Gast)


Lesenswert?

@all

"muß ich nen neuen thread anfangen"

  "Und gib ihm einen harmloseren und mehr dem Problem zugewandten
Titel."


ich hoffe das ist nur die meinung eines einzelne.

wer nicht zur lösung eines problemes beitragen kann, ist teil von
diesem.

von Peter D. (peda)


Lesenswert?

@Michael,

vergiß alles außer die ersten 6 Postings und mach für weitere Fragen
nen neuen Thread auf.

Das passiert manchmal, daß ein Thread gehijackt wird, mach Dir nichts
draus.


Peter

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.