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 in Nucleus SE: Overzicht, Configuratie en API-Essenties

Semaphores in Nucleus SE: Overzicht, Configuratie en API-Essenties
Bekijk de RTOS Revealed serie

Semaphores zijn een fundamenteel mechanisme voor het synchroniseren van toegang tot gedeelde bronnen in embedded-systemen. Ze laten taken veilig controle over een bron verkrijgen en vrijgeven zonder conflicten.

Semaphores Gebruiken

In Nucleus SE wordt semaphore-ondersteuning ingeschakeld tijdens het build-proces. Een enkele applicatie kan maximaal 16 semaphores configureren. Als u ervoor kiest geen semaphores te gebruiken, worden de gerelateerde datastructuren en API-code uit de finale binary uitgesloten, wat de footprint reduceert.

Een semaphore is simpelweg een 8-bit counter wiens waarde beschermd is zodat meerdere taken het veilig kunnen manipuleren. Taken roepen Obtain aan om de counter te decrementeren en Release om het te incrementeren. Als een taak probeert een semaphore te obtainen wiens counter nul is, hangt het resultaat af van de API-opties en de systeemconfiguratie: de call kan een error returnen of de taak suspenderen totdat de semaphore beschikbaar wordt.

Semaphores Configureren

Aantal Semaphores

Semaphores worden gedefinieerd via #define statements in nuse_config.h. De sleutelmacro is NUSE_SEMAPHORE_NUMBER, wat specificatieert hoeveel semaphore-slots de applicatie zal gebruiken. De standaardwaarde is 0, wat geen semaphore-ondersteuning betekent. Geldige waarden lopen van 0 tot 16. Een ongeldige waarde triggert een compile-time error gegenereerd door nuse_config_check.h (ingeladen via nuse_config.c).

Het instellen van NUSE_SEMAPHORE_NUMBER op een non-zero waarde activeert het semaphore-subsysteem: datastructuren worden gesized, en API-enabling symbolen worden verwerkt.

API Enables

Elke Nucleus SE API-call wordt bewakt door een dedicated enabling-macro in nuse_config.h. Voor semaphores zijn de relevante symbolen:

  • NUSE_SEMAPHORE_OBTAIN
  • NUSE_SEMAPHORE_RELEASE
  • NUSE_SEMAPHORE_RESET
  • NUSE_SEMAPHORE_INFORMATION
  • NUSE_SEMAPHORE_COUNT

Standaard zijn al deze macros ingesteld op FALSE, wat de corresponderende service-calls uitschakelt en hun implementatie uit de build uitsluit. Om een bepaalde API in te schakelen, stel de macro in op TRUE.

Hieronder een snippet uit het standaard nuse_config.h bestand:

#define NUSE_SEMAPHORE_NUMBER 0 /* Aantal semaphores in het systeem – 0‑16 */ #define NUSE_SEMAPHORE_OBTAIN FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_RELEASE FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_RESET FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_INFORMATION FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_COUNT FALSE /* Service call enabler */

Een API-call inschakelen zonder semaphores geconfigureerd te hebben (behalve NUSE_Semaphore_Count(), wat altijd beschikbaar is) resulteert in een compile-time error. Als u een API aanroept die niet ingeschakeld is, treedt een link-time error op omdat de implementatie weggelaten werd.

Semaphore Service Calls

Nucleus SE biedt acht semaphore-gerelateerde service-calls. De eerste vijf zijn volledig geïmplementeerd; de overige drie zijn placeholders voor toekomstige uitbreidingen.

  • Obtain – NUSE_Semaphore_Obtain()
  • Release – NUSE_Semaphore_Release()
  • Reset – NUSE_Semaphore_Reset()
  • Information – NUSE_Semaphore_Information()
  • Count – NUSE_Semaphore_Count()
  • Create – niet geïmplementeerd in Nucleus SE
  • Delete – niet geïmplementeerd in Nucleus SE
  • List All – niet geïmplementeerd in Nucleus SE

Obtain en Release Operaties

De kern-semaphore-operaties zijn obtainen (decrementeren) en releasen (incrementeren). Nucleus RTOS biedt een flexibele obtain-API met optionele suspending en timeouts. Nucleus SE spiegelt dit gedrag, hoewel task-suspensie optioneel is en timeouts niet ondersteund worden.

Nucleus RTOS Obtain API

Prototype:

STATUS NU_Obtain_Semaphore(NU_SEMAPHORE *semaphore, UNSIGNED suspend);

Parameters:

semaphore – pointer naar het semaphore control block.

suspend – kan NU_NO_SUSPEND, NU_SUSPEND, of een timeout-waarde zijn.

Return-waarden:

NU_SUCCESS – operatie geslaagd.

NU_UNAVAILABLE – semaphore-waarde was nul.

NU_INVALID_SEMAPHORE – ongeldige semaphore-pointer.

NU_INVALID_SUSPEND – suspend geprobeerd vanuit non-task context.

NU_SEMAPHORE_WAS_RESET – semaphore gereset terwijl taak gesuspendeerd was.

Nucleus SE Obtain API

Prototype:

STATUS NUSE_Semaphore_Obtain(NUSE_SEMAPHORE semaphore, U8 suspend);

Parameters:

semaphore – de semaphore-index.

suspend – kan NUSE_NO_SUSPEND of NUSE_SUSPEND zijn.

Return-waarden:

NUSE_SUCCESS – operatie geslaagd.

NUSE_UNAVAILABLE – semaphore-waarde was nul.

NUSE_INVALID_SEMAPHORE – ongeldige semaphore-index.

NUSE_INVALID_SUSPEND – suspend geprobeerd vanuit non-task of blocking-API's uitgeschakeld.

NUSE_SEMAPHORE_WAS_RESET – semaphore gereset tijdens suspending.

Implementatie Highlights

Wanneer blocking uitgeschakeld is, checkt de implementatie simpelweg of de counter non-zero is, decrementeert het, en returned NUSE_SUCCESS. Als de counter nul is, returned het NUSE_UNAVAILABLE.

if (NUSE_Semaphore_Counter[semaphore] != 0) { NUSE_Semaphore_Counter[semaphore]--; return_value = NUSE_SUCCESS; } else { return_value = NUSE_UNAVAILABLE; }
Wanneer blocking ingeschakeld is, gaat de routine in een do…while lus die probeert de semaphore te verkrijgen. Als de counter nul is en suspend is NUSE_SUSPEND, wordt de taak geblokkeerd. Bij release wordt de eerste wachtende taak gewekt en de lus herhaalt de acquisitie.
do { if (NUSE_Semaphore_Counter[semaphore] != 0) { NUSE_Semaphore_Counter[semaphore]--; return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } else { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_UNAVAILABLE; } else { NUSE_Semaphore_Blocking_Count[semaphore]++; NUSE_Suspend_Task(NUSE_Task_Active, semaphore << 4 | NUSE_SEMAPHORE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } } while (suspend == NUSE_SUSPEND);

Nucleus RTOS Release API

Prototype:

STATUS NU_Release_Semaphore(NU_SEMAPHORE *semaphore);

Parameters:

semaphore – pointer naar het semaphore control block.

Return-waarden:

NU_SUCCESS – operatie geslaagd.

NU_INVALID_SEMAPHORE – ongeldige semaphore-pointer.

Nucleus SE Release API

Prototype:

STATUS NUSE_Semaphore_Release(NUSE_SEMAPHORE semaphore);

Parameters:

semaphore – de semaphore-index.

Return-waarden:

NUSE_SUCCESS – operatie geslaagd.

NUSE_INVALID_SEMAPHORE – ongeldige semaphore-index.

NUSE_UNAVAILABLE – counter al op 255; kan niet incrementeren.

Implementatie Highlights

De release-routine checkt eerst of de counter onder zijn maximum (255) is. Zo ja, incrementeert het de counter. Als blocking ingeschakeld is en er taken wachten op deze semaphore, wordt de eerste gewekt.

NUSE_CS_Enter(); if (NUSE_Semaphore_Counter[semaphore] < 255) { NUSE_Semaphore_Counter[semaphore]++; return_value = NUSE_SUCCESS; #if NUSE_BLOCKING_ENABLE if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { NUSE_Semaphore_Blocking_Count[semaphore]--; for (U8 index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } #endif } else { return_value = NUSE_UNAVAILABLE; } NUSE_CS_Exit(); return return_value;

Wanneer taken gesuspendeerd zijn op een semaphore, wekt het releasen ervan de eerste wachtende taak, wat het toestaat om uitvoering voort te zetten.

Het volgende artikel zal event flag groups en hun gerelateerde datastructuren verkennen.


Colin Walls heeft meer dan dertig jaar ervaring in de elektronica-industrie, primair gefocust op embedded software. Hij presenteert frequent op conferenties, schrijft technische artikelen, en schreef twee boeken over embedded software. Colin is een embedded software technologist bij Mentor Embedded (de Mentor Graphics Embedded Software Division) en is gevestigd in het VK. Zijn blog is te vinden op https://blogs.mentor.com/colinwalls. Bereik hem via e-mail op colin_walls@mentor.com.

Ingebed

  1. UCAS Verlengt Infosys Contract met Drie Jaar voor Automatisering
  2. Cam-sloten Uitgelegd: Hoe Ze Kasten Discreet Beveiligen
  3. Wat Zijn Oogschroeven? Een Professionele Gids Naar Hun Ontwerp En Gebruik
  4. Roestvrij Staal Uitgelegd: Samenstelling, Productie En Mondiale Impact
  5. Automotive Service Writer: Rol, Taken En Carrièrepad
  6. Mailboxes in Nucleus SE: Een Practische Gids voor Configuratie en Gebruik
  7. Semaphores in Nucleus RTOS: Utility Services & Datastructuren
  8. Event Flag Groups in Nucleus RTOS/SE Beheersen: Utility Services & Datastructuren
  9. Event Flag Groups in Nucleus SE: Een Introductie tot Configuratie en API-Gebruik
  10. Queues in Nucleus SE: Introductie en Kern-Service-Calls
  11. C# Fundamentals: Invoer en Uitvoer Basis