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 RTOS: Utility Services & Datastructuren

Semaphores in Nucleus RTOS: Utility Services & Datastructuren
Bekijk de RTOS Revealed serie

Dit artikel vervolgt de kijk op semaphores.

Semaphore Utility Services

Nucleus RTOS biedt vier API-calls die essentiële utilities voor semaphore-beheer bieden: een semaphore resetten, gedetailleerde semaphore-informatie ophalen, het totale aantal semaphores in een applicatie tellen, en pointers naar alle semaphore-objecten verkrijgen. De eerste drie functies zijn volledig geïmplementeerd in Nucleus SE.

Een Semaphore Resetten

In tegenstelling tot de meeste kernel-objecten, herstelt het resetten van een semaphore het naar een gespecificeerde initiële count in plaats van het simpelweg te reïnitialiseren naar de compile-time waarde. Alle taken geblokkeerd op de semaphore worden onmiddellijk gewekt en ontvangen de return-code NUSE_SEMAPHORE_WAS_RESET (of NU_SEMAPHORE_RESET in Nucleus RTOS).

Nucleus RTOS API Call voor Het Resetten van een Semaphore

Service call prototype:

STATUS NU_Reset_Semaphore(NU_SEMAPHORE *semaphore,
UNSIGNED initial_count);

Parameters:

semaphore – pointer naar het semaphore control block geleverd door de gebruiker.

initial_count – de waarde waartoe de semaphore-counter ingesteld moet worden.

Returns:

NU_SUCCESS – de operatie voltooid met succes.

NU_INVALID_SEMAPHORE – de semaphore-pointer is niet geldig.

Nucleus SE API Call voor Het Resetten van een Semaphore

Service call prototype:

STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE semaphore,
U8 initial_count);

Parameters:

semaphore – de index (ID) van de semaphore om te resetten.

initial_count – de waarde waartoe de semaphore-counter ingesteld moet worden.

Returns:

NUSE_SUCCESS – de operatie voltooid met succes.

NUSE_INVALID_SEMAPHORE – de semaphore-index is niet geldig.

Nucleus SE Implementatie van Semaphore Reset

De NUSE_Semaphore_Reset() routine valideert de argumenten en schrijft dan de nieuwe count in de NUSE_Semaphore_Counter[] array. Wanneer blocking ingeschakeld is, loopt het door de task-tabel om taken te vinden die gesuspendeerd zijn op de semaphore, markeert ze als ready, wijst de NUSE_SEMAPHORE_WAS_RESET return-code toe, en triggert ten slotte een reschedule als een priority-scheduler actief is.

while (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (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_SEMAPHORE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Semaphore_Blocking_Count[semaphore]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif

Alle gesuspendeerde taken worden dus overgezet naar de ready-state met de juiste return-code. Als de priority-scheduler actief is, zorgt NUSE_Reschedule() ervoor dat hogere-prioriteit-taken lagere-prioriteit-taken kunnen preëmperen.

Semaphore Informatie

Deze service-call haalt sleutel-details op over een semaphore. In Nucleus SE worden minder velden geretourneerd omdat object-naming, suspend-ordering, en task-suspend mogelijk niet ondersteund worden.

Nucleus RTOS API Call voor Semaphore Informatie

Service call prototype:

STATUS NU_Semaphore_Information(NU_SEMAPHORE *semaphore,
CHAR *name, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);

Parameters:

semaphore – pointer naar het aangevraagde semaphore control block.

name – destination-buffer voor de semaphore-naam (8 karakters plus null-terminator).

current_count – ontvangt de huidige semaphore-counter waarde.

suspend_type – ontvangt het suspend-beleid (bijv. NU_FIFO of NU_PRIORITY).

tasks_waiting – ontvangt het aantal taken gesuspendeerd op de semaphore.

first_task – ontvangt een pointer naar de eerste gesuspendeerde taak's control block.

Returns:

NU_SUCCESS – de call voltooid met succes.

NU_INVALID_SEMAPHORE – de semaphore-pointer is ongeldig.

Nucleus SE API Call voor Semaphore Informatie

Service call prototype:

STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE semaphore,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task);

Parameters:

semaphore – de index van de semaphore.

current_count – ontvangt de huidige counter-waarde.

tasks_waiting – ontvangt het aantal gesuspendeerde taken (indien task-suspend ingeschakeld).

first_task – ontvangt de index van de eerste gesuspendeerde taak (indien task-suspend ingeschakeld).

Returns:

NUSE_SUCCESS – de call voltooid met succes.

NUSE_INVALID_SEMAPHORE – de semaphore-index is ongeldig.

NUSE_INVALID_POINTER – een of meer pointer-argumenten zijn ongeldig.

Nucleus SE Implementatie van Semaphore Informatie

De implementatie is beknopt: het treedt een critical-section binnen, kopieert de counter-waarde, en, als blocking ingeschakeld is, enumereert de task-tabel om wachtende taken te tellen en de eerste gesuspendeerde taak te identificeren. Anders worden de wachtende-count en eerste-taak op nul gezet.

NUSE_CS_Enter(); *current_count = NUSE_Semaphore_Counter[semaphore]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif NUSE_CS_Exit(); return NUSE_SUCCESS;

Het Aantal Semaphores Verkrijgen

Deze service returned het totale aantal semaphores gedefinieerd in de applicatie. In Nucleus RTOS kan de waarde runtime veranderen; in Nucleus SE is het fixed op build-time.

Nucleus RTOS API Call voor Semaphore Count

Service call prototype:

UNSIGNED NU_Established_Semaphores(VOID);

Returns:

Het aantal semaphores gecreëerd in de applicatie.

Nucleus SE API Call voor Semaphore Count

Service call prototype:

U8 NUSE_Semaphore_Count(void);

Returns:

Het aantal semaphores geconfigureerd in de applicatie.

Nucleus SE Implementatie van Semaphore Count

De routine returned simpelweg de waarde van de compile-time constant NUSE_SEMAPHORE_NUMBER.

Vervolg op pagina twee: “Datastructuren” >>

Ingebed

  1. Fundamenten van digitaal geheugen: adressering, toegang en volatiliteit
  2. C++ Structuren vs Classes: Een praktische gids voor embedded-ontwikkelaars
  3. Mailboxes in Nucleus SE: Een Practische Gids voor Configuratie en Gebruik
  4. Semaphores in Nucleus SE: Overzicht, Configuratie en API-Essenties
  5. Event Flag Groups in Nucleus RTOS/SE Beheersen: Utility Services & Datastructuren
  6. Event Flag Groups in Nucleus SE: Een Introductie tot Configuratie en API-Gebruik
  7. Queues in Nucleus SE: Introductie en Kern-Service-Calls
  8. Swissbit toont avantgardistische hardware-beveiliging voor IoT-apparaten op it-sa
  9. Cloud vs. On-Premises Servers: De Juiste Hostingoplossing Kiezen
  10. Microsoft Azure Kondigt Blockchain Tokenisatie & Datamanagement Services Aan
  11. C# Variabelen & Primitive Datatypes onder de knie krijgen: Complete gids