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

Mailboxen:introductie en basisservices


Bekijk de RTOS Revealed-serie

Brievenbussen werden geïntroduceerd in een eerder artikel. Ze zijn misschien wel de op één na eenvoudigste methode van communicatie tussen taken - na signalen - die wordt ondersteund door Nucleus SE. Ze bieden een goedkope, maar flexibele manier om eenvoudige berichten tussen taken door te geven.

Postvakken gebruiken

In Nucleus SE worden mailboxen geconfigureerd tijdens het bouwen. Er kunnen maximaal 16 mailboxen voor een applicatie zijn geconfigureerd. Als er geen mailboxen zijn geconfigureerd, worden er geen datastructuren of service-oproepcode behorende bij mailboxen in de applicatie opgenomen.

Een mailbox is gewoon een opslaglocatie, groot genoeg voor een enkele variabele van het type ADDR , waarvan de toegang wordt gecontroleerd, zodat het veilig kan worden gebruikt door meerdere taken. Eén taak kan naar een mailbox schrijven. Het is dan vol en er kan geen taak naar worden verzonden totdat een taak de mailbox leest of de mailbox opnieuw wordt ingesteld. Als u probeert te verzenden naar een volle mailbox of te lezen uit een lege mailbox, kan dit leiden tot een fout of taakonderbreking, afhankelijk van de opties die zijn geselecteerd in de API-aanroep en de Nucleus SE-configuratie.

Postvakken en wachtrijen

In sommige OS-implementaties zijn mailboxen niet geïmplementeerd en wordt het gebruik van een wachtrij met één invoer als alternatief aanbevolen. Dit klinkt redelijk, aangezien zo'n wachtrij dezelfde functionaliteit zou bieden als een mailbox. Een wachtrij is echter een wat complexere gegevensstructuur dan een mailbox en brengt aanzienlijk meer overhead met zich mee in gegevens (kop- en staartaanwijzers enz.), code en uitvoeringstijd.

Met Nucleus SE heeft u, net als Nucleus RTOS, de keuze uit beide objecttypes en kunt u zelf de beslissing nemen.

Het is de moeite waard om de alternatieve aanpak te overwegen als uw toepassing meerdere wachtrijen heeft, maar misschien een enkele mailbox. Het vervangen van die mailbox door een wachtrij brengt een kleine dataoverhead met zich mee, maar elimineert alle mailboxgerelateerde API-code. Het zou heel gemakkelijk zijn om de applicatie in beide richtingen te configureren en de geheugenvoetafdruk en prestaties te vergelijken.

Wachtrijen zullen in toekomstige artikelen worden besproken.

Postvakken configureren

Aantal mailboxen

Zoals met de meeste aspecten van Nucleus SE, wordt de configuratie van mailboxen voornamelijk beheerd door #define uitspraken in nuse_config.h . De belangrijkste instelling is NUSE_MAILBOX_NUMBER , waarmee wordt bepaald hoeveel mailboxen voor de toepassing zijn geconfigureerd. De standaardinstelling is 0 (dwz er zijn geen mailboxen 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 mailboxen. Dit heeft tot gevolg dat sommige datastructuren dienovereenkomstig worden gedefinieerd en gedimensioneerd, waarover meer 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 mailboxen zijn dit:

NUSE_MAILBOX_SEND
NUSE_MAILBOX_RECEIVE
NUSE_MAILBOX_RESET
NUSE_MAILBOX_INFORMATION
NUSE_MAILBOX_COUNT

Standaard zijn deze allemaal ingesteld op FALSE , waardoor elke serviceoproep wordt uitgeschakeld en het opnemen van implementatiecodes wordt voorkomen. Om mailboxen 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.

/* Aantal mailboxen in de  systeem - 0-16 */ #define NUSE_MAILBOX_NUMBER 0  /* Mogelijkheden voor serviceoproepen:*/ #define NUSE_MAILBOX_SEND FALSE  #define NUSE_MAILBOX_RECEIVE FALSE  #define NUSE_MAILBOX_RESET FALSE  #define NUSE_MAILBOX_INFORMATION FALSE  #define NUSE_MAILBOX_COUNT FALSE  

Er treedt een compileerfout op als een mailbox-API-functie is ingeschakeld en er geen mailboxen zijn geconfigureerd (behalve voor NUSE_Mailbox_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.

Mailboxserviceoproepen

Nucleus RTOS ondersteunt negen service calls die horen bij mailboxen, die de volgende functionaliteit bieden:

  • Stuur een bericht naar een mailbox. Geïmplementeerd door NUSE_Mailbox_Send() in Nucleus SE.

  • Ontvang een bericht uit een mailbox. Geïmplementeerd door NUSE_Mailbox_Receive() in Nucleus SE.

  • Herstel een mailbox in de ongebruikte staat, zonder dat taken worden onderbroken (reset). Geïmplementeerd door NUSE_Mailbox_Reset() in Nucleus SE.

  • Geef informatie over een opgegeven mailbox. Geïmplementeerd door NUSE_Mailbox_Information() in Nucleus SE.

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

  • Voeg een nieuwe mailbox toe aan de applicatie (maken). Niet geïmplementeerd in Nucleus SE.

  • Verwijder een mailbox uit de applicatie (verwijderen). Niet geïmplementeerd in Nucleus SE.

  • Retour verwijzingen naar alle mailboxen (momenteel) in de applicatie. Niet geïmplementeerd in Nucleus SE.

  • Stuur een bericht naar alle taken die op een mailbox zijn geschorst (uitzending). Niet geïmplementeerd in Nucleus SE.

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

Mailbox schrijf- en leesservices

De fundamentele bewerkingen die op een mailbox kunnen worden uitgevoerd, zijn het schrijven van gegevens ernaar - wat soms verzenden wordt genoemd of posten – en er gegevens uit lezen – wat ook wel ontvangen wordt genoemd . Nucleus RTOS en Nucleus SE bieden elk twee basis-API-aanroepen voor deze bewerkingen, die hier worden besproken.

Schrijven naar een mailbox

De Nucleus RTOS API-aanroep voor het schrijven naar een mailbox is zeer flexibel, waardoor u voor onbepaalde tijd of met een time-out kunt opschorten als de bewerking niet onmiddellijk kan worden voltooid; d.w.z. u probeert naar een volle mailbox te schrijven. Nucleus SE biedt dezelfde service, behalve dat taakonderbreking optioneel is en time-out niet is geïmplementeerd.

Nucleus RTOS biedt ook de mogelijkheid om uit te zenden naar een mailbox, maar dit wordt niet ondersteund door Nucleus SE. Het wordt beschreven onder Niet-geïmplementeerde API's in het volgende artikel.

Nucleus RTOS API-oproep voor verzending naar een mailbox

Serviceoproep prototype:

STATUS NU_Send_To_Mailbox(NU_MAILBOX *mailbox, VOID *bericht,  NIET ONDERTEKEND opschorten);

Parameters:

brievenbus – verwijzing naar de te gebruiken mailbox

bericht – een verwijzing naar het te verzenden bericht dat vier niet ondertekende . is elementen

opschorten – specificatie voor taakonderbreking; kan NU_NO_SUSPEND . zijn of NU_SUSPEND of een time-outwaarde

Retourneren:

NU_SUCCESS – het gesprek is succesvol afgerond

NU_INVALID_MAILBOX – de mailbox-aanwijzer is ongeldig

NU_INVALID_POINTER – de berichtaanwijzer is NULL

NU_INVALID_SUSPEND – opschorten is geprobeerd vanuit een niet-taakthread

NU_MAILBOX_FULL – de mailbox is vol en opschorten is niet gespecificeerd

NU_TIMEOUT – de mailbox is nog steeds vol, zelfs na onderbreking voor de opgegeven periode

NU_MAILBOX_DELETED – de mailbox is verwijderd terwijl de taak was opgeschort

NU_MAILBOX_WAS_RESET – de mailbox is gereset terwijl de taak was onderbroken

Nucleus SE API-oproep voor verzending naar een mailbox

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

Serviceoproep prototype:

STATUS NUSE_Mailbox_Send(NUSE_MAILBOX mailbox, ADDR *bericht,  U8 opgeschort);

Parameters:

brievenbus – de index (ID) van de te gebruiken mailbox

bericht – een verwijzing naar het te verzenden bericht, een enkele variabele van het type ADDR

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

Retourneren:

NUSE_SUCCESS – het gesprek is succesvol afgerond

NUSE_INVALID_MAILBOX – de mailbox-index is ongeldig

NUSE_INVALID_POINTER – de berichtaanwijzer 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

NUSE_MAILBOX_FULL – de mailbox is vol en opschorten is niet gespecificeerd

NUSE_MAILBOX_WAS_RESET – de mailbox is gereset terwijl de taak was onderbroken

Nucleus SE-implementatie van Mailbox Send

Het grootste deel van de code van de NUSE_Mailbox_Send() API-functie – na parametercontrole – wordt geselecteerd door voorwaardelijke compilatie, afhankelijk van of ondersteuning voor het blokkeren (taakonderbreken) API-aanroepen is ingeschakeld. We zullen de twee varianten hier afzonderlijk bekijken.

Als blokkeren niet is ingeschakeld, is de logica voor deze API-aanroep vrij eenvoudig en vereist de code weinig uitleg:

if (NUSE_Mailbox_Status[mailbox]) /* mailbox vol */{ return_value =NUSE_MAILBOX_FULL;}else /* mailbox leeg */{ NUSE_Mailbox_Data[mailbox] =*bericht; NUSE_Mailbox_Status[mailbox] =WAAR; return_value =NUSE_SUCCESS;}

Het bericht wordt opgeslagen in het juiste element van NUSE_Mailbox_Data[] en de mailbox gemarkeerd als in gebruik.

Als blokkeren is ingeschakeld, wordt de code complexer:

doe{ if (!NUSE_Mailbox_Status[mailbox]) /* mailbox leeg */ { NUSE_Mailbox_Data[mailbox] =*bericht; NUSE_Mailbox_Status[mailbox] =WAAR; if (NUSE_Mailbox_Blocking_Count[mailbox] !=0) { U8 index; /* controleer of een taak is geblokkeerd */ /* op deze mailbox */ NUSE_Mailbox_Blocking_Count[mailbox]--; for (index=0; index 

Enige uitleg kan nuttig zijn:

De code is ingesloten in een do…while loop, die doorgaat terwijl de parameter suspend heeft de waarde NUSE_SUSPEND .

Als de mailbox leeg is, wordt het aangeleverde bericht opgeslagen en wordt de mailboxstatus gewijzigd om aan te geven dat deze vol is. Er wordt gecontroleerd of er taken op de mailbox zijn opgeschort (wacht op ontvangst). Als er nog taken wachten, wordt de eerste gewekt. De opschorten variabele is ingesteld op NUSE_NO_SUSPEND en de API-aanroep wordt afgesloten met NUSE_SUCCESS .

Als de mailbox vol is en onderbreken is ingesteld op NUSE_NO_SUSPEND , wordt de API-aanroep afgesloten met NUSE_MAILBOX_FULL . Als opschorten was ingesteld op NUSE_SUSPEND , wordt de taak opgeschort. Bij terugkeer (d.w.z. wanneer de taak wordt gewekt), als de geretourneerde waarde NUSE_SUCCESS is , wat aangeeft dat de taak is gewekt omdat een bericht is gelezen (in tegenstelling tot een reset van de mailbox), loopt de code terug naar boven.


Ingebed

  1. Een inleiding tot Cam Locks en hoe ze werken
  2. Een inleiding tot oogschroeven en hoe ze werken
  3. Een inleiding tot doorvoertules en hoe ze werken
  4. Een inleiding tot roestvrij staal en hoe het wordt gemaakt
  5. COVID 19 en Cloud; COVID 19 en de impact ervan op bedrijven
  6. C# Basisinvoer en -uitvoer
  7. Semaphores:nutsvoorzieningen en datastructuren
  8. Semaphores:introductie en basisdiensten
  9. Event flag-groepen:nutsvoorzieningen en datastructuren
  10. Event flag-groepen:introductie en basisservices
  11. Wachtrijen:introductie en basisservices