Ich versuche zu verstehen, wie Echtzeitbetriebssysteme funktionieren. Ich habe mir die Quellcodes einiger RTOS angesehen. Ich möchte lernen, indem ich mein einfaches RTOS erstelle, so etwas wie FLIRT .
Ich verwende die PIC16-Serie und den XC8 C-Compiler mit MPLABX. Ich möchte auch diese sehr einfache RTOS-PIC12-Serie implementieren.
Also entschied ich mich, zunächst zu lernen, wie man einen Stapel manipuliert (wie es Supercat in dieser Antwort getan hat ), und begann mit der Suche und stieß auf AN818 mit dem Titel "Manipulieren des Stapels des PIC18-Mikrocontrollers". Zitiert aus dem Anwendungshinweis:
Traditionell wurde der Mikrocontroller-Stack nur als Speicherplatz für Rücksprungadressen von Subroutinen oder Interrupt-Routinen verwendet, bei denen alle Push- und Pop-Operationen ausgeblendet waren.
Zum größten Teil hatten Benutzer keinen direkten Zugriff auf die Informationen auf dem Stapel. Der PIC18-Mikrocontroller weicht geringfügig von dieser Tradition ab. Mit dem neuen PIC18-Kern haben Benutzer jetzt Zugriff auf den Stapel und können den Stapelzeiger und die Stapeldaten direkt ändern.
Ich bin verwirrt. Wie kommt es, dass RTOSs für PIC-Mikrocontroller entwickelt wurden, die mit PIC16-Kernen arbeiten? Zum Beispiel ist OSA RTOS für PIC12 / 16 mit mikroC-Compiler verfügbar.
Können Sie mich auf einige Ressourcen verweisen oder wenn möglich Beispiele nennen, damit ich mehr über das Stack-Switching erfahren kann?
JumpC4 & 255
nach W?movlw/goto
versusretlw
spart letzteres ein Wort Code-Speicherplatz pro Task-Switch, ist jedoch aufgrund der Notwendigkeitcall
eines "Sprungbretts" ein Zyklus langsamer . Noch wichtiger ist, dass bei Verwendungmovlw/goto
einer Aufgabe Aufgabenwechsel innerhalb verschachtelter Routinen durchgeführt werden können. Wenn man die Verwendungretlw
auf Aufgaben beschränken würde, die nicht aus verschachtelten Routinen heraus wechseln mussten, wäre das in Ordnung, aber das Mischen von Paradigmen zum Wechseln von Aufgaben könnte Verwirrung stiften.Die herkömmlichen 14-Bit-Core-PICs (meistens PIC 16 und einige PIC 12) bieten dem Programm keine Möglichkeit, auf den Aufrufstapel zuzugreifen. Dies macht daher ein echtes Multitasking-System unmöglich.
Sie können jedoch immer noch so genannte Pseudo-Aufgaben haben. Dies ist eine Routine, die regelmäßig von der Hauptereignisschleife aufgerufen wird. Es verwaltet intern eine Neustartadresse. Wenn die Haupt-Even-Schleife es aufruft, springt sie zur Neustartadresse der Pseudo-Task, die für dieses Modul privat ist. Nach einiger Verarbeitung ruft der Taskcode ein YIELD-Makro auf, das die Neustartadresse unmittelbar nach dem Makro festlegt und dann vom ursprünglichen Aufruf zurückkehrt. Da der Aufrufstapel nicht abgewickelt werden kann, kann YIELD nur von der obersten Aufgabenebene aus aufgerufen werden. Trotzdem ist dies eine nützliche Abstraktion.
Ein Beispiel für eine solche Pseudo-Task, die zum Verarbeiten eines Befehlsstroms von einem Host-Computer verwendet wird, finden Sie in meinem QQQ_CMD.ASPIC-Vorlagenmodul. In diesem Fall ist die Rückkehr zum Aufrufer im GETBYTE-Makro verborgen, das aus Sicht der Aufgabe das nächste Eingabebyte abzurufen scheint. Installieren Sie meine PIC Development Tools-Version von der Seite zum Herunterladen von Software . QQQ_CMD.ASPIC befindet sich im Verzeichnis SOURCE> PIC im Softwareinstallationsverzeichnis.
Um zu sehen, wie echtes Multitasking ausgeführt werden kann, wenn Sie Zugriff auf den Aufrufstapel haben, werfen Sie einen Blick auf TASK.INS.ASPIC im selben Verzeichnis. Das ist mein generisches Multitasking-System für den PIC 18. Sie können dasselbe für die dsPIC-Architektur sehen, indem Sie sich TASK.INS.DSPIC im Verzeichnis SOURCE> DSPIC ansehen.
quelle
GETBYTE
Makro angesehen, konnte aber überhaupt nichts verstehen. Ich werde später darauf zurückkommen. Jetzt schaue ich auf Pic'Xe und kann die Baugruppe verstehen, wenn ich auf das Datenblatt schaue . Ich verstehe jedoch nicht, was FSR und INDF usw. bedeuten, was Hardware ist. Also, ich bin jetzt ein Follower von PIC x14 Architektur Tutorials hier .Die "14-Bit-Core" -Chips der PIC16-Serie verfügen über einen "Hardware-Stack-RAM", der vollständig getrennt und unabhängig vom "Daten-RAM" ist. (Es hat sogar eine andere Größe und Breite als der Daten-RAM). Das "Kernblockdiagramm" für einen dieser Chips zeigt deutlich, dass der "Hardware-Stapel" nur mit dem Programmzähler verbunden ist - der einzige Befehl, der in diesen Hardware-Stapel schreibt, ist (die verschiedenen Arten von) CALL und der einzige Befehl Das, was von diesem Hardware-Stack liest, ist (die verschiedenen Arten von) RETURN.
"Stack Switching" ist für den "Hardware Stack" in diesen "14 Bit Core" Chips nicht möglich.
Dies macht die meisten herkömmlichen Methoden zum Wechseln von Betriebssystemaufgaben auf dieser Chipserie unmöglich.
Es gibt einige RTOSs, die auf dieser Reihe von Chips ausgeführt werden. Daher müssen auf diesem Chip einige Task-Switching-Methoden möglich sein ( "PIC Microcontroller-spezifische Multitasking-Methoden" ).
In der Praxis haben alle RTOSs, die ich gesehen habe, eine Art kooperativen Task-Switcher, der nur im Code der obersten Ebene jeder Task von einer Task zur nächsten "nachgibt". Da die Ausbeute niemals innerhalb eines Unterprogramms liegt, gibt es keine Rücksprungadressen auf dem Hardware-Stack.
Im Prinzip ist es möglich, diese Chips so zu programmieren, dass ein Software-Stack im RAM erstellt und damit ein Return-Stack simuliert wird. (Verwenden eines "benutzerdefinierten Stapels" im Daten-RAM anstelle des Hardware-Stapels). Dann könnten Sie alle herkömmlichen Aufgaben zum Wechseln von Betriebssystemaufgaben verwenden, z. B. jeder Aufgabe einen separaten RAM-Block für ihren lokalen Stapel zuweisen usw. Ich weiß nicht, ob sich die zusätzliche Komplexität und die nicht standardmäßigen Aufrufsequenzen lohnen würden.
quelle