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

Event flag-groepen:introductie en basisservices


Bekijk de RTOS Revealed-serie

Gebeurtenisvlaggroepen werden in een eerder artikel geïntroduceerd. In Nucleus SE lijken ze enigszins op signalen, maar met een grotere flexibiliteit. Ze bieden een goedkope, maar flexibele manier om eenvoudige berichten tussen taken door te geven.

Eventvlaggen gebruiken

In Nucleus SE worden gebeurtenisvlaggen geconfigureerd tijdens het bouwen. Er kunnen maximaal 16 gebeurtenisvlaggroepen zijn geconfigureerd voor een toepassing. Als er geen gebeurtenisvlaggroepen zijn geconfigureerd, worden er geen datastructuren of serviceaanroepcodes die horen bij gebeurtenisvlaggroepen, in de toepassing opgenomen.

Een gebeurtenisvlaggroep is eenvoudig een set van acht 1-bits vlaggen, waarvan de toegang wordt gecontroleerd zodat deze veilig door meerdere taken kan worden gebruikt. Eén taak kan elke combinatie van gebeurtenisvlaggen instellen of wissen. Een andere taak kan de gebeurtenisvlaggroep op elk moment lezen of kan wachten (opiniepeiling of opgeschort) op een specifiek patroon van vlaggen.

Eventvlaggroepen configureren

Aantal gebeurtenisvlaggroepen

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

NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT 

Standaard zijn deze allemaal ingesteld op FALSE , waardoor elke serviceoproep wordt uitgeschakeld en het opnemen van implementatiecodes wordt voorkomen. Om gebeurtenisvlaggroepen 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_EVENT_GROUP_NUMBER 0 /* Aantal gebeurtenisgroepen  in het systeem - 0-16 */ #define NUSE_EVENT_GROUP_SET FALSE /* Serviceoproep inschakelen */ #define NUSE_EVENT_GROUP_RETRIEVE FALSE /* Serviceoproep inschakelen */ #define NUSE_EVENT_GROUP_INFORMATION FALSE /* Serviceoproep inschakelen */ #define NUSE_EVENT_GROUP_COUNT FALSE /* Serviceoproep inschakelen */ 

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

Event Flag Service Calls

Nucleus RTOS ondersteunt zeven serviceaanroepen die horen bij gebeurtenisvlaggen, die de volgende functionaliteit bieden:

  • Stel gebeurtenisvlaggen in. Geïmplementeerd door NUSE_Event_Group_Set() in Nucleus SE.

  • Gebeurtenisvlaggen ophalen. Geïmplementeerd door NUSE_Event_Group_Retrieve() in Nucleus SE.

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

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

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

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

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

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

Opgemerkt kan worden dat er geen reset-functie is (in Nucleus RTOS of Nucleus SE). Dit is opzettelijk. Een reset houdt in dat er een bijzondere voorwaarde heerst. Voor een gebeurtenisvlaggroep zou de enige "speciale" voorwaarde allemaal nullen zijn, die kunnen worden ingesteld met NUSE_Event_Group_Set() .

Event Flag Group Set and Retrieve Services

De fundamentele bewerkingen die kunnen worden uitgevoerd op een gebeurtenisvlaggroep, zijn het instellen van een of meer vlaggen en het ophalen van de huidige toestanden van de vlaggen. Nucleus RTOS en Nucleus SE bieden elk twee basis-API-aanroepen voor deze bewerkingen, die hier worden besproken.

Omdat gebeurtenisvlaggen bits zijn, kunnen ze het beste worden gevisualiseerd als binaire getallen. Aangezien standaard C geen weergave van binaire constanten ondersteunt (alleen octaal en hexadecimaal), bevat de Nucleus SE-distributie een handig headerbestand - nuse_binary.h – die #define . bevat symbolen van de vorm b01010101 voor alle 256 8-bits waarden.

Evenementvlaggen instellen

De Nucleus RTOS API-aanroep voor het instellen van gebeurtenisvlaggen is zeer flexibel, waardoor u gebeurtenisvlaggen kunt instellen en wissen met AND en OF activiteiten. Nucleus SE biedt dezelfde service, behalve dat taakonderbreking optioneel is.

Nucleus RTOS API-oproep voor vlaginstelling

Serviceoproep prototype:

STATUS NU_Set_Events(NU_EVENT_GROUP *groep, UNSIGNED event_flags,
                     OPTIE-bewerking);

Parameters:

groep – pointer naar het door de gebruiker geleverde gebeurtenisvlaggroepbesturingsblok

event_flags – de bitwaarde van het patroon van vlaggen waarop gewerkt moet worden

operatie – de uit te voeren operatie; kan NU_OR . zijn (om vlaggen in te stellen) of NU_AND (om vlaggen te wissen)

Retourneren:

NU_SUCCESS – het gesprek is succesvol afgerond

NU_INVALID_GROUP – de aanwijzer van de gebeurtenisvlaggroep is ongeldig

NU_INVALID_OPERATION – de opgegeven bewerking was niet NU_OR of NU_AND

Nucleus SE API-oproep voor vlaginstelling

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

Serviceoproep prototype:

STATUS NUSE_Event_Group_Set(NUSE_EVENT_GROUP groep,
U8 event_flags, OPTION-bewerking);

Parameters:

groep – de index (ID) van de gebeurtenisgroep waarin vlaggen moeten worden ingesteld/gewist

event_flags – de bitwaarde van het patroon van vlaggen waarop gewerkt moet worden

operatie – de uit te voeren operatie; kan NUSE_OR . zijn (om vlaggen in te stellen) of NUSE_AND (om vlaggen te wissen)

Retourneren:

NUSE_SUCCESS – het gesprek is succesvol afgerond

NUSE_INVALID_GROUP – de gebeurtenisvlaggroepsindex is ongeldig

NUSE_INVALID_OPERATION – de opgegeven bewerking was niet NUSE_OR of NUSE_AND

Nucleus SE-implementatie van ingestelde gebeurtenisvlaggen

De initiële code van de NUSE_ Event_Group_Set() API-functie - na parametercontrole - is gebruikelijk, of ondersteuning voor het blokkeren (taakonderbreken) API-aanroepen is ingeschakeld of niet. De logica is vrij eenvoudig:

NUSE_CS_Enter();if (operation ==NUSE_OR){ NUSE_Event_Group_Data[group] |=event_flags;}else /* NUSE_AND */{ NUSE_Event_Group_Data[group] &=event_flags;} 

Het bitpatroon, event_flags , is gewoon ORed of ANDed in de gespecificeerde gebeurtenisvlaggroep.

De resterende code wordt alleen opgenomen als taakblokkering is ingeschakeld:

#if NUSE_BLOCKING_ENABLE  while (NUSE_Event_Group_Blocking_Count[group] !=0)  {  U8-index; /* controleer of er taken zijn geblokkeerd */  /* op deze evenementgroep */  voor (index=0; index  {  if ((LONIB(NUSE_Task_Status[index]) ==  NUSE_EVENT_SUSPEND)  &&(HINIB(NUSE_Task_Status[index]) ==groep))  {  NUSE_Task_Blocking_Return[index] =NUSE_SUCCESS;  NUSE_Task_Status[index] =NUSE_READY;  pauze;  }  }  NUSE_Event_Group_Blocking_Count[groep]--;  }  #if NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER  NUSE_Reschedule(NUSE_NO_TASK);  #endif #endif NUSE_CS_Exit(); retourneer NUSE_SUCCESS; 

Als er taken zijn onderbroken (ophalen van) deze gebeurtenisvlaggroep, worden ze allemaal hervat. Wanneer ze de mogelijkheid hebben om uit te voeren, wat afhankelijk is van de planner, kunnen ze bepalen of aan hun voorwaarden voor terugkeer is voldaan - zie Eventvlaggen ophalen hieronder.

Ga verder naar pagina twee>>


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. C# Basisinvoer en -uitvoer
  6. Mailboxen:introductie en basisservices
  7. Semaphores:nutsvoorzieningen en datastructuren
  8. Semaphores:introductie en basisdiensten
  9. Event flag-groepen:nutsvoorzieningen en datastructuren
  10. Wachtrijen:introductie en basisservices
  11. Arrow en Freelancer.com lanceren Electronics &Electrical Engineering Services Marketplace