Forum: Mikrocontroller und Digitale Elektronik Atmega Register


von paul (Gast)


Lesenswert?

Liebe Leute,
ich sitze bereits seit einer Stunde an einem Problemchen mit meinem 
ATmega328P. Ich würde gerne den Programm Counter beeinflussen können, um 
Muktitasking zu ermöglichen. Wie geht das?
Lg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

IJMP, RET (mit passendem Stack)

Schau dich einfach bei ein paar RTOSen um.

von Regio Nelle (Gast)


Lesenswert?

So so, Multitaskting....

Einfach mal den Program Counter neu schreiben und schon hat
man es ... paar Register retten und wiederherstellen, aber
das war's dann wirklich ....

von Wolfgang (Gast)


Lesenswert?

paul schrieb:
> Ich würde gerne den Programm Counter beeinflussen können, um
> Muktitasking zu ermöglichen. Wie geht das?

Indem du die Adresse auf den Stack schieben und per Return in den PC 
holst

von paul (Gast)


Lesenswert?

Ok danke für die Raschen antworten ;)
Kennt wer die Adresse vom PC im Stack?
Alles Liebe

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

paul schrieb:
> Kennt wer die Adresse vom PC im Stack?

Das Datenblatt?

von Joachim B. (jar)


Lesenswert?

mache einen jump sub zu deiner Unterroutine
die Rücksprungadresse sollte auf dem Stack landen
dort kann man sie manipulieren also änder, Stack aufräumen und zurück 
springen zur gewünschten Adresse.

Genauer kenne ich das auf dem AVR leider nicht, aber vielleicht findest 
du was hier
http://web.csulb.edu/~hill/ee346/Lectures/05%20AVR%20Branching.pdf

von Karl M. (Gast)


Lesenswert?

paul,

was hast Du für ein Konzept?

Wie werden Threads z.B. Daten austauschen, sich gegenseitig 
synchronisiert oder auf externe Events reagieren?

Welche Art Multitasking soll realisiert werden?
Im Angebot sind u.a.:
a) Kooperatives Multitasking
b) Präemptives Multitasking

von Wolfgang (Gast)


Lesenswert?

paul schrieb:
> Kennt wer die Adresse vom PC im Stack?

Warum soll der PC eine Adresse haben. Der Inhalt vom PC ist die Adresse. 
Und auf dem Stack wird nach last in - first out verfahren.

Da scheinen noch ein paar Grundlagen zu fehlen ;-)

von DAVID B. (bastler-david)


Lesenswert?

Tut mir leid wenn ich mich einfach so einhänge aber geht das technisch 
überhaupt ??
so weit ich feststellen musste ich es nicht möglich überhaupt irgendwas 
neben her zumachen nicht mal pwm.
selbst wenn man seriell was empfangen will wird das Programm kurz 
gestoppt.
Oder ich habe die aufgaben Stellung falsch/nicht verstanden.

von Karl M. (Gast)


Lesenswert?

Nee das Programm wird nicht gestoppt, die Uart RX ISR Abarbeitung gehört 
dann für 2µs zum Programm dazu.

Klar kann man eine Art Muktitasking implementieren, es hängt halt von 
der "Art" ab und man benötigt für jeden Task einen eigenen statischen 
Speicherbereich Register: 32 + Flags: 1 + PC:2(3) + Epsion.

Deshalb nimmt man i.A. einen großen AVR µC atmega1280 oder größer.

von Karl M. (Gast)


Lesenswert?

Was klar sein sollte, man wählt z.B. 10ms-100ms Reaktionszeit, für einen 
Task zu Task wechsel.

Dabei sind die Events: wie Uart, Zähler (Timer) u.v.a. mehr nicht 
gemeint.

von Karl M. (Gast)


Lesenswert?

Noch eine Anmerkung:

2-3 PWM Kanäle laufen doch bei den Atmega328p in Hardware, also was soll 
der Hinweis bedeuten?

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Echtes Multitasking, so wie Du es vom Windows-verseuchten x86 kennst, 
geht auch nur durch Aufteilung der CPU-Resourcen. Sprich die Programme 
arbeiten ihre Daten auch nacheinander ab und nicht gleichzeitig. Das 
Multitasking ermöglicht es nur, daß schnell zwischen zwei oder mehr 
Programmen/Tasks hin und her gesprungen werden kann, ohne daß sich die 
Programme in die Quere kommen.

Ohne Hardware-Puffer/DMA könntest Du z.B. auch kein MP3 auf dem PC 
abspielen und gleichzeitig noch hier im Forum schreiben oder sonstewas. 
Dann hättest Du Aussetzer bei der Audio-Ausgabe.

Daher bei Mikrocontrollern so viele Funktionen wie möglich auf die 
Hardware auslagern. Stichwort Interruptbehandlung. Dann braucht man sich 
um z.B. die einzelnen Bits bei USARTs oder das Abwarten wann eine 
Sekunde vergangen ist gar nicht zu kümmern. Man bekommt quasi Events in 
Form von Interrupts und kann direkt mit den Daten arbeiten, ohne sie am 
Beispiel von RS-232 vorher selbst von den Pins pollen und zusammensetzen 
zu müssen.

von Stefan F. (Gast)


Lesenswert?

Wobei so ein aktiv unterbrechendes Betriebssystem auf AVR nicht wirklich 
Freude bringt, denn

a) Du brauchst für jeden Thread einen eigenen reservierten Bereich im 
RAM als Stack. Da kannst du für den Anfang 100 Bytes für 
Funktionsaufrufe einplanen, zuzüglich Platz für deine Nutzdaten (falls 
vorhanden).

Besonders viele Threads sind damit nicht möglich - jedenfalls nicht auf 
einem ATmega328.

b) Du brauchst außerdem Speicherplatz, wo du bei jedem Thread-Wechsel 
alle Registers sicherst (die CPU Register und die R-Register). Dadurch 
kommen nochmal einige zig Bytes pro Thread an Speicherbedarf dazu.

c) Das Umkopieren der Registers braucht seine Zeit. Es gibt andere CPUs 
die dafür spezielle Befehle haben und das viel schneller können, als 
AVR.

Ich setze daher lieber auf Zustandsautomaten die ich in einer 
Hauptschleife wiederholt aufrufe. Dazu braucht man nur die Boardmittel 
von C, keine Tricks mit Assembler und mehreren Stacks.

von C.K. (Gast)


Lesenswert?


Beitrag #5718632 wurde von einem Moderator gelöscht.
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ben B. schrieb:
> Echtes Multitasking, so wie Du es vom Windows-verseuchten x86 kennst,
> geht auch nur durch Aufteilung der CPU-Resourcen.

Erstens gibt's das gewiss nicht bloß bei x86 – denk mal an Smartphones. 
Auch, wenn du dort typisch nur ein Fenster im Vordergrund hast, dümpelt 
da ein Messenger und alles mögliche im Hintergrund. Letztlich ist UNIX 
auf einer PDP-11 groß geworden und hatte Multitasking … (genauso wie 
RSX-11, welches es von DEC für diese Rechner gab), und die PDP-11 
schlägt wohl heute ein größerer AVR sowohl speicher- als auch 
rechenmäßig locker.

Zweitens kann man natürlich auch mit mehreren CPUs Multitasking machen. 
Früher ging das nur in sehr aufwändigen Systemen (bei x86 sah so ein 
Board schon recht abenteuerlich-futuristisch aus, aber Sun-Server bspw. 
gab es auch dazumals schon mit einem Dutzend oder mehr CPUs), 
mittlerweile nagelt dir jeder Siliziumhersteller <N> Cores auf einen 
Die.

Aber es ist natürlich trotzdem richtig, dass man das auch alles mit 
einer CPU im Zeitscheibenbetrieb machen kann.

Stefanus F. schrieb:
> Besonders viele Threads sind damit nicht möglich - jedenfalls nicht auf
> einem ATmega328.

Es gibt ja auch deutlich größere AVRs. Ein ATmega1284 leidet nicht ganz 
so schnell an RAM-Mangel wie dein ATmega328.

von Multithreader (Gast)


Lesenswert?

Ich stand vor einigen Jahren vor genau der gleichen Problematik. In 
diesem Buch:

https://www.amazon.de/Multitasking-AVR-RISC-Controllern-Prof-Ernst-Forgber/dp/3645652701

werden die Grundlagen und auch die tatsächliche Umsetzung gut 
beschrieben. (PC sichern, StackPointer umbiegen etc. )

von Wolfgang (Gast)


Lesenswert?

Ben B. schrieb:
> Echtes Multitasking, so wie Du es vom Windows-verseuchten x86 kennst,
> geht auch nur durch Aufteilung der CPU-Resourcen.

Echtes Multitasking geht nur auf einem Mehrkernprozessor.
Auf Einkernprozessoren laufen die verschiedenen Tasks immer im 
Zeitmultiplex.

von Stefan F. (Gast)


Lesenswert?

Windows kombiniert alle drei Methoden:

- Nutzung mehrerer CPUs bzw. Kerne
- Preemptives Multitasking
- Kooperatives Multitasking.

Windows 3.0 konnte nur letzteres. Android Anfangs übrigens auch.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wolfgang schrieb:
> Auf Einkernprozessoren laufen die verschiedenen Tasks immer im
> Zeitmultiplex.

Trotzdem nennt man das Multitasking.

Beitrag #5719386 wurde von einem Moderator gelöscht.
Beitrag #5719401 wurde von einem Moderator gelöscht.
von Wolfgang (Gast)


Lesenswert?

Jörg W. schrieb:
> Trotzdem nennt man das Multitasking.

Aber es fehlt das "echt".

Bei einem 4-Kanal Oszi beschwerst du dich auch, wenn die 4 Kanäle eines 
Digital-Oszis mit einzigen AD-Wandler im Multiplexbetrieb gesampled 
werden oder auf einem Analogoszi ein Chopper für die 4-Kanalabtastung 
sorgt. ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wolfgang schrieb:
> Jörg W. schrieb:
>> Trotzdem nennt man das Multitasking.
>
> Aber es fehlt das "echt".

Nein, fehlt nicht.

Was du meinst, ist Multiprocessing.

https://de.wikipedia.org/wiki/Multitasking
https://de.wikipedia.org/wiki/Mehrprozessorsystem#Multiprocessing

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.