Ich habe viele Artikel gesehen, die mir sagen, dass ich RTOS für die Zeitverwaltung und die Ressourcenverwaltung verwenden sollte. Meine Zeit hat meine eigene Forschung nicht erlaubt, deshalb komme ich zu Chiphacker, um Rat zu bekommen.
Ich benutze ressourcenarme Mikrocontroller (MSP430, PIC) und habe nach RTOS gesucht, die ich verwenden kann.
Auf den Punkt gebracht:
- Ressourcenkosten des Systems
- Vorteile des Systems
- Nachteile des Systems
- Implementierungstricks
- Situationen, in denen das RTOS nicht verwendet werden sollte.
Ich verwende keine Systeme wie das Arduino, die Projekte, mit denen ich arbeite, können die Kosten eines solchen Systems nicht decken.
pic
rtos
embedded
microcontroller
Kortuk
quelle
quelle
Antworten:
Ich habe nicht viel persönliche Erfahrung mit RTOSs außer QNX gemacht (was im Großen und Ganzen großartig ist, aber nicht billig, und ich habe wirklich schlechte Erfahrungen mit einem bestimmten Board-Anbieter gemacht und QNXs Einstellung, dass wir uns nicht um andere Systeme kümmern ist zu groß für PICs und MSP430s.
Wo Sie von einem RTOS profitieren, ist in Bereichen wie
Für Peripheriegeräte eines PIC oder MSP430: Für serielle Ports würde ich einen Ringpuffer + Interrupts verwenden ... etwas, das ich einmal pro System schreibe und einfach wiederverwende; andere Peripheriegeräte Ich glaube nicht, dass Sie viel Unterstützung von einem RTOS finden würden, da sie so herstellerspezifisch sind.
Wenn Sie ein Timing benötigen, das absolut auf die Mikrosekunde genau ist, wird ein RTOS wahrscheinlich nicht helfen - RTOSs haben ein begrenztes Timing, haben aber in der Regel Timing-Jitter aufgrund von Verzögerungen beim Kontextwechsel ... QNX, das auf einem PXA270 läuft, hatte Jitter in den typischen zehn Mikrosekunden, maximal 100-200us, also würde ich es nicht für Dinge verwenden, die schneller als ungefähr 100Hz laufen müssen oder die ein viel genaueres Timing als ungefähr 500us benötigen. Für solche Dinge müssen Sie wahrscheinlich Ihre eigene Interrupt-Behandlung implementieren. Einige RTOSs werden gut damit spielen und andere werden es zu einem königlichen Schmerz machen: Ihr Timing und ihr Timing können möglicherweise nicht gut koexistieren.
Wenn das Timing / Scheduling nicht zu komplex ist, ist es möglicherweise besser, eine gut konzipierte Zustandsmaschine zu verwenden. Ich würde das Lesen von Praktischen Zustandsdiagrammen in C / C ++ wärmstens empfehlen, wenn Sie dies noch nicht getan haben. Wir haben diesen Ansatz in einigen unserer Projekte verwendet, in denen ich arbeite, und er hat einige echte Vorteile gegenüber herkömmlichen Zustandsautomaten für die Verwaltung der Komplexität. Dies ist wirklich der einzige Grund, warum Sie ein RTOS benötigen.
quelle
Haben Sie FreeRTOS ausprobiert ? Es ist kostenlos (vorbehaltlich der Nutzungsbedingungen) und wurde sowohl auf den MSP430 als auch auf verschiedene PIC-Versionen portiert.
Es ist klein im Vergleich zu einigen anderen, aber das macht es auch einfach zu erlernen, besonders wenn Sie zuvor noch kein RTOS verwendet haben.
Eine (nicht kostenlose) kommerzielle Lizenz sowie eine IEC 61508 / SIL 3-Version sind verfügbar.
quelle
Ich habe gerade von NuttX RTOS erfahren , das sogar auf einem 8052 (8-Bit) -System funktionieren kann. Es hat nicht viele Ports, aber es sieht interessant aus. Das POSIX kann ein Plus sein, da es einen Teil Ihres Codes ein wenig portabler machen kann, wenn Sie auf einen leistungsstärkeren Prozessor umsteigen und Linux oder QNX in Echtzeit ausführen möchten.
Ich habe selbst keine Erfahrung mit kommerziellen RTOSs, aber ich habe jahrelang hausgemachte verwendet! Sie unterstützen Sie dabei, Ihre Codeentwicklung auf viele Programmierer aufzuteilen, da sie im Grunde genommen jeweils eine "Aufgabe" oder einen "Thread" für ihre Arbeit erhalten können. Sie müssen noch koordinieren und jemand muss das gesamte Projekt beaufsichtigen, um sicherzustellen, dass jede Aufgabe ihre Frist einhält.
Ich empfehle Ihnen auch, die Rate Monotonic Analysis oder RMA zu untersuchen, wenn Sie ein RTOS verwenden. Auf diese Weise können Sie sicherstellen, dass Ihre kritischen Aufgaben ihre Fristen einhalten.
Ich würde mir auch das ereignisgesteuerte QP-nano -Programmierframework von Miro Samek ansehen , das mit oder ohne RTOS arbeiten kann und Ihnen dennoch Echtzeitfähigkeit bietet. Damit teilen Sie Ihr Design in hierarchische Zustandsautomaten anstatt in herkömmliche Aufgaben. Jason S erwähnte Miros Buch in seinem Beitrag. Eine ausgezeichnete Lektüre!
quelle
Eine Sache, die ich auf einer Reihe von Maschinen als nützlich empfunden habe, ist ein einfacher Stapelumschalter. Ich habe noch keinen für den PIC geschrieben, aber ich würde erwarten, dass der Ansatz auf dem PIC18 gut funktioniert, wenn beide / alle Threads insgesamt 31 oder weniger Stapelebenen verwenden. Auf dem 8051 ist die Hauptroutine:
Auf dem PIC vergesse ich den Namen des Stapelzeigers, aber die Routine würde ungefähr so aussehen:
Rufen Sie zu Beginn Ihres Programms eine task2 () - Routine auf, die altSP mit der Adresse des alternativen Stacks lädt (16 würde wahrscheinlich für einen PIC18Fxx gut funktionieren) und die task2-Schleife ausführt. Diese Routine darf niemals zurückkehren, sonst sterben die Dinge einen schmerzhaften Tod. Stattdessen sollte _taskswitch aufgerufen werden, wann immer die Kontrolle über die primäre Task erlangt werden soll. Die primäre Task sollte dann _taskswitch aufrufen, wann immer sie der sekundären Task nachgeben möchte. Oft hat man niedliche kleine Routinen wie:
Beachten Sie, dass der Task-Switcher keine Möglichkeit hat, auf eine Bedingung zu warten. Alles, was es unterstützt, ist ein Spinwait. Auf der anderen Seite ist der Taskwechsel so schnell, dass ein Versuch, einen Taskswitch () auszuführen, während der andere Task auf das Ablaufen eines Timers wartet, zum anderen Task wechselt, den Timer überprüft und schneller zurückschaltet als ein typischer Task-Switcher würde feststellen, dass es keinen Taskswitch braucht.
Beachten Sie, dass kooperatives Multitasking einige Einschränkungen hat, aber die Notwendigkeit für viele Sperren und anderen mutexbezogenen Code in Fällen, in denen vorübergehend gestörte Invarianten schnell wiederhergestellt werden können, entfällt.
(Bearbeiten): Ein paar Vorsichtsmaßnahmen in Bezug auf automatische Variablen und solche:
Mit kooperativem Multitasking kann man Sperrproblemen und dergleichen nicht vollständig entkommen, aber es vereinfacht die Dinge wirklich erheblich. In einem vorbeugenden RTOS mit einem komprimierenden Garbage Collector ist es beispielsweise erforderlich, das Anheften von Objekten zu ermöglichen. Wenn Sie einen kooperativen Switcher verwenden, ist dies nicht erforderlich, vorausgesetzt, der Code geht davon aus, dass sich GC-Objekte bei jedem Aufruf von taskswitch () bewegen können. Ein Verdichtungssammler, der sich nicht um festgesteckte Objekte kümmern muss, kann viel einfacher sein als einer, der dies tut.
quelle
Ich habe Salvo auf dem MSP430 verwendet. Dies war sehr ressourcenschonend und unter der Voraussetzung, dass Sie die Implementierungsregeln einhalten, sehr benutzerfreundlich und zuverlässig. Dies ist ein kooperatives Betriebssystem und erfordert, dass Taskwechsel auf der äußeren Funktionsaufrufebene der Taskfunktionen durchgeführt werden. Diese Einschränkung ermöglicht es dem Betriebssystem, in sehr kleinen Speichergeräten zu arbeiten, ohne große Mengen an Stapelspeicher zu benötigen, um Aufgabenkontexte aufrechtzuerhalten.
Auf dem AVR32 verwende ich FreeRTOS. Bis jetzt wieder sehr zuverlässig, aber ich hatte einige Konfigurations- / Versionsdiskrepanzen zwischen der Version, die FreeRTOS veröffentlicht, und der mit dem Atmel-Framework gelieferten Version. Dies hat jedoch den Vorteil, dass es kostenlos ist!
quelle
Die Dezember-Ausgabe von Everyday Practical Electronics enthält Teil 3 einer Reihe von Echtzeit-Betriebssystemen für PICs (in der Spalte PIC n 'Mix) und enthält Einzelheiten zum Einrichten von FreeRTOS mit MPLAB und einem PICKit 2. Die beiden vorherigen Artikel (die ich offenbar die Vorzüge verschiedener RTOS diskutiert und sich für FreeRTOS entschieden haben. Sobald der aktuelle Artikel die Entwicklungsumgebung eingerichtet hat, beginnt der Entwurf einer binären Digitaluhr. Es scheint, dass es zu diesem Thema noch mindestens einen weiteren Teil gibt.
Ich bin nicht sicher, wie verfügbar EPE in den USA ist, aber es scheint einen US-Store zu geben, der von ihrer Website verlinkt ist, und möglicherweise sind elektronische Kopien verfügbar.
quelle
Der CCS-Compiler für den PIC wird mit einem einfachen RTOS ausgeliefert. Ich habe es nicht ausprobiert, aber wenn Sie diesen Compiler haben, wäre es einfach, damit zu experimentieren.
quelle
Eng verwandte Frage: https://stackoverflow.com/questions/1624237/multithreading-using-c-on-pic18
quelle
Sie haben nicht viel zu Ihrer Bewerbung gesagt. Ob Sie ein RTOS verwenden, hängt stark davon ab, was Sie im PIC tun müssen. Wenn Sie nicht mehrere verschiedene asynchrone Vorgänge ausführen, die strenge Zeitbeschränkungen erfordern oder in denen mehrere Threads ausgeführt werden, ist ein RTOS möglicherweise überlastet.
Es gibt viele Möglichkeiten, die Zeit auf einem Mikrocontroller zu organisieren, je nachdem, was am wichtigsten ist:
Konstante Bildrate: Für einen PIC, auf dem ein Servocontroller ausgeführt wird, der beispielsweise mit 1000 Hz betrieben werden muss. Wenn die Ausführung des PID-Algorithmus weniger als 1 ms dauert, können Sie den Rest der Millisekunde verwenden, um andere Aufgaben auszuführen, z. B. den CAN-Bus zu überprüfen, Sensoren auszulesen usw.
Alle Interrupts: Alles, was im PIC passiert, wird durch einen Interrupt ausgelöst. Die Interrupts können entsprechend der Wichtigkeit des Ereignisses priorisiert werden.
Stecke es in eine Schleife und mache alles so schnell du kannst. Sie werden vielleicht feststellen, dass dies geeignete Zeitgrenzen bietet.
quelle