Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial Internet of Things >> Ingebed

Partition Memory in Nucleus SE: Configuratie, APIs en Best Practices

Partition Memory in Nucleus SE: Configuratie, APIs en Best PracticesBekijk de RTOS Revealed serie

Memory partitions werden voor het eerst geïntroduceerd in ons eerdere artikel, waar we ze vergelijken met de conventionele C malloc() functie. Een partition is een fixed-size geheugenblok dat afkomstig is van een partition pool, wat deterministische allocatie en deallocatie biedt waarop taken kunnen vertrouwen.

Partities Gebruiken

In Nucleus SE worden partition pools gedefinieerd op compile-time. Maximaal 16 pools kunnen per applicatie geconfigureerd worden. Als er geen pools gedefinieerd zijn, worden alle gerelateerde datastructuren en API-code uit de build weggelaten, wat de footprint minimaal houdt.

Een pool is simpelweg een aaneengesloten geheugengebied verdeeld in een vast aantal identieke partities. De applicatie controleert de grootte en het aantal van elke pool. Taken vragen een partition aan en ontvangen een pointer naar het blok. Het is de caller's verantwoordelijkheid om binnen de toegewezen grenzen te blijven. Een partition kan door elke taak aan de pool teruggegeven worden via de deallocate-API. Als de pool uitgeput is, kan de call een error returnen of de taak suspenderen, afhankelijk van de API-parameters en build-opties.

Memory Partities Configureren

Aantal Partition Pools

Partition pools worden ingeschakeld via #define statements in nuse_config.h. Het sleutelsymbool is NUSE_PARTITION_POOL_NUMBER, wat het aantal pools instelt. De standaard is 0, wat betekent dat geen pools actief zijn. Geldige waarden lopen van 1 tot 16; een ongeldige waarde triggert een compile-time #error gegenereerd door nuse_config_check.h.

Het instellen van een non-zero waarde activeert de benodigde datastructuren en initialiseert ze in ROM. Het ontgrendelt ook de API-enable-symbolen die hieronder beschreven zijn.

API Enables

Elke service-call heeft een enable-macro in nuse_config.h. Voor partities bestaan de volgende symbolen:

  • NUSE_PARTITION_ALLOCATE
  • NUSE_PARTITION_DEALLOCATE
  • NUSE_PARTITION_POOL_INFORMATION
  • NUSE_PARTITION_POOL_COUNT

Standaard zijn alle ingesteld op FALSE, wat de implementatie uit de build stript. Om een feature te gebruiken, stel de corresponderende macro in op TRUE. Een API inschakelen terwijl geen pools gedefinieerd zijn (behalve NUSE_Partition_Pool_Count()) resulteert in een compile-time error. Een API gebruiken die niet ingeschakeld is, veroorzaakt een link-time error.

Partition Memory in Nucleus SE: Configuratie, APIs en Best Practices

Partition Pool Service Calls

Nucleus RTOS biedt zeven service-calls voor partition pools. In Nucleus SE zijn alleen de kern-allocatie- en deallocatie-API's geïmplementeerd. De onderstaande tabel lijst elke call, de implementatiestatus, en een korte beschrijving:

APIImplementatieBeschrijving
NU_Allocate_Partition()GeïmplementeerdEen partition allokeren.
NU_Deallocate_Partition()GeïmplementeerdEen partition vrijgeven.
NU_Partition_Pool_Information()GeïmplementeerdPool-metadata ophalen.
NU_Established_Partition_Pools()GeïmplementeerdActieve pools tellen.
NU_Create_Partition_Pool()Niet geïmplementeerdDynamische pool-creatie.
NU_Delete_Partition_Pool()Niet geïmplementeerdDynamische pool-verwijdering.
NU_Partition_Pool_Pointers()Niet geïmplementeerdPool-pointers retourneren.

Let op dat noch Nucleus RTOS noch SE een reset-routine voor partition pools bieden. Deze ontwerpkeuze reflecteert typische use-cases waar een taak een partition allokeert en de pointer aan een andere taak doorgeeft die het uiteindelijk zal deallokeren. Een pool resetten zou alle partities stilletjes als vrij markeren, wat het taak-niveau contract breekt.

Allocatie- en Deallocatie-Services

De kernoperaties zijn:

  • Allokeren: een partition markeren als gebruikt en het adres retourneren.
  • Deallokeren: een partition markeren als vrij.

Nucleus RTOS Allocatie-API

Prototype:

STATUS NU_Allocate_Partition(NU_PARTITION_POOL *pool, VOID **return_pointer, UNSIGNED suspend); 

Return-waarden omvatten NU_SUCCESS, NU_NO_PARTITION, NU_INVALID_POOL, NU_INVALID_POINTER, NU_INVALID_SUSPEND, NU_TIMEOUT, en NU_POOL_DELETED.

Nucleus SE Allocatie-API

Prototype:

STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend); 

Parameters:

  • pool – index van de pool om te gebruiken.
  • return_pointer – adres van het toegewezen blok.
  • suspend – NUSE_NO_SUSPEND of NUSE_SUSPEND.

Return-codes mirroren die van RTOS maar zijn geprefixt met NUSE_. Ongeldige suspend-verzoeken van non-task-threads of wanneer blocking-API's uitgeschakeld zijn produceren NUSE_INVALID_SUSPEND.

Voor een volledige implementatie-walkthrough, zie de opvolgende artikelen in de RTOS Revealed-serie.

Ingebed

  1. Precisie Afvlak Diensten: Expert Proces & Kwaliteit
  2. Fundamenten van digitaal geheugen: adressering, toegang en volatiliteit
  3. Roestvrij Staal Uitgelegd: Samenstelling, Productie En Mondiale Impact
  4. Mailboxes in Nucleus SE: Een Practische Gids voor Configuratie en Gebruik
  5. Semaphores in Nucleus RTOS: Utility Services & Datastructuren
  6. Semaphores in Nucleus SE: Overzicht, Configuratie en API-Essenties
  7. Event Flag Groups in Nucleus SE: Een Introductie tot Configuratie en API-Gebruik
  8. Queues in Nucleus SE: Introductie en Kern-Service-Calls
  9. Rutronik wordt exclusieve Europese distributeur van AP Memory IoT RAM onder mondiale overeenkomst
  10. C# Fundamentals: Invoer en Uitvoer Basis
  11. C++ Geheugenbeheer meesteren: Expert gebruik van new en delete