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
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 ....
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
Ok danke für die Raschen antworten ;) Kennt wer die Adresse vom PC im Stack? Alles Liebe
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
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
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 ;-)
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.
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.
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.
Noch eine Anmerkung: 2-3 PWM Kanäle laufen doch bei den Atmega328p in Hardware, also was soll der Hinweis bedeuten?
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.
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.
Schau hier wie es z.B. FreeRTOS macht https://github.com/cjlano/freertos/blob/master/FreeRTOS/Source/portable/GCC/ATMega323/port.c
Beitrag #5718632 wurde von einem Moderator gelöscht.
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.
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. )
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.
Windows kombiniert alle drei Methoden: - Nutzung mehrerer CPUs bzw. Kerne - Preemptives Multitasking - Kooperatives Multitasking. Windows 3.0 konnte nur letzteres. Android Anfangs übrigens auch.
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.
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. ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.