Comunicação Inter-Tarefa Eficiente com Signals do Nucleus SE
Nesta série RTOS Revealed, exploramos signals — o método mais simples e de baixo custo para comunicação inter-tarefa no Nucleus SE. Signals permitem passagem de mensagens leve e confiável entre tarefas.
Usando Signals
Diferente de outros objetos kernel, signals não são autônomos; são intrinsecamente ligados a uma tarefa e existem apenas no contexto daquela tarefa. Quando signals habilitados na aplicação, toda tarefa recebe automaticamente conjunto de oito flags binárias de signal.
Qualquer tarefa pode setar flags de signal de outra tarefa. No entanto, apenas a tarefa proprietária pode ler e limpar aquelas flags — e a leitura é destrutiva, significando que flags são resetadas durante operação de leitura. Nenhuma outra tarefa pode inspecionar ou modificar estado de signal de uma tarefa.
Nucleus RTOS oferece facilidade que permite tarefa nomear callback para rodar quando outra tarefa seta uma de suas signal flags. Isso é análogo a rotina de serviço de interrupção. Infelizmente, este recurso não está disponível no Nucleus SE; tarefas devem explicitamente pollear suas signal flags.
Configurando Signals
Signals são configurados principalmente através de diretivas #define em nuse_config.h. Macro-chave é NUSE_SIGNAL_SUPPORT, que, quando definida como TRUE, ativa suporte a signals em toda aplicação. Número de signals por tarefa é fixo em oito; nenhuma configuração adicional necessária.
Habilitar signals cria estruturas de dados necessárias e ativa chamadas de API relevantes. Cada função API no Nucleus SE tem sua própria macro de habilitação. Para signals, as seguintes enables são definidas:
NUSE_SIGNALS_SEND NUSE_SIGNALS_RECEIVE
Por padrão, ambas são FALSE, desabilitando chamadas de serviço correspondentes e omitindo código de implementação. Para usar signals, defina enables desejados como TRUE. Falha em habilitar API enquanto usa chamada resultará em erro de compilação; usar API não implementada causará erro de link.
Trecho de exemplo de nuse_config.h:
#define NUSE_SIGNAL_SUPPORT FALSE /* Habilita suporte para signals */ #define NUSE_SIGNALS_SEND FALSE /* Service call enabler */ #define NUSE_SIGNALS_RECEIVE FALSE /* Service call enabler */
Chamadas de Serviço de Signals
Nucleus SE fornece quatro chamadas de serviço primárias relacionadas a signals. Apenas duas implementadas no SE; as outras reservadas para RTOS mas não SE.
- Enviar signals para tarefa especificada – NUSE_Signals_Send()
- Receber signals – NUSE_Signals_Receive()
- Registrar handler de signal – não implementado no SE
- Habilitar/desabilitar signals – não implementado no SE
Operações Send e Receive
Signal flags são bits, melhor visualizadas como números binários. Como C padrão carece de literais binários, Nucleus SE inclui nuse_binary.h, que define macros como b01010101 para todos 256 valores de 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)
Enviando Signals
Qualquer tarefa pode setar uma ou mais signal flags em outra tarefa via operação OR — flags previamente setadas permanecem inalteradas.
Chamada de API Nucleus RTOS
STATUS NU_Send_Signals(NU_TASK *task, UNSIGNED signals);
Parâmetros:
- task – ponteiro para bloco de controle da tarefa alvo
- signals – valor das signal flags a setar
Retornos:
- NU_SUCCESS – chamada sucedeu
- NU_INVALID_TASK – ponteiro de tarefa inválido
Chamada de API Nucleus SE
STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);
Parâmetros:
- task – índice (ID) da tarefa alvo
- signals – valor das signal flags a setar
Retornos:
- NUSE_SUCCESS – chamada sucedeu
- NUSE_INVALID_TASK – índice de tarefa inválido
Implementação 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; }
Recebendo Signals
Tarefa só pode ler suas próprias signal flags, e operação é destrutiva — flags são limpas na leitura.
Chamada de API Nucleus RTOS
UNSIGNED NU_Receive_Signals(VOID);
Retorna valor atual das signal flags.
Chamada de API Nucleus SE
U8 NUSE_Signals_Receive(void);
Retorna valor atual das signal flags.
Implementação 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; }
Essas funções diretas ilustram como Nucleus SE gerencia signals eficientemente sem afetar bloqueio ou escalonamento de tarefas.
Integrado
- Comunicação Inter-Tarefa Eficiente com Signals do Nucleus SE
- Rutronik Distribui RS14100 da Redpine Signals: MCUs Wireless Seguros Multi-Protocolo Ultra-Low-Power
- Rutronik Oferece SoCs Multi-Protocolo Ultra-Low-Power da Redpine Signals
- Medindo a Assinatura Magnética do Núcleo de Um Único Átomo
- Redes Neurais Artificiais Impulsionam Desempenho de Comunicações Sem Fio
- Retena Flexível Converte Sinais WiFi em Eletricidade para Pequenos Dispositivos
- Circuito Quântico Detecta os Sinais de Rádio Mais Fracos Possíveis (Fótons Individuais)
- Lasers Semicondutores Agora Emitem Micro-ondas e Captam Sinais de Rádio, Pavimentando Wi-Fi Ultra-rápido
- Algoritmo de Portamento em Tempo Real Unifica Quaisquer Dois Sinais de Áudio Perfeitamente
- Princípios Essenciais de Design RF e Micro-ondas para Desempenho Confiável de PCI