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

Efficiënte Inter-Task Communicatie met Nucleus SE Signals

In deze RTOS Revealed-serie verkennen we signals – de simpelste, laag-kost methode voor inter-task communicatie in Nucleus SE. Signals laten lichtgewicht, betrouwbare message-passing tussen taken toe.

Signals Gebruiken

In tegenstelling tot andere kernel-objecten, zijn signals niet autonoom; ze zijn intrinsiek gekoppeld aan een taak en bestaan alleen binnen die taak's context. Wanneer signals ingeschakeld zijn in een applicatie, ontvangt elke taak automatisch een set van acht binaire signaal-vlaggen.

Elke taak kan de signaal-vlaggen van een andere taak zetten. Echter, alleen de eigenaarstaak mag die vlaggen lezen en wissen – en lezen is destructief, wat betekent dat de vlaggen gereset worden tijdens de leesoperatie. Geen andere taak kan de signaal-state van een taak inspecteren of wijzigen.

Nucleus RTOS biedt een faciliteit die een taak in staat stelt een callback te nomineren die draait wanneer een andere taak een van zijn signaal-vlaggen zet. Dit is analoog aan een interrupt-service-routine. Helaas is deze feature niet beschikbaar in Nucleus SE; taken moeten hun signaal-vlaggen expliciet pollen.

Signals Configureren

Signals worden geconfigureerd primair via #define directieven in nuse_config.h. De sleutelmacro is NUSE_SIGNAL_SUPPORT, wat, wanneer ingesteld op TRUE, signaal-ondersteuning activeert over de hele applicatie. Het aantal signalen per taak is vast op acht; geen additionele configuratie is vereist.

Het inschakelen van signals creëert de benodigde datastructuren en activeert de relevante API-calls. Elke API-functie in Nucleus SE heeft zijn eigen enabling-macro. Voor signals zijn de volgende enables gedefinieerd:

NUSE_SIGNALS_SEND NUSE_SIGNALS_RECEIVE

Standaard zijn beide ingesteld op FALSE, wat de corresponderende service-calls uitschakelt en enige implementatie-code weglaten. Om signals te gebruiken, stel de gewenste enables in op TRUE. Het niet inschakelen van de API tijdens het gebruik van een call resulteert in een compile-time error; een niet-geïmplementeerde API gebruiken zal een link-time error veroorzaken.

Sample-uitzug uit nuse_config.h:

#define NUSE_SIGNAL_SUPPORT FALSE /* Activeert ondersteuning voor signals */ #define NUSE_SIGNALS_SEND FALSE /* Service call enabler */ #define NUSE_SIGNALS_RECEIVE FALSE /* Service call enabler */

Signals Service Calls

Nucleus SE biedt vier primaire service-calls gerelateerd aan signals. Er zijn slechts twee geïmplementeerd in SE; de anderen zijn gereserveerd voor RTOS maar niet SE.

  • Signals versturen naar een gespecificeerde taak – NUSE_Signals_Send()
  • Signals ontvangen – NUSE_Signals_Receive()
  • Een signal-handler registreren – niet geïmplementeerd in SE
  • Signals in/uitschakelen – niet geïmplementeerd in SE

Versturen en Ontvangen Operaties

Signaal-vlaggen zijn bits, het beste te visualiseren als binaire getallen. Aangezien standaard C geen binaire literalen kent, bevat Nucleus SE nuse_binary.h, wat macros definieert zoals b01010101 voor alle 256 8-bit waarden.

#define b00000000 ((U8)0x00) #define b00000001 ((U8)0x01) #define b00000010 ((U8)0x02) #define b00000011 ((U8)0x03) #define b00000100 ((U8)0x04) #define b00000101 ((U8)0x05)

Signals Versturen

Elke taak mag een of meer signaal-vlaggen op een andere taak zetten via een OR-operatie – eerder gezet vlaggen blijven ongewijzigd.

Nucleus RTOS API Call

STATUS NU_Send_Signals(NU_TASK *task, UNSIGNED signals);

Parameters:

  • task – pointer naar het control-block van de doel-taak
  • signals – waarde van de signaal-vlaggen om te zetten

Returns:

  • NU_SUCCESS – call geslaagd
  • NU_INVALID_TASK – ongeldige task-pointer

Nucleus SE API Call

STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);

Parameters:

  • task – taak-index (ID) van de doel-taak
  • signals – waarde van de signaal-vlaggen om te zetten

Returns:

  • NUSE_SUCCESS – call geslaagd
  • NUSE_INVALID_TASK – ongeldige taak-index

Implementatie van NUSE_Signals_Send()

STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals){ #if NUSE_API_PARAMETER_CHECKING if (task >= NUSE_TASK_NUMBER){ return NUSE_INVALID_TASK; } #endif NUSE_CS_Enter(); NUSE_Task_Signal_Flags[task] |= signals; NUSE_CS_Exit(); return NUSE_SUCCESS; }

Signals Ontvangen

Een taak kan alleen zijn eigen signaal-vlaggen lezen, en de operatie is destructief – de vlaggen worden gewist bij lezen.

Nucleus RTOS API Call

UNSIGNED NU_Receive_Signals(VOID);

Retourneert de huidige signaal-vlag-waarde.

Nucleus SE API Call

U8 NUSE_Signals_Receive(void);

Retourneert de huidige signaal-vlag-waarde.

Implementatie van NUSE_Signals_Receive()

U8 NUSE_Signals_Receive(void){ U8 signals; NUSE_CS_Enter(); signals = NUSE_Task_Signal_Flags[NUSE_Task_Active]; NUSE_Task_Signal_Flags[NUSE_Task_Active] = 0; NUSE_CS_Exit(); return signals; }

Deze straightforward functies illustreren hoe Nucleus SE signals efficiënt beheert zonder taak-blocking of scheduling te beïnvloeden.

Ingebed

  1. Kunstmatige Neurale Netwerken Verbeteren Draadloze Communicatieprestaties
  2. Flexibele rectenna zet WiFi-signalen om in elektriciteit voor kleine apparaten
  3. Kwantumcircuit doorbreekt barrières: detecteer de zwakste radiosignalen mogelijk
  4. Halfgeleiderlasers emitteren nu microgolven en vangen radiosignalen, wegbereider voor ultra-snelle Wi-Fi
  5. Real-time portamento-algoritme verenigt elk twee audiosignalen naadloos
  6. Essentiële RF- en Microgolf-ontwerpprincipes voor Betrouwbare PCB-prestaties
  7. Efficiënte Inter-Task Communicatie met Nucleus SE Signals
  8. Rutronik distribueert Redpine Signals' RS14100: ultra-laag-vermogen, multi-protocol veilige wireless MCU's
  9. Rutronik biedt ultra-laag-vermogen, multi-protocol SoCs van Redpine Signals
  10. Real-time radio-gebaseerde imaging: detecteren verborgen en hoog-snelheids objecten op afstand
  11. De magnetische handtekening van een enkele atoomkern meten