Atmega Register

Gast #5718478
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
#5718496
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.
Gast #5718508
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.
(Firma: Funkenflug Industries) #5718514
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.
Gast #5718625
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.
Beitrag #5718632 wurde von einem Moderator gelöscht.
Moderator Persönliche Seite #5718698
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.
Gast #5719326
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.
Gast #5719344
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.
Beitrag #5719386 wurde von einem Moderator gelöscht.
Beitrag #5719401 wurde von einem Moderator gelöscht.
Gast #5719452
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. ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren