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

Partitiegeheugen – introductie en basisservices


Bekijk de RTOS Revealed-serie

Geheugenpartities werden geïntroduceerd in een vorig artikel, waar een vergelijking met de standaard C malloc() functie is gemaakt. Een partitie is een geheugengebied dat is verkregen uit een partitiepool. Dit biedt een flexibel middel voor taken om gegevensopslag op een deterministische en betrouwbare manier te verkrijgen en vrij te geven.

Partities gebruiken

In Nucleus SE worden partitiepools geconfigureerd tijdens het bouwen. Er kunnen maximaal 16 partitiepools zijn geconfigureerd voor een toepassing. Als er geen partitiepools zijn geconfigureerd, worden er geen datastructuren of serviceaanroepcodes behorend bij partitiepools in de toepassing opgenomen.

Een partitiepool is gewoon een geheugengebied dat is verdeeld in een specifiek aantal partities met een vaste grootte. De gebruiker heeft volledige controle over de grootte en het aantal partities in elke pool. Taken kunnen vragen om geheugenpartities toegewezen te krijgen en een verwijzing naar het opslaggebied te ontvangen. Het is de verantwoordelijkheid van de taak om geen gegevens buiten de partitie te schrijven. De partitie kan door elke taak ongedaan worden gemaakt door de aanwijzer door te geven aan een API-functie. Het aanvragen van de toewijzing van een partitie, wanneer er geen meer beschikbaar zijn, kan leiden tot een fout of taakonderbreking, afhankelijk van de opties die zijn geselecteerd in de API-aanroep en de Nucleus SE-configuratie.

Geheugenpartities configureren

Aantal partitiepools

Zoals met de meeste aspecten van Nucleus SE, wordt de configuratie van partitiepools voornamelijk beheerd door #define uitspraken in nuse_config.h . De belangrijkste instelling is NUSE_PARTITION_POOL_NUMBER , die bepaalt hoeveel partitiepools zijn geconfigureerd voor de toepassing. De standaardinstelling is 0 (dwz er zijn geen partitiepools in gebruik) en u kunt deze instellen op elke waarde tot 16. Een foutieve waarde zal resulteren in een compileerfout, die wordt gegenereerd door een test in nuse_config_check.h (dit is opgenomen in nuse_config.c en dus gecompileerd met deze module) resulterend in een #error verklaring wordt gecompileerd.

Het kiezen van een waarde die niet nul is, is de "master enable" voor partitiepools. Dit heeft tot gevolg dat sommige gegevensstructuren dienovereenkomstig worden gedefinieerd en gedimensioneerd. Gegevensstructuren in ROM moeten worden geïnitialiseerd naar geschikte waarden die kenmerkend zijn voor elke partitiepool. Meer over datastructuren in het volgende artikel. Het activeert ook de instellingen voor het inschakelen van de API.

API ingeschakeld

Elke API-functie (serviceaanroep) in Nucleus SE heeft een activerende #define symbool in nuse_config.h . Voor partitiepools zijn dit:

NUSE_PARTITION_ALLOCATE

NUSE_PARTITION_DEALLOCATE

NUSE_PARTITION_POOL_INFORMATION

NUSE_PARTITION_POOL_COUNT

Standaard zijn deze allemaal ingesteld op FALSE , waardoor elke serviceoproep wordt uitgeschakeld en het opnemen van implementatiecodes wordt voorkomen. Om partitiepools voor een toepassing te configureren, moet u de API-aanroepen selecteren die u wilt gebruiken en hun activeringssymbolen instellen op TRUE .

Hier is een uittreksel van de standaard nuse_config.h bestand:

Er zal een compileerfout optreden als een partitiepool-API-functie is ingeschakeld en er geen partitiepools zijn geconfigureerd (behalve voor NUSE_Partition_Pool_Count() wat altijd is toegestaan). Als uw code een API-aanroep gebruikt, die niet is ingeschakeld, zal er een linktime-fout optreden, omdat er geen implementatiecode in de applicatie is opgenomen.

Serviceoproepen partitiepool

Nucleus RTOS ondersteunt zeven serviceaanroepen, die horen bij partitiepools die de volgende functionaliteit bieden:

  • Wijs een partitie toe:NU_Allocate_Partition() . Geïmplementeerd door NUSE_Partition_Allocate() in Nucleus SE.

  • Toewijzing van een partitie ongedaan maken:NU_Deallocate_Partition() . Geïmplementeerd door NUSE_Partition_Deallocate() in Nucleus SE.

  • Geef informatie over een gespecificeerde partitiepool:NU_Partition_Pool_Information() . Geïmplementeerd door NUSE_Partition_Pool_Information() in Nucleus SE.

  • Retourneer een telling van het aantal partitiepools dat (momenteel) is geconfigureerd voor de toepassing:NU_Established_Partition_Pools() . Geïmplementeerd door NUSE_Partition_Pool_Count() in Nucleus SE.

  • Voeg een nieuwe partitiepool toe aan de applicatie (create):NU_Create_Partition_Pool() . Niet geïmplementeerd in Nucleus SE.

  • Verwijder een partitiepool uit de toepassing (verwijderen):NU_Delete_Partition_Pool() . Niet geïmplementeerd in Nucleus SE.

  • Return pointers naar alle partitiepools (momenteel) in de applicatie:NU_Partition_Pool_Pointers() . Niet geïmplementeerd in Nucleus SE.

De implementatie van elk van deze service calls wordt in detail onderzocht.

Opgemerkt kan worden dat er geen resetfunctie is (in Nucleus RTOS of Nucleus SE). Dit is opzettelijk. Het is heel gebruikelijk voor een taak om een ​​partitie toe te wijzen en een aanwijzer door te geven aan een andere taak (die de toewijzing later waarschijnlijk ongedaan zal maken). Als een partitiepool opnieuw zou worden ingesteld, zouden alle partities als ongebruikt worden gemarkeerd, maar er is geen manier om alle taken die mogelijk gebruikmaken van de partities te volgen en op de hoogte te stellen.

Partitietoewijzing en -toewijzingsservices

De fundamentele bewerkingen die op een partitiepool kunnen worden uitgevoerd, zijn het toewijzen van een partitie (d.w.z. het markeren van een partitie als gebruikt en het retourneren van het adres) ervan en het ongedaan maken van de toewijzing van een partitie (d.w.z. het markeren van een partitie als ongebruikt). Nucleus RTOS en Nucleus SE bieden elk twee basis-API-aanroepen voor deze bewerkingen, die hier worden besproken.

Een partitie toewijzen

De Nucleus RTOS API-aanroep voor het toewijzen van een partitie is zeer flexibel, waardoor u voor onbepaalde tijd of met een time-out kunt pauzeren als de bewerking niet onmiddellijk kan worden voltooid; d.w.z. u probeert een partitie toe te wijzen uit een pool waarin alle partities momenteel zijn toegewezen. Nucleus SE biedt dezelfde service, behalve dat taakonderbreking optioneel is en time-out niet is geïmplementeerd.

Nucleus RTOS API-oproep voor partitietoewijzing

Serviceoproep prototype:

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

Retourneren:

NU_SUCCESS – het gesprek is succesvol afgerond

NU_NO_PARTITION – er zijn geen partities beschikbaar

NU_INVALID_POOL – de aanwijzer van de partitiepool is ongeldig

NU_INVALID_POINTER – de data return pointer is NULL

NU_INVALID_SUSPEND – opschorten is geprobeerd vanuit een niet-taakthread

NU_TIMEOUT – er is geen partitie beschikbaar, zelfs niet na onderbreking gedurende de gespecificeerde time-outperiode

NU_POOL_DELETED – partitiepool werd verwijderd terwijl de taak was opgeschort

Nucleus SE API-aanroep voor toewijzing

Deze API-aanroep ondersteunt de belangrijkste functionaliteit van de Nucleus RTOS API.

Serviceoproep prototype:

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

Parameters:

pool – de index (ID) van de te gebruiken partitiepool

return_pointer – een verwijzing naar een variabele van het type ADDR die het adres van de toegewezen partitie zal ontvangen

opschorten – specificatie voor taakonderbreking; kan NUSE_NO_SUSPEND . zijn of NUSE_SUSPEND

Retourneren:

NUSE_SUCCESS – het gesprek is succesvol afgerond

NUSE_NO_PARTITION – er zijn geen partities beschikbaar

NUSE_INVALID_POOL – de partitiepoolindex is ongeldig

NUSE_INVALID_POINTER – de data return pointer is NULL

NUSE_INVALID_SUSPEND – er is geprobeerd om opschorting uit te voeren vanuit een niet-taakthread of wanneer het blokkeren van API-aanroepen niet was ingeschakeld


Ingebed

  1. Een inleiding tot roestvrij staal en hoe het wordt gemaakt
  2. termen en concepten voor digitaal geheugen
  3. C# Basisinvoer en -uitvoer
  4. C++ Geheugenbeheer:nieuw en verwijderen
  5. Mailboxen:introductie en basisservices
  6. Semaphores:nutsvoorzieningen en datastructuren
  7. Semaphores:introductie en basisdiensten
  8. Event flag-groepen:introductie en basisservices
  9. Wachtrijen:introductie en basisservices
  10. Rutronik en AP Memory ondertekenen wereldwijde distributieovereenkomst
  11. Oppervlakteslijpdiensten:proces en precisie