Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial Internet of Things >> Integrado

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.

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:

Retornos:

Chamada de API Nucleus SE

STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);

Parâmetros:

Retornos:

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

  1. Comunicação Inter-Tarefa Eficiente com Signals do Nucleus SE
  2. Rutronik Distribui RS14100 da Redpine Signals: MCUs Wireless Seguros Multi-Protocolo Ultra-Low-Power
  3. Rutronik Oferece SoCs Multi-Protocolo Ultra-Low-Power da Redpine Signals
  4. Medindo a Assinatura Magnética do Núcleo de Um Único Átomo
  5. Redes Neurais Artificiais Impulsionam Desempenho de Comunicações Sem Fio
  6. Retena Flexível Converte Sinais WiFi em Eletricidade para Pequenos Dispositivos
  7. Circuito Quântico Detecta os Sinais de Rádio Mais Fracos Possíveis (Fótons Individuais)
  8. Lasers Semicondutores Agora Emitem Micro-ondas e Captam Sinais de Rádio, Pavimentando Wi-Fi Ultra-rápido
  9. Algoritmo de Portamento em Tempo Real Unifica Quaisquer Dois Sinais de Áudio Perfeitamente
  10. Princípios Essenciais de Design RF e Micro-ondas para Desempenho Confiável de PCI