Partitionsspeicher – Einführung und grundlegende Dienste
RTOS Revealed-Serie anzeigen
Speicherpartitionen wurden in einem früheren Artikel vorgestellt, wo ein Vergleich mit dem Standard C malloc() Funktion gemacht wurde. Eine Partition ist ein Speicherbereich, der aus einem Partitionspool bezogen wird. Dies bietet eine flexible Möglichkeit für Aufgaben, Datenspeicher deterministisch und zuverlässig zu erhalten und freizugeben.
Verwendung von Partitionen
In Nucleus SE werden Partitionspools zur Build-Zeit konfiguriert. Es können maximal 16 Partitionspools für eine Anwendung konfiguriert sein. Wenn keine Partitionspools konfiguriert sind, werden keine Datenstrukturen oder Serviceaufrufcodes, die zu Partitionspools gehören, in die Anwendung aufgenommen.
Ein Partitionspool ist einfach ein Speicherbereich, der in eine bestimmte Anzahl von Partitionen fester Größe unterteilt ist. Der Benutzer hat die vollständige Kontrolle über die Größe und Anzahl der Partitionen in jedem Pool. Tasks können die Zuweisung von Speicherpartitionen anfordern und einen Zeiger auf den Speicherbereich empfangen. Es liegt in der Verantwortung der Task, keine Daten außerhalb der Partition zu schreiben. Die Partition kann von jeder Task freigegeben werden, indem der Zeiger an eine API-Funktion übergeben wird. Das Anfordern der Zuweisung einer Partition, wenn keine mehr verfügbar ist, kann je nach den im API-Aufruf und der Nucleus SE-Konfiguration ausgewählten Optionen zu einem Fehler oder einer Aussetzung der Aufgabe führen.
Speicherpartitionen konfigurieren
Anzahl der Partitionspools
Wie bei den meisten Aspekten von Nucleus SE wird die Konfiguration von Partitionspools hauptsächlich durch #define . gesteuert Anweisungen in nuse_config.h . Die Schlüsseleinstellung ist NUSE_PARTITION_POOL_NUMBER , die bestimmt, wie viele Partitionspools für die Anwendung konfiguriert sind. Die Standardeinstellung ist 0 (dh es werden keine Partitionspools verwendet) und Sie können sie auf einen beliebigen Wert bis 16 setzen. Ein falscher Wert führt zu einem Kompilierzeitfehler, der durch einen Test in nuse_config_check.h . generiert wird (dies ist in nuse_config.c enthalten und daher mit diesem Modul kompiliert), was zu einem #error führt Anweisung wird zusammengestellt.
Die Auswahl eines Werts ungleich Null ist die „Masterfreigabe“ für Partitionspools. Dies führt dazu, dass einige Datenstrukturen entsprechend definiert und dimensioniert werden. Datenstrukturen im ROM erfordern eine Initialisierung auf geeignete Werte, die jeden Partitionspool charakterisieren. Mehr zu Datenstrukturen im nächsten Artikel. Es aktiviert auch die API-Aktivierungseinstellungen.
API aktiviert
Jede API-Funktion (Dienstaufruf) in Nucleus SE hat eine aktivierende #define Symbol in nuse_config.h . Für Partitionspools sind dies:
NUSE_PARTITION_ALLOCATE
NUSE_PARTITION_DEALLOCATE
NUSE_PARTITION_POOL_INFORMATION
NUSE_PARTITION_POOL_COUNT
Standardmäßig sind diese alle auf FALSCH eingestellt , wodurch jeder Dienstaufruf deaktiviert und die Aufnahme jeglichen Implementierungscodes verhindert wird. Um Partitionspools für eine Anwendung zu konfigurieren, müssen Sie die API-Aufrufe auswählen, die Sie verwenden möchten, und ihre Aktivierungssymbole auf TRUE setzen .
Hier ist ein Auszug aus der standardmäßigen nuse_config.h Datei:
Ein Kompilierzeitfehler tritt auf, wenn eine Partitionspool-API-Funktion aktiviert ist und keine Partitionspools konfiguriert sind (außer NUSE_Partition_Pool_Count() was immer erlaubt ist). Wenn Ihr Code einen API-Aufruf verwendet, der nicht aktiviert wurde, kommt es zu einem Linkzeitfehler, da kein Implementierungscode in die Anwendung eingefügt wurde.
Partition Pool Service Calls
Nucleus RTOS unterstützt sieben Serviceaufrufe, die sich auf Partitionspools beziehen, die die folgende Funktionalität bieten:
Eine Partition zuweisen:NU_Allocate_Partition() . Implementiert von NUSE_Partition_Allocate() in Nucleus SE.
Zuordnung einer Partition aufheben:NU_Deallocate_Partition() . Implementiert von NUSE_Partition_Deallocate() in Nucleus SE.
Informationen zu einem angegebenen Partitionspool bereitstellen:NU_Partition_Pool_Information() . Implementiert von NUSE_Partition_Pool_Information() in Nucleus SE.
Geben Sie die Anzahl der Partitionspools zurück, die (derzeit) für die Anwendung konfiguriert sind:NU_Established_Partition_Pools() . Implementiert von NUSE_Partition_Pool_Count() in Nucleus SE.
Fügen Sie der Anwendung einen neuen Partitionspool hinzu (erstellen):NU_Create_Partition_Pool() . Nicht in Nucleus SE implementiert.
Entfernen eines Partitionspools aus der Anwendung (delete):NU_Delete_Partition_Pool() . Nicht in Nucleus SE implementiert.
Zeiger auf alle Partitionspools (derzeit) in der Anwendung zurückgeben:NU_Partition_Pool_Pointers() . Nicht in Nucleus SE implementiert.
Die Implementierung jedes dieser Service Calls wird im Detail untersucht.
Es sei darauf hingewiesen, dass keine Rücksetzfunktion bereitgestellt wird (weder in Nucleus RTOS noch in Nucleus SE). Dies ist beabsichtigt. Es ist sehr gängige Praxis, dass eine Task eine Partition zuordnet und einen Zeiger an eine andere Task übergibt (die sie wahrscheinlich später aufheben wird). Wenn ein Partitionspool zurückgesetzt würde, würden alle Partitionen als unbenutzt markiert, aber es gibt keine Möglichkeit, alle Aufgaben zu verfolgen und zu benachrichtigen, die die Partitionen möglicherweise verwenden.
Partitionszuweisungs- und -aufhebungsdienste
Die grundlegenden Operationen, die auf einem Partitionspool ausgeführt werden können, sind das Zuweisen einer Partition (d. h. das Markieren einer Partition als verwendet und das Zurückgeben ihrer Adresse) und das Aufheben der Zuordnung einer Partition (d. h. das Markieren einer Partition als unbenutzt). Nucleus RTOS und Nucleus SE bieten jeweils zwei grundlegende API-Aufrufe für diese Operationen, die hier besprochen werden.
Zuweisen einer Partition
Der Nucleus RTOS API-Aufruf zum Zuweisen einer Partition ist sehr flexibel, sodass Sie auf unbestimmte Zeit oder mit einer Zeitüberschreitung anhalten können, wenn der Vorgang nicht sofort abgeschlossen werden kann; d.h. Sie versuchen, eine Partition aus einem Pool zuzuweisen, in dem derzeit alle Partitionen belegt sind. Nucleus SE bietet den gleichen Service, außer dass das Aussetzen von Aufgaben optional ist und das Timeout nicht implementiert ist.
Nucleus RTOS API-Aufruf zur Partitionszuweisung
Prototyp für Serviceruf:
STATUS NU_Allocate_Partition(NU_PARTITION_POOL *pool,
VOID **return_pointer, UNSIGNED suspend);
Rückgabe:
NU_SUCCESS – der Anruf wurde erfolgreich abgeschlossen
NU_NO_PARTITION – keine Partitionen verfügbar
NU_INVALID_POOL – der Partitionspoolzeiger ist ungültig
NU_INVALID_POINTER – der Datenrückgabezeiger ist NULL
NU_INVALID_SUSPEND – Suspend wurde von einem Nicht-Task-Thread versucht
NU_TIMEOUT – keine Partition verfügbar ist, selbst nach dem Anhalten für den angegebenen Timeout-Zeitraum
NU_POOL_DELETED – Partitionspool wurde gelöscht, während die Aufgabe angehalten wurde
Nucleus SE API-Aufruf zur Zuweisung
Dieser API-Aufruf unterstützt die Schlüsselfunktionalität der Nucleus RTOS API.
Prototyp für Serviceruf:
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend);
Parameter:
Pool – der Index (ID) des zu verwendenden Partitionspools
return_pointer – ein Zeiger auf eine Variable vom Typ ADDR die die Adresse der zugewiesenen Partition erhält
Aussetzen – Spezifikation für Task-Aussetzung; kann NUSE_NO_SUSPEND sein oder NUSE_SUSPEND
Rückgabe:
NUSE_SUCCESS – der Anruf wurde erfolgreich abgeschlossen
NUSE_NO_PARTITION – keine Partitionen verfügbar
NUSE_INVALID_POOL – der Partitionspoolindex ist ungültig
NUSE_INVALID_POINTER – der Datenrückgabezeiger ist NULL
NUSE_INVALID_SUSPEND – Suspend wurde von einem Nicht-Task-Thread versucht oder wenn das Blockieren von API-Aufrufen nicht aktiviert war
Eingebettet
- Eine Einführung in Edelstahl und seine Herstellung
- Begriffe und Konzepte des digitalen Speichers
- C# Grundlegende Ein- und Ausgabe
- C++-Speicherverwaltung:neu und löschen
- Postfächer:Einführung und grundlegende Dienste
- Semaphoren:Versorgungsdienste und Datenstrukturen
- Semaphoren:Einführung und grundlegende Dienste
- Ereignisflaggengruppen:Einführung und grundlegende Dienste
- Warteschlangen:Einführung und grundlegende Dienste
- Rutronik und AP Memory unterzeichnen globale Vertriebsvereinbarung