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