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

Semaphores:introductie en basisdiensten


Bekijk de RTOS Revealed-serie

In een eerder artikel werden semaforen geïntroduceerd. Hun primaire gebruik is de controle over de toegang tot bronnen.

Semaforen gebruiken

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

Een semafoor is gewoon een teller van het type U8 , waarvan de toegang wordt gecontroleerd, zodat het veilig kan worden gebruikt door meerdere taken. Een taak kan een semafoor verlagen (verkrijgen) en verhogen (vrijgeven). Als u probeert een semafoor met de waarde nul te verkrijgen, kan dit leiden tot een fout of taakonderbreking, afhankelijk van de opties die zijn geselecteerd in de API-aanroep en de Nucleus SE-configuratie.

Semaphores configureren

Aantal semaforen

Zoals met de meeste aspecten van Nucleus SE, wordt de configuratie van semaforen voornamelijk bepaald door #define uitspraken in nuse_config.h . De belangrijkste instelling is NUSE_SEMAPHORE_NUMBER , die bepaalt hoeveel semaforen zijn geconfigureerd voor de toepassing. De standaardinstelling is 0 (dwz er zijn geen semaforen 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 #fout verklaring wordt gecompileerd.

Het kiezen van een waarde die niet nul is, is de "master enable" voor semaforen. Dit heeft tot gevolg dat sommige datastructuren dienovereenkomstig worden gedefinieerd en gedimensioneerd, waarover verderop in dit artikel meer. Het activeert ook de instellingen voor het inschakelen van de API.

API ingeschakeld

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

NUSE_SEMAPHORE_OBTAIN
NUSE_SEMAPHORE_RELEASE
NUSE_SEMAPHORE_RESET
NUSE_SEMAPHORE_INFORMATION
NUSE_SEMAPHORE_COUNT

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

#define NUSE_SEMAPHORE_NUMBER 0 /* Aantal semaforen in het systeem - 0-16 */#define NUSE_SEMAPHORE_OBTAIN FALSE /* Serviceoproep inschakelen */#define NUSE_SEMAPHORE_RELEASE FALSE /* Serviceoproep inschakelen */#define NUSE_SEMAPHORE_* oproep-enabler */#define NUSE_SEMAPHORE_INFORMATION FALSE /* Service-oproep-enabler */#define NUSE_SEMAPHORE_COUNT FALSE /* Service-oproep inschakelen */

Er zal een compileerfout optreden als een semafoor-API-functie is ingeschakeld en er geen semaforen zijn geconfigureerd (behalve voor NUSE_Semaphore_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.

Semaphore-serviceoproepen

Nucleus RTOS ondersteunt acht service calls die horen bij semaforen, die de volgende functionaliteit bieden:

  • Verkrijg een semafoor. Geïmplementeerd door NUSE_Semaphore_Obtain() in Nucleus SE.

  • Laat een semafoor los. Geïmplementeerd door NUSE_Semaphore_Release() in Nucleus SE.

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

  • Geef informatie over een gespecificeerde semafoor. Geïmplementeerd door NUSE_Semaphore_Information() in Nucleus SE.

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

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

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

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

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

Semaphore Obtain and Release Services

De fundamentele bewerkingen die op een semafoor kunnen worden uitgevoerd, zijn het verkrijgen (verlagen) en vrijgeven (verhogen). Nucleus RTOS en Nucleus SE bieden elk twee basis-API-aanroepen voor deze bewerkingen, die hier worden besproken.

Een semafoor verkrijgen

De Nucleus RTOS API-aanroep voor het verkrijgen van een semafoor 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 semafoor te verkrijgen die momenteel de waarde nul heeft. Nucleus SE biedt dezelfde service, behalve dat taakonderbreking optioneel is en time-out niet is geïmplementeerd.

Nucleus RTOS API-aanroep voor het verkrijgen van een semafoor

Serviceoproep prototype:

STATUS NU_Obtain_Semaphore(NU_SEMAPHORE *semafoor,
                           UNSIGNED opschorten);

Parameters:

semafoor – verwijzing naar het door de gebruiker geleverde semafoor-regelblok

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_UNAVAILABLE – de semafoor had de waarde nul

NU_INVALID_SEMAPHORE – de semafooraanwijzer is ongeldig

NU_INVALID_SUSPEND – er is geprobeerd om op te schorten vanuit een niet-taak

NU_SEMAPHORE_WAS_RESET – de semafoor werd gereset terwijl de taak was opgeschort

Nucleus SE API-aanroep voor het verkrijgen van een semafoor

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

Serviceoproep prototype:

STATUS NUSE_Semaphore_Obtain(NUSE_SEMAPHORE semafoor,
                             U8 opschorten);

Parameters:

semafoor – de index (ID) van de te gebruiken semafoor

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

Retourneren:

NUSE_SUCCESS – het gesprek is succesvol afgerond

NUSE_UNAVAILABLE – de semafoor had de waarde nul

NUSE_INVALID_SEMAPHORE – de semafoorindex is ongeldig

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_SEMAPHORE_WAS_RESET – de semafoor werd gereset terwijl de taak was opgeschort

Nucleus SE-implementatie van Obtain Semaphore

Het grootste deel van de code van de NUSE_Semaphore_Obtain() 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:

if (NUSE_Semaphore_Counter[semafoor] !=0) /* semafoor beschikbaar */{ NUSE_Semaphore_Counter[semafoor]--; return_value =NUSE_SUCCESS;}else /* semafoor niet beschikbaar */{ return_value =NUSE_UNAVAILABLE;}

De semafoorwaarde wordt getest en, indien niet nul, verlaagd.

Wanneer blokkeren is ingeschakeld, wordt de logica complexer:

do{ if (NUSE_Semaphore_Counter[semafoor] !=0) /* semafoor beschikbaar */ { NUSE_Semaphore_Counter[semafoor]--; return_value =NUSE_SUCCESS; opschorten =NUSE_NO_SUSPEND; } else /* semafoor niet beschikbaar */ { if (suspend ==NUSE_NO_SUSPEND) { return_value =NUSE_UNAVAILABLE; } else { /* block task */ NUSE_Semaphore_Blocking_Count[semafoor]++; NUSE_Suspend_Task(NUSE_Task_Active, semafoor <<4) | NUSE_SEMAPHORE_SUSPEND); return_value =NUSE_Task_Blocking_Return [NUSE_Task_Active]; if (return_value !=NUSE_SUCCESS) { opschorten =NUSE_NO_SUSPEND; } } }} while (onderbreken ==NUSE_SUSPEND);

Enige uitleg van de code 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 semafoor niet nul is, wordt deze verlaagd. De opschorten variabele is ingesteld op NUSE_NO_SUSPEND en de API-aanroep wordt afgesloten met NUSE_SUCCESS .

Als de semafoor nul is en onderbreken is ingesteld op NUSE_NO_SUSPEND , de API-aanroep wordt afgesloten met NUSE_UNAVAILBLE . 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 de semafoor is vrijgegeven (in tegenstelling tot een reset van de semafoor), keert de code terug naar de top.

Een semafoor vrijgeven

De Nucleus RTOS API-aanroep voor het vrijgeven van een semafoor is vrij eenvoudig; de semafoor wordt verhoogd en het succes wordt gerapporteerd. Nucleus SE biedt dezelfde service, behalve dat er een overloopcontrole wordt uitgevoerd.

Nucleus RTOS API-oproep voor het vrijgeven van een semafoor

Serviceoproep prototype:

STATUS NU_Release_Semaphore(NU_SEMAPHORE *semafoor);

Parameters:

semafoor – verwijzing naar het door de gebruiker geleverde semafoor-regelblok

Retourneren:

NU_SUCCESS – het gesprek is succesvol afgerond

NU_INVALID_SEMAPHORE – de semafooraanwijzer is ongeldig

Nucleus SE API-oproep voor het vrijgeven van een semafoor

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

Serviceoproep prototype:

STATUS NUSE_Semaphore_Release(NUSE_SEMAPHORE semafoor);

Parameters:

semafoor – de index (ID) van de vrij te geven semafoor

Retourneren:

NUSE_SUCCESS – het gesprek is succesvol afgerond

NUSE_INVALID_SEMAPHORE – de semafoorindex is ongeldig

NUSE_UNAVAILABLE – de semafoor heeft de waarde 255 en kan niet worden verhoogd

Nucleus SE-implementatie van release-semafoor

De initiële code van de NUSE_Semaphore_Release() API-functie - na parametercontrole - is gebruikelijk, of taakblokkering is ingeschakeld of niet. De waarde van de semafoor wordt gecontroleerd en, als deze kleiner is dan 255, verlaagd.

Verdere code wordt geselecteerd door voorwaardelijke compilatie, als ondersteuning voor het blokkeren (taakonderbreken) API-aanroepen is ingeschakeld:

NUSE_CS_Enter();if (NUSE_Semaphore_Counter[semafoor] <255){ NUSE_Semaphore_Counter[semafoor]++; return_value =NUSE_SUCCESS; #if NUSE_BLOCKING_ENABLE if (NUSE_Semaphore_Blocking_Count[semafoor] !=0) { U8 index; /* controleer of een taak is geblokkeerd */ /* op deze semafoor */ NUSE_Semaphore_Blocking_Count[semafoor]--; for (index=0; index 

Als er taken op deze semafoor worden onderbroken, wordt de eerste gewekt.

Het volgende artikel behandelt enkele aanvullende API-aanroepen die zijn gekoppeld aan gebeurtenisvlaggroepen, samen met de relevante gegevensstructuren.


Colin Walls heeft meer dan dertig jaar ervaring in de elektronica-industrie, grotendeels gericht op embedded software. Colin, een frequente presentator op conferenties en seminars en auteur van talrijke technische artikelen en twee boeken over embedded software, is een embedded softwaretechnoloog bij Mentor Embedded [de Mentor Graphics Embedded Software Division] en is gevestigd in het Verenigd Koninkrijk. Zijn vaste blog is te vinden op:http://blogs.mentor.com/colinwalls. Hij is bereikbaar via e-mail op [email protected]


Ingebed

  1. Een inleiding tot Cam Locks en hoe ze werken
  2. Een inleiding tot oogschroeven en hoe ze werken
  3. Een inleiding tot roestvrij staal en hoe het wordt gemaakt
  4. C# Basisinvoer en -uitvoer
  5. Wat is een autoserviceschrijver en wat doen ze?
  6. Mailboxen:introductie en basisservices
  7. Semaphores:nutsvoorzieningen en datastructuren
  8. Event flag-groepen:nutsvoorzieningen en datastructuren
  9. Event flag-groepen:introductie en basisservices
  10. Wachtrijen:introductie en basisservices
  11. Britse toelatingsdienst voor universiteiten en hogescholen verlengt contract met Infosys om automatisering te stimuleren