Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial Internet of Things >> Eingebettet

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:

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

  1. Eine Einführung in Edelstahl und seine Herstellung
  2. Begriffe und Konzepte des digitalen Speichers
  3. C# Grundlegende Ein- und Ausgabe
  4. C++-Speicherverwaltung:neu und löschen
  5. Postfächer:Einführung und grundlegende Dienste
  6. Semaphoren:Versorgungsdienste und Datenstrukturen
  7. Semaphoren:Einführung und grundlegende Dienste
  8. Ereignisflaggengruppen:Einführung und grundlegende Dienste
  9. Warteschlangen:Einführung und grundlegende Dienste
  10. Rutronik und AP Memory unterzeichnen globale Vertriebsvereinbarung