Die ganze Wahrheit über RTOS. Artikel 7. Nucleus SE: Einführung



Im weiteren Verlauf der Reihe „Die ganze Wahrheit über RTOS“ werden wir detailliert untersuchen, wie das RTOS implementiert und bereitgestellt wird. Dazu betrachten wir ein spezifisches RTOS: Nucleus SE. Selbst wenn Sie diesen bestimmten Kern oder andere damit verbundene Kernel nicht verwenden, bietet das Verständnis der Funktionsweise eine gute Grundlage für die Arbeit mit RTOS.

Um zu verstehen, warum Nucleus SE so konzipiert wurde, ist es wichtig, die Kernaufgaben und -ziele hervorzuheben, die ich zu Beginn dieses Projekts verfolgt habe.

Frühere Artikel in der Reihe:
Artikel 6. Andere RTOS-Dienste
Artikel 5. Aufgabeninteraktion und Synchronisation
Artikel 4. Aufgaben, Kontextwechsel und Interrupts
Artikel 3. Aufgaben und Planung
Artikel 2. RTOS: Struktur und Echtzeitmodus
Artikel 1. RTOS: Einführung.


Einfachheit

Kernel-Code sollte einfach, unkompliziert, gut kommentiert und dokumentiert sein. Nucleus SE ist in erster Linie für Bildungszwecke gedacht.

Größe

Dies sollte ein kleiner, gut skalierbarer Kernel sein (da der Speicher, insbesondere der Arbeitsspeicher (RAM), möglicherweise knapp ist).

Funktionalität

Der Kernel muss über ein hohes Maß an Funktionalität verfügen, das Standard-RTOS-Dienste unterstützt.

8/16 Bit Unterstützung

Es sollte 8- und 16-Bit-Architekturen unterstützen: Verwenden Sie nach Möglichkeit Daten in der Größe eines Bytes. Datenstrukturen sollten keine exotischen Adressierungsmethoden erfordern. Persistente Daten sollten nicht unnötig in den Arbeitsspeicher kopiert werden.

Die Zukunft

Es muss einen Entwicklungspfad von Nucleus SE zu Nucleus RTOS geben. Benutzer sollten in der Lage sein, Code problemlos zwischen Kernen zu übertragen. Noch wichtiger ist, dass ihr Wissen auch weitergegeben werden muss. Die Nucleus SE-API implementiert effektiv eine Teilmenge der Nucleus RTOS-API.

Kosten

Das Geschäftsmodell sollte für alle potenziellen Benutzer attraktiv sein: Entwickler von 8/16-Bit-Geräten, diejenigen, die zuerst das RTOS verwenden, und diejenigen, die nur die Technologie selbst studieren. Somit ist Nucleus SE frei verfügbar und für kommerzielle und Bildungszwecke absolut kostenlos. Der Code kann verwendet und geändert werden.

Zielgruppe Nucleus SE

Das Ergebnis dieses Ansatzes ist ein Kernel, der für drei Arten von Entwicklern nützlich sein kann:

  • 8/16-Bit-Geräteprogrammierer, die einen einfachen Kernel oder Taskplaner benötigen. Dies ist besonders attraktiv, wenn Entwickler daran interessiert sind, bestimmte Fähigkeiten für die Verwendung von RTOS zu erwerben, oder wenn sie ein System entwickeln, das andere 32-Bit-Geräte verwendet, bei denen Nucleus RTOS eine gute Wahl sein kann.
  • Entwickler eingebetteter Anwendungen, die 32-Bit-Geräte verwenden, bei denen die Komplexität der Software die Kosten eines herkömmlichen kommerziellen RTOS nicht wert ist. Die Verwendung von Nucleus SE kann nützlich sein und ermöglicht die Entwicklung (bis zu Nucleus RTOS), wenn die Komplexität der Anwendung zunimmt.
  • Schüler im Lernprozess können Nucleus SE als Basis für das Erlernen von RTOS verwenden. Erworbene Fähigkeiten werden später nützlich sein, wenn sie anfangen zu arbeiten.

Designentscheidungen und Kompromisse

Um die oben genannten Ziele zu erreichen, mussten mehrere sorgfältig durchdachte Entwurfsentscheidungen getroffen werden. Details werden später beschrieben, wenn wir bestimmte Funktionen betrachten, aber hier ist eine kurze Zusammenfassung der wichtigsten Punkte.

Statische Konfiguration

Nucleus SE ist ein statisches RTOS, dh alle Konfigurationsentscheidungen werden zur Erstellungszeit und nicht dynamisch zur Laufzeit getroffen. Dies hat viele Vorteile, einschließlich der Vereinfachung der Datenstruktur und der Reduzierung der Codegröße, sodass die API-Funktionen zum Erstellen und Löschen nicht aufgerufen werden müssen. Für die meisten Anwendungen ist keine dynamische Objekterstellung erforderlich.

Anzahl der Objekte

Die Anzahl der Objekte jedes Typs ist in einer Nucleus SE-basierten Anwendung begrenzt. Es können ein bis sechzehn Aufgaben und null bis sechzehn verschiedene Arten von Kernelobjekten sein. Dies vereinfacht die Adressierung von Objekten (siehe unten). Diese Einschränkung ist für kleine Anwendungen, für die der Kernel vorgesehen ist, nicht schwierig.

Objekte adressieren

Objekte werden mit einem „Index“ adressiert, der zwischen null und fünfzehn liegen kann. Im Vergleich zur üblichen Verwendung von Zeigern kann dies auf kleineren Prozessoren effizienter sein und weniger Speicher zulassen: Der Index benötigt nur 4 Bit Speicher; Die Adresse ist 16-32 Bit.

Planer

Der Scheduler gehörte zu dem Bereich der Kernelarchitektur, der vereinfacht wurde. Anstatt einen flexiblen Mechanismus mit unterschiedlichen Planungsrichtlinien bereitzustellen, stehen im Kernel vier separate Schedulertypen zur Verfügung. Der spezifische Scheduler für die Anwendung wird während der Konfiguration ausgewählt.

Eingeschränkte Funktionalität

Einige in Nucleus RTOS verfügbare Funktionen sind in Nucleus SE nicht implementiert. In einigen Fällen wird dies der Einfachheit halber durchgeführt. In anderen Fällen erleichtert ein geringfügiger Funktionsverlust in einem Bereich die Implementierung der anderen Funktionalität. Diese Inkompatibilitäten werden in den entsprechenden Artikeln der Reihe hervorgehoben.

Speichernutzung

Da Nucleus SE Anwendungen mit begrenztem Speicher unterstützen muss, wurde besonderes Augenmerk auf die Speichernutzung gelegt. Es sollte das "klassische" ROM und RAM verwenden: ROM wurde für Code und persistente Daten verwendet; RAM - zum Speichern von Variablen, eines Stapels usw. Obwohl ein bestimmtes Ziel ein anderes Schema haben kann, ist der Nucleus SE-Code sehr flexibel. Definitionen (#defines) von ROM und RAM werden verwendet, um allen Strukturen von Variablen und Daten ein Präfix zu geben und ihre Position anzugeben. Dies kann mit Werkzeugen erreicht werden.

Die Hauptanforderung bestand darin, unnötiges Kopieren von Daten vom ROM in den RAM zu vermeiden, da der RAM möglicherweise nicht ausreicht. Der Mechanismus, mit dem dies erreicht wird, wird im Abschnitt Datenstrukturen des nächsten Artikels beschrieben.

API-Implementierung

Die API für Nucleus SE wird auf herkömmliche Weise implementiert: Die C-Sprachfunktion implementiert jeden API-Aufruf. Diese Aufrufe sind logisch gruppiert. Obwohl die API-Aufrufe in Nucleus SE nicht ganz mit denen in Nucleus RTOS identisch sind, wird die Gesamtfunktionalität simuliert und die Zuordnung zwischen den APIs ist einfach. Details zur Nucleus RTOS-API werden enthalten sein.

Kritische Abschnitte

Der Code für viele API-Funktionsaufrufe enthält Anweisungen, die Kerneldaten bearbeiten. Im Allgemeinen können sich Daten während der Ausführung dieser Anweisungen in einem ungültigen Zustand befinden. Daher muss darauf geachtet werden, dass keine Unterbrechungen auftreten. Oder es ist möglicherweise verboten, Code von einer anderen Task oder einem Interrupt-Handler auszuführen, wenn dieser auf diese (derzeit ungültigen) Daten zugreifen kann. Solche Befehlssequenzen werden als kritische Abschnitte bezeichnet.

Es ist ein Makropaar mit den Namen NUSE_CS_Enter () und NUSE_CS_Exit () definiert. Der gesamte Nucleus SE-API-Funktionscode verwendet sie, um den kritischen Abschnitt zu überspannen.

NUSE_CS_Enter ();
<nicht unterbrechbarer Code>
NUSE_CS_Exit ();

In der Regel werden diese Makros zu Anweisungen zum Deaktivieren von Interruptbefehlen bzw. zu Anweisungen zum Aktivieren von Interrupts erweitert. Dies muss überprüft werden, wenn Nucleus SE auf einer anderen Prozessorarchitektur implementiert ist. Weitere Informationen zum Portieren von Nucleus SE werden im nächsten Artikel beschrieben.

Skalierbarkeit

Wie alle modernen RTOS ist Nucleus SE skalierbar. Um sicherzustellen, dass nur verwendete RTOS-Komponenten enthalten sind, werden alle API-Funktionen in Form einer Bibliothek dargestellt. Während der Verknüpfung werden also Funktionen, auf die verwiesen wird, extrahiert und in das endgültige Image der Anwendung aufgenommen. Nucleus RTOS verwendet diesen Ansatz sowohl für den Kernel als auch für alle anderen Betriebssystemkomponenten. Nucleus SE verwendet eine andere Technik.

Anstatt sich auf die Bibliothek in der ausgewählten Toolbox zu verlassen, enthalten alle Quelldateien in der Nucleus SE-Distribution Anweisungen zur bedingten Kompilierung. Um Nucleus SE für das Programm zu konfigurieren, muss der Entwickler mehrere # define-Zeichen installieren (mehr dazu im nächsten Artikel). Dies bestimmt, welche API-Funktionen kompiliert und daher im Programm enthalten sind.

Nucleus SE erweitert diesen Ansatz, indem es ein Objekt anbietet, das ich "extreme Skalierbarkeit" nenne. Verschiedene Aspekte der Kernelfunktionalität können ein- und ausgeschaltet oder auf andere Weise mit ähnlichen # define-Zeichen konfiguriert werden. Somit hat der Entwickler eine Punktkontrolle über die Verwendung des Speichers.

Welche API?

Nucleus SE verfügt über eine eigene API, die in zukünftigen Artikeln ausführlich beschrieben wird. Für viele Benutzer ist es ausreichend, diese Aufrufe der API-Funktionen einfach in den Code aufzunehmen.

Einige Benutzer bevorzugen möglicherweise eine andere API: entweder eine Standard-API oder eine, mit der sie vertraut sind. Die Nucleus SE-API ist sehr flexibel und ermöglicht es Ihnen, einen Wrapper zu erstellen, der eine Schnittstelle in eine andere API umwandelt.

Eines der Hauptziele der Nucleus SE-Entwicklung ist ein hohes Maß an Kompatibilität auf Benutzerebene mit Nucleus RTOS. Obwohl die APIs unterschiedlich sind, sind sie so konzipiert, dass sie leicht zu vergleichen sind. Ein Wrapper wird verfügbar sein, um die Verwendung der Nucleus RTOS-API auf Nucleus SE zu erleichtern.

Im nächsten Artikel werden wir Nucleus SE weiter untersuchen und uns auf die interne Struktur und Bereitstellung von RTOS konzentrieren.

Source: https://habr.com/ru/post/de418601/


All Articles