
In diesem Artikel überprüfen wir weiterhin die Speicherabschnitte des RTOS.
Nucleus RTOS verfügt über drei API-Aufrufe, die Dienstprogrammfunktionen für Speicherpartitionspools bereitstellen: Rückgabe von Informationen zu Partitionspools, Rückgabe der Anzahl der Partitionspools in einer Anwendung und Rückgabe von Zeigern auf alle Partitionspools in einer Anwendung. Die ersten beiden Herausforderungen werden in Nucleus SE implementiert.
Frühere Artikel in der Reihe:
Artikel # 14. Speicherbereiche: Einführung und GrundversorgungArtikel Nr. 13. Aufgabendatenstrukturen und nicht unterstützte API-AufrufeArtikel 12. Dienstleistungen für die Arbeit mit AufgabenArtikel 11. Aufgaben: Konfiguration und Einführung in die APIArtikel 10. Scheduler: Erweiterte Funktionen und KontexterhaltungArtikel 9. Scheduler: ImplementierungArtikel 8. Nucleus SE: Internes Design und BereitstellungArtikel 7. Nucleus SE: EinführungArtikel 6. Andere RTOS-DiensteArtikel 5. Aufgabeninteraktion und SynchronisationArtikel 4. Aufgaben, Kontextwechsel und InterruptsArtikel 3. Aufgaben und PlanungArtikel 2. RTOS: Struktur und Echtzeitmodus
Artikel 1. RTOS: Einführung.
Abrufen von Partitionspoolinformationen
Dieser Serviceabruf enthält teilweise Informationen zum Partitionspool. Die Implementierung von Nucleus SE unterscheidet sich von Nucleus RTOS darin, dass weniger Informationen zurückgegeben werden, da die Benennung von Objekten und Pausenanforderungen nicht unterstützt werden und die Aufgabe nicht angehalten werden kann.
Aufrufen von Partitionspoolinformationen in Nucleus RTOS
Prototyp aufrufen:
STATUS NU_Partition_Pool_Information (NU_PARTITION_POOL * Pool, CHAR * Name, VOID ** Startadresse, UNSIGNED * Poolgröße, UNSIGNED * Partitionsgröße, UNSIGNED * verfügbar, UNSIGNED * zugewiesen, OPTION * Suspend_Type, UNSIGNED * Aufgaben zuerst;Parameter:
pool - ein Zeiger auf den Partitionspool, über den Informationen angefordert werden;
name - Zeiger auf den 8-stelligen Zielbereich für den Namen des Partitionspools; enthält einen Platz zum Beenden von Null;
start_address - ein Zeiger auf eine Variable, die einen Zeiger auf den Anfang des Datenbereichs des Partitionspools empfängt;
pool_size - ein Zeiger auf eine Variable, die die Größe des Partitionspools (in Bytes) empfängt;
partition_size - Zeiger auf eine Variable, die die Größe von Partitionen in einem bestimmten Pool erhält;
verfügbar - ein Zeiger auf eine Variable, die die Anzahl der aktuell verfügbaren Partitionen in diesem Pool empfängt;
zugewiesen - ein Zeiger auf eine Variable, die die Anzahl der aktuell verwendeten Partitionen in einem bestimmten Pool empfängt;
suspend_type - Zeiger auf eine Variable, um den Typ der Task-Suspendierung
abzurufen ; gültige Fahrwerkstypen:
NU_FIFO und
NU_PRIORITY ;
task_waiting - ein Zeiger auf eine Variable, die die Anzahl der angehaltenen Aufgaben in einem bestimmten Partitionspool empfängt;
first_task - Zeiger auf den Aufgabenzeiger, in dem sich der Zeiger der ersten angehaltenen Aufgabe befindet.
Rückgabewert:
NU_SUCCESS - Aufruf erfolgreich abgeschlossen;
NU_INVALID_POOL - ungültiger Zeiger auf Partitionspool.
Aufrufen von Partitionspoolinformationen in Nucleus SE
Prototyp aufrufen:
STATUS NUSE_Partition_Pool_Information (NUSE_PARTITION_POOL-Pool, ADDR * Startadresse, U32 * Poolgröße, U16 * Partitionsgröße, U8 * verfügbar, U8 * zugewiesen, U8 * Aufgaben warten, NUSE_TASK * erste Aufgabe)Parameter:
Pool - Der Index des Partitionspools, über den Informationen angefordert werden.
start_address - ein Zeiger auf eine Variable, die einen Zeiger auf den Anfang des Datenbereichs des Partitionspools empfängt;
pool_size - ein Zeiger auf eine Variable, die die Größe des Partitionspools (in Bytes) empfängt;
partition_size - Zeiger auf eine Variable, die die Größe von Partitionen in einem bestimmten Pool erhält;
verfügbar - ein Zeiger auf eine Variable, die die Anzahl der aktuell verfügbaren Partitionen in diesem Pool empfängt;
zugewiesen - ein Zeiger auf eine Variable, die die Anzahl der aktuell verwendeten Partitionen in einem bestimmten Pool empfängt;
task_waiting - ein Zeiger auf eine Variable, die die Anzahl der angehaltenen Aufgaben in diesem Partitionspool empfängt (wenn die Aufgabe angehalten ist, wird 0 zurückgegeben);
first_task - Ein Zeiger auf eine Variable vom Typ
NUSE_TASK , die den Index der ersten angehaltenen Aufgabe empfängt (wenn die Aufgabe angehalten ist, wird 0 zurückgegeben).
Rückgabewert:
NUSE_SUCCESS - Aufruf erfolgreich abgeschlossen;
NUSE_INVALID_POOL - ungültiger Partitionspoolindex;
NUSE_INVALID_POINTER - Einer oder mehrere der übergebenen Zeiger sind ungültig.
Implementieren von Information Retrieval und Partition Pooling in Nucleus SE
Die Implementierung eines solchen API-Aufrufs ist einfach auszuführen:

Die Funktion gibt den Status des Partitionspools zurück. Wenn dann die API-Aufrufblockierung aktiviert ist, werden die Anzahl der ausstehenden Aufgaben und der Index der ersten zurückgegeben (andernfalls werden diese Parameter auf 0 gesetzt).
Abrufen der Anzahl der Partitionspools
Dieser Aufruf gibt Informationen über die Anzahl der in der Anwendung konfigurierten Partitionspools zurück. Während sich in Nucleus RTOS diese Anzahl im Laufe der Zeit ändert und der Rückgabewert die aktuelle Anzahl von Pools darstellt, wird in Nucleus SE der Rückgabewert während der Montage festgelegt und bleibt unverändert.
Die Herausforderung, die Anzahl der Partitionspools in Nucleus RTOS zu ermitteln
Der Aufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API.
Prototyp aufrufen:
UNSIGNED NU_Established_Partition_Pools (VOID);Parameter:
Sind abwesend.
Rückgabewert:
Die Anzahl der in der Anwendung erstellten Partitionspools.
Die Herausforderung, die Anzahl der Partitionspools in Nucleus SE zu ermitteln
Dieser Dienstprogrammaufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API.
Prototyp aufrufen:
U8 NUSE_Partition_Pool_Count (void);Parameter:
Sind abwesend
Rückgabewert:
Die Anzahl der in der Anwendung erstellten Partitionspools.
Implementierung
Die Implementierung dieses API-Aufrufs ist äußerst einfach: Der Wert
#define des Symbols
NUSE_PARTITION_POOL_NUMBER wird
zurückgegeben .
Datenstrukturen
Wie alle anderen Nucleus SE-Objekte verwenden Partitionspools Strukturarrays sowohl im ROM als auch im RAM, deren Anzahl von der Anzahl der in den Einstellungen angegebenen Pools abhängt.
Ich empfehle dringend, dass Anwendungscode über API-Funktionen und nicht direkt auf solche Datenstrukturen zugreift. Dies vermeidet Inkompatibilität mit zukünftigen Versionen von Nucleus SE und unerwünschte Nebenwirkungen und vereinfacht auch die Portierung der Anwendung auf Nucleus RTOS. Das Folgende ist eine detaillierte Beschreibung der Datenstrukturen, um das Verständnis des Serviceabrufcodes und des Debuggens zu erleichtern.
Struktur der im RAM abgelegten Kerneldaten
Diese Datenstrukturen umfassen:
NUSE_Partition_Pool_Partition_Used [] - ein Array vom Typ
U8 mit einem Eintrag für jeden konfigurierten Partitionspool, der einen Zähler der aktuell verwendeten Pools enthält;
NUSE_Partition_Pool_Blocking_Count [] - Ein Array vom Typ
U8, das einen Zähler für blockierte Aufgaben in jedem Partitionspool enthält. Dieses Array ist vorhanden, wenn das Blockieren des API-Aufrufs möglich ist.
Solche Datenstrukturen werden beim Starten von Nucleus SE mit
NUSE_Init_ Partition_Pool () auf
Null initialisiert. Dies ist logisch, da dadurch jede Partition in jedem Pool unbenutzt (frei) wird. Der folgende Artikel enthält eine vollständige Beschreibung der Startvorgänge in Nucleus SE.
Im Folgenden finden Sie Beschreibungen der Datenstrukturen in der Datei
nuse_init.c .

RAM-Benutzerdaten
Der Benutzer muss einen Bereich im RAM zuweisen, um Daten für jeden Partitionspool zu speichern. Der Speicherplatz im RAM muss dem Volumen der konfigurierten Partitionen (siehe "Daten im ROM" unten) mit einem zusätzlichen Byte für jede Partition im Pool entsprechen. Vor jedem Abschnitt des Datenbereichs steht ein Statusbyte.
ROM-Daten
Dazu gehören:
NUSE_Partition_Pool_Data_Address [] - Ein Array vom Typ
ADDR mit einem Eintrag für jeden konfigurierten Partitionspool, der die Adresse des Beginns des Datenspeicherbereichs enthält.
NUSE_Partition_Pool_Partition_Number [] - ein Array vom Typ
U8 mit einem Eintrag für jeden konfigurierten Partitionspool, der Informationen zur Anzahl der Partitionen im Pool enthält;
NUSE_Partition_Pool_Partition_Size [] - Ein Array vom Typ
U16 mit einem Eintrag für jeden konfigurierten Partitionspool, der die Größe der Partitionen für die Pools enthält.
Solche Datenstrukturen werden in
nuse_config.c deklariert und (statisch)
initialisiert :

Daten-Footprint für den Partitionspool
Wie bei allen Kernobjekten in Nucleus SE ist die für Partitionspools erforderliche Speichermenge vorhersehbar.
Die ROM-Größe (in Byte) für alle Anwendungspartitionspools kann wie folgt berechnet werden:
NUSE_PARTITION_POOL_NUMBER * (Größe von (ADDR) + 2)Die Menge der Kerneldaten im RAM für alle Anwendungspartitionspools, wenn die Blockierung von API-Aufrufen aktiviert ist, beträgt nur 2 Byte pro Partitionspool, und wenn die Blockierung nicht aktiviert ist, dauert es 1 Byte.
Die Speichermenge zum Speichern von Benutzerdaten im RAM variiert für jeden Partitionspool, obwohl sie, wie bereits erwähnt, für einen Pool mit dem Index n wie folgt berechnet werden kann:
NUSE_Partition_Pool_Partition_Number [n] *(NUSE_Partition_Pool_Partition_Size [n] + 1)Nicht realisierte API-Aufrufe
Drei API-Aufrufe für in Nucleus RTOS implementierte Partitionspools werden in Nucleus SE nicht unterstützt.
Partitionspool erstellen
Dieser API-Aufruf erstellt einen Partitionspool. Nucleus SE benötigt es nicht, da Aufgaben statisch erstellt werden.
Prototyp aufrufen:
STATUS NU_Create_Partition_Pool (NU_PARTITION_POOL * -Pool, CHAR * -Name, VOID * -Startadresse, UNSIGNED-Poolgröße, UNSIGNED-Partitionsgröße, OPTION suspend_type);Parameter:
Pool - ein Zeiger auf eine benutzerdefinierte Partitionspool
- Steuereinheit; wird als Handle für den Partitionspool in anderen API-Aufrufen verwendet;
name - ein Zeiger auf den Namen des Partitionspools, eine 7-stellige Zeichenfolge mit einer abschließenden Null;
start_address -
Legt die Startadresse für den Speicherbereich des Partitionspools fest.
pool_size - Gesamtmenge des Speichers in Bytes;
partition_size - Die Speichermenge in Byte für jede Partition im Pool. Darüber hinaus wird jedem Abschnitt eine zusätzliche kleine Speichermenge zugewiesen, die dank der beiden verwendeten Datenzeiger realisiert wird.
suspend_type - legt fest, wie Aufgaben im Partitionspool angehalten werden. Gültige Parameteroptionen sind
NU_FIFO und
NU_PRIORITY .
Rückgabewert:
NU_SUCCESS - zeigt einen erfolgreichen Abschluss des Anrufs an;
NU_INVALID_POOL -
Gibt den Nullwert der Partitionspool-Steuereinheit (
NULL ) an.
NU_INVALID_MEMORY - gibt den Nullwert des durch
start_ address (
NULL ) definierten
Speicherbereichs an ;
NU_INVALID_SIZE -
Gibt an, dass die Partitionsgröße entweder 0 oder größer als der für die Partition zugewiesene Speicher ist.
NU_INVALID_SUSPEND - ungültiger
suspend_type- Wert.
Partitionspool löschen
Dieser API-Aufruf löscht einen zuvor erstellten Partitionspool. Nucleus SE benötigt es nicht, da Objekte statisch erstellt werden und nicht gelöscht werden können.
Prototyp aufrufen:
STATUS NU_Delete_Partition_Pool (NU_PARTITION_POOL * -Pool);Parameter:
Pool - Zeiger auf die Partitionspool-Steuereinheit;
Rückgabewert:
NU_SUCCESS - zeigt einen erfolgreichen Abschluss des Anrufs an;
NU_INVALID_POOL -
Gibt einen ungültigen Wert für den Partitionspoolzeiger an.
Zeiger für Partitionspools
Dieser API-Aufruf erstellt eine sequentielle Liste von Zeigern auf alle Partitionspools im System. Nucleus SE benötigt dies nicht, da Objekte durch einen Index und nicht durch einen Zeiger identifiziert werden.
Prototyp aufrufen:
UNSIGNED NU_Partition_Pool_Pointers (NU_PARTITION_POOL ** Zeigerliste, UNSIGNED Maximum_Pointers);Parameter:
pointer_list - Zeiger auf ein Array von Zeigern
NU_PARTITION_POOL ; Das Array ist mit Zeigern auf konfigurierte Pools im System gefüllt.
Maximum_Pointers - Die maximale Anzahl von Zeigern, die im Array platziert werden können.
Rückgabewert:
Die Anzahl der im Array platzierten
NU_PARTITION_POOL- Zeiger.
Nucleus RTOS-kompatibel
Bei der Entwicklung von Nucleus SE bestand eine der Hauptaufgaben darin, ein hohes Maß an Codekompatibilität mit Nucleus RTOS sicherzustellen. Partitionspools waren keine Ausnahme und werden aus Entwicklersicht ähnlich wie in Nucleus RTOS implementiert. Einige vorhandene Inkompatibilitätsbereiche sind akzeptabel, obwohl zu berücksichtigen ist, dass der endgültige Code leichter zu verstehen und speichereffizienter ist. Nucleus RTOS-API-Aufrufe können jedoch fast direkt als Nucleus SE-Aufrufe verwendet werden. In Zukunft ist ein Artikel mit Informationen zur Verwendung von Nucleus SE durch Benutzer von Nucleus RTOS geplant.
Objektkennungen
In Nucleus RTOS werden alle Objekte durch Datenstrukturen (Steuereinheiten) eines bestimmten Typs beschrieben. Ein Zeiger auf diesen Steuerblock wird als Bezeichner für den Partitionspool verwendet. Ich entschied, dass Nucleus SE einen anderen Ansatz für eine effizientere Nutzung des Speichers erfordert. Alle Kernelobjekte werden durch mehrere Tabellen im RAM und / oder ROM beschrieben. Die Größe dieser Tabellen wird durch die Anzahl der konfigurierbaren Typen aller Objekte bestimmt. Die Kennung für ein bestimmtes Objekt ist der Index in diesen Tabellen. Daher habe ich festgestellt, dass
NUSE_PARTITION_POOL U8 entspricht.
Danach dient eine Variable (kein Zeiger) dieses Typs als Kennung der Aufgabe. Diese leichte Inkompatibilität lässt sich leicht feststellen, wenn der Code von oder nach Nucleus RTOS portiert wird. Objektkennungen werden normalerweise unverändert gespeichert und übertragen.
Nucleus RTOS unterstützt auch das Benennen von Partitionspools. Diese Namen werden nur zum Debuggen verwendet. Ich habe sie von Nucleus SE ausgeschlossen, um Speicherplatz zu sparen.
Anzahl der Abschnitte und deren Volumen
In Nucleus RTOS wird der Partitionspool basierend auf dem Gesamtvolumen des Pools und dem Volumen der Partitionen (die 2 weitere Zeiger enthalten) konfiguriert. Diese Parameter sind als UNSIGNED (ca. 32 Bit) definiert. In Nucleus SE wird der Partitionspool basierend auf der Größe der Partition (für die ein zusätzliches Byte hinzugefügt wurde) und der Gesamtzahl der Partitionen konfiguriert. Diese Parameter sind als U16 bzw. U8 definiert.
Nicht realisierte API-Aufrufe
Nucleus RTOS unterstützt 7 Aufrufe für die Arbeit mit Partitionspools, von denen 3 nicht in Nucleus SE implementiert sind. Weitere Einzelheiten zu diesen Herausforderungen und den Gründen für ihren Ausschluss sind oben aufgeführt.
Der nächste Artikel befasst sich mit Signalen.
Über den Autor: Colin Walls ist seit über dreißig Jahren in der Elektronikindustrie tätig und widmet sich die meiste Zeit der Firmware. Heute ist er Firmware-Ingenieur bei Mentor Embedded (einer Abteilung von Mentor Graphics). Colin Walls spricht häufig auf Konferenzen und Seminaren, Autor zahlreicher technischer Artikel und zweier Bücher über Firmware. Lebt in Großbritannien.
Colins professioneller
Blog , E-Mail: colin_walls@mentor.com.