Communication inter-tâches efficace avec les signaux Nucleus SE
Dans cette série RTOS Revealed, nous explorons les signaux — la méthode la plus simple, à faible coût, pour la communication inter-tâches dans Nucleus SE. Les signaux permettent un passage de messages léger et fiable entre tâches.
Utilisation des signaux
Contrairement aux autres objets noyau, les signaux ne sont pas autonomes ; ils sont intrinsèquement liés à une tâche et n'existent que dans le contexte de cette tâche. Quand les signaux sont activés dans une application, chaque tâche reçoit automatiquement un ensemble de huit drapeaux de signal binaires.
Toute tâche peut définir les drapeaux de signal d'une autre tâche. Cependant, seule la tâche propriétaire peut lire et effacer ces drapeaux — et la lecture est destructrice, signifiant que les drapeaux sont réinitialisés pendant l'opération de lecture. Aucune autre tâche ne peut inspecter ou modifier l'état de signal d'une tâche.
Nucleus RTOS offre une facilité qui permet à une tâche de nommer un callback à exécuter quand une autre tâche définit l'un de ses drapeaux de signal. Ceci est analogue à une routine de service d'interruption. Malheureusement, cette fonctionnalité n'est pas disponible dans Nucleus SE ; les tâches doivent explicitement sonder leurs drapeaux de signal.
Configuration des signaux
Les signaux sont configurés principalement via des directives #define dans nuse_config.h. La macro clé est NUSE_SIGNAL_SUPPORT, qui, quand définie sur TRUE, active le support des signaux dans toute l'application. Le nombre de signaux par tâche est fixé à huit ; aucune configuration additionnelle n'est requise.
L'activation des signaux crée les structures de données nécessaires et active les appels API pertinents. Chaque fonction API dans Nucleus SE a sa propre macro d'activation. Pour les signaux, les activations suivantes sont définies :
NUSE_SIGNALS_SEND NUSE_SIGNALS_RECEIVE
Par défaut, les deux sont définies sur FALSE, désactivant les appels de service correspondants et omettant tout code d'implémentation. Pour utiliser les signaux, définissez les activations souhaitées sur TRUE. L'oubli d'activer l'API tout en utilisant un appel résultera en une erreur à la compilation ; utiliser une API non implémentée causera une erreur à l'édition de liens.
Extrait exemple de nuse_config.h :
#define NUSE_SIGNAL_SUPPORT FALSE /* Active le support des signaux */ #define NUSE_SIGNALS_SEND FALSE /* Activateur d'appel de service */ #define NUSE_SIGNALS_RECEIVE FALSE /* Activateur d'appel de service */
Appels de service des signaux
Nucleus SE fournit quatre appels de service principaux liés aux signaux. Seulement deux sont implémentés dans SE ; les autres sont réservés pour RTOS mais pas SE.
- Envoyer des signaux à une tâche spécifiée — NUSE_Signals_Send()
- Recevoir des signaux — NUSE_Signals_Receive()
- Enregistrer un gestionnaire de signal — non implémenté dans SE
- Activer/désactiver les signaux — non implémenté dans SE
Opérations d'envoi et de réception
Les drapeaux de signal sont des bits, mieux visualisés comme nombres binaires. Puisque le C standard manque de littéraux binaires, Nucleus SE inclut nuse_binary.h, qui définit des macros comme b01010101 pour toutes les 256 valeurs 8 bits.
#define b00000000 ((U8)0x00) #define b00000001 ((U8)0x01) #define b00000010 ((U8)0x02) #define b00000011 ((U8)0x03) #define b00000100 ((U8)0x04) #define b00000101 ((U8)0x05)
Envoi de signaux
Toute tâche peut définir un ou plusieurs drapeaux de signal sur une autre tâche via une opération OU — les drapeaux précédemment définis restent inchangés.
Appel API Nucleus RTOS
STATUS NU_Send_Signals(NU_TASK *task, UNSIGNED signals);
Paramètres :
- task — pointeur vers le bloc de contrôle de la tâche cible
- signals — valeur des drapeaux de signal à définir
Retourne :
- NU_SUCCESS — appel réussi
- NU_INVALID_TASK — pointeur de tâche invalide
Appel API Nucleus SE
STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);
Paramètres :
- task — index (ID) de la tâche cible
- signals — valeur des drapeaux de signal à définir
Retourne :
- NUSE_SUCCESS — appel réussi
- NUSE_INVALID_TASK — index de tâche invalide
Implémentation de 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; }
Réception de signaux
Une tâche ne peut lire que ses propres drapeaux de signal, et l'opération est destructrice — les drapeaux sont effacés à la lecture.
Appel API Nucleus RTOS
UNSIGNED NU_Receive_Signals(VOID);
Retourne la valeur actuelle des drapeaux de signal.
Appel API Nucleus SE
U8 NUSE_Signals_Receive(void);
Retourne la valeur actuelle des drapeaux de signal.
Implémentation de 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; }
Ces fonctions simples illustrent comment Nucleus SE gère les signaux efficacement sans affecter le blocage de tâche ou l'ordonnancement.
Embarqué
- Communication inter-tâches efficace avec les signaux Nucleus SE
- Rutronik distribue le RS14100 de Redpine Signals : MCU sans fil multi-protocole sécurisé ultra-basse consommation
- Rutronik propose les SoCs multi-protocoles ultra-basse consommation de Redpine Signals
- Mesure de la signature magnétique du noyau d'un atome unique
- Réseaux de neurones artificiels boostent les performances des communications sans fil
- Une rectenna flexible convertit les signaux WiFi en électricité pour de minuscules appareils
- Un circuit quantique franchit les barrières : détection des signaux radio les plus faibles possibles
- Les lasers à semi-conducteurs émettent maintenant des micro-ondes et capturent des signaux radio, ouvrant la voie au Wi-Fi ultra-rapide
- Algorithme portamento temps réel unifie deux signaux audio sans couture