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

Grupos de sinalizadores de evento:introdução e serviços básicos


Veja a série RTOS Revelado

Os grupos de sinalizadores de evento foram introduzidos em um artigo anterior. No Nucleus SE, eles são um pouco semelhantes aos sinais, mas com maior flexibilidade. Eles fornecem um meio de baixo custo, mas flexível, de passar mensagens simples entre tarefas.

Usando sinalizadores de evento

No Nucleus SE, os sinalizadores de evento são configurados no momento da construção. Pode haver no máximo 16 grupos de sinalizadores de evento configurados para um aplicativo. Se nenhum grupo de sinalizador de evento for configurado, nenhuma estrutura de dados ou código de chamada de serviço pertencente a grupos de sinalizador de evento será incluído no aplicativo.

Um grupo de sinalizadores de evento é simplesmente um conjunto de oito sinalizadores de 1 bit, cujo acesso é controlado para que possa ser utilizado com segurança por várias tarefas. Uma tarefa pode definir ou limpar qualquer combinação de sinalizadores de evento. Outra tarefa pode ler o grupo de sinalizadores de evento a qualquer momento ou pode esperar (em votação ou suspenso) por um padrão específico de sinalizadores.

Configurando grupos de sinalizadores de evento

Número de grupos de sinalizadores de evento

Como acontece com a maioria dos aspectos do Nucleus SE, a configuração dos grupos de sinalizadores de evento é controlada principalmente por #define declarações em nuse_config.h . A configuração principal é NUSE_EVENT_GROUP_NUMBER , que determina quantos grupos de sinalizadores de evento são configurados para o aplicativo. A configuração padrão é 0 (ou seja, nenhum grupo de sinalizadores de evento está em uso) e você pode defini-lo com qualquer valor até 16. Um valor incorreto resultará em um erro de tempo de compilação, que é gerado por um teste em nuse_config_check. h (isso está incluído em nuse_config.c e, portanto, compilado com este módulo) resultando em um #error declaração sendo compilada.

A escolha de um valor diferente de zero é a “habilitação principal” para grupos de sinalizadores de evento. Isso resulta em algumas estruturas de dados sendo definidas e dimensionadas de acordo, das quais mais adiante nesta série. Ele também ativa as configurações de ativação da API.

Ativa API

Cada função de API (chamada de serviço) no Nucleus SE tem um #define de ativação símbolo em nuse_config.h . Para grupos de sinalizadores de evento, são:

  NUSE_EVENT_GROUP_SET   NUSE_EVENT_GROUP_RETRIEVE   NUSE_EVENT_GROUP_INFORMATION   NUSE_EVENT_GROUP_COUNT  

Por padrão, todos eles são definidos como FALSO , desabilitando cada chamada de serviço e inibindo a inclusão de qualquer código de implementação. Para configurar grupos de sinalizadores de evento para um aplicativo, você precisa selecionar as chamadas de API que deseja usar e definir seus símbolos de ativação para TRUE .

Aqui está um trecho do padrão nuse_config.h Arquivo.
  #define NUSE_EVENT_GROUP_NUMBER 0 / * Número de grupos de eventos   no sistema - 0-16 * /   #define NUSE_EVENT_GROUP_SET FALSE / * Ativador de chamada de serviço * /   #define NUSE_EVENT_GROUP_RETRIEVE FALSE / * Ativador de chamada de serviço * /   #define NUSE_EVENT_GROUP_INFORMATION FALSE / * Ativador de chamada de serviço * /   #define NUSE_EVENT_GROUP_COUNT FALSE / * Ativador de chamada de serviço * /  

Um erro de tempo de compilação ocorrerá se uma função API do grupo de sinalizadores de evento estiver habilitada e nenhum grupo de sinalizadores de evento for configurado (exceto para NUSE_Event_Group_Count () que é sempre permitido). Se o seu código usar uma chamada de API, que não foi habilitada, ocorrerá um erro de tempo de link, pois nenhum código de implementação terá sido incluído no aplicativo.

Chamadas de serviço de sinalização de evento

O Nucleus RTOS oferece suporte a sete chamadas de serviço que pertencem a sinalizadores de evento, que fornecem a seguinte funcionalidade:


A implementação de cada uma dessas chamadas de serviço é examinada em detalhes.

Pode-se notar que não há função de redefinição fornecida (no Nucleus RTOS ou no Nucleus SE). Isso é intencional. Uma redefinição implica que uma condição especial está prevalecendo. Para um grupo de sinalizadores de evento, a única condição “especial” seria todos os zeros, que podem ser configurados com NUSE_Event_Group_Set () .

Serviços de recuperação e definição de grupos de sinalizadores de eventos

As operações fundamentais, que podem ser realizadas em um grupo de sinalizadores de evento, são definir um ou mais sinalizadores e recuperar os estados atuais dos sinalizadores. O Nucleus RTOS e o Nucleus SE fornecem, cada um, duas chamadas API básicas para essas operações, que serão discutidas aqui.

Como os sinalizadores de evento são bits, eles são mais bem visualizados como números binários. Como o padrão C não suporta uma representação de constantes binárias (apenas octal e hexadecimal), a distribuição do Nucleus SE inclui um arquivo de cabeçalho útil - nuse_binary.h - que contém #define símbolos da forma b01010101 para todos os 256 valores de 8 bits.

Definir sinalizadores de evento

A chamada da API Nucleus RTOS para definir sinalizadores de evento é muito flexível, permitindo definir e limpar sinalizadores de evento usando E e OU operações. O Nucleus SE fornece o mesmo serviço, exceto que a suspensão da tarefa é opcional.

Chamada da API Nucleus RTOS para configuração do sinalizador

Protótipo de chamada de serviço:


STATUS NU_Set_Events (grupo NU_EVENT_GROUP *, UNSIGNED event_flags,
operação OPÇÃO);

Parâmetros:

grupo - ponteiro para o bloco de controle do grupo de sinalizadores de evento fornecido pelo usuário

event_flags - o valor do bit do padrão de sinalizadores a serem operados

operação - a operação a ser executada; pode ser NU_OR (para definir sinalizadores) ou NU_AND (para limpar sinalizadores)

Retorna:

NU_SUCCESS - a chamada foi completada com sucesso

NU_INVALID_GROUP - o ponteiro do grupo de sinalizadores de evento é inválido

NU_INVALID_OPERATION - a operação especificada não era NU_OR ou NU_AND

Chamada de API Nucleus SE para configuração de sinalização

Esta chamada de API oferece suporte à funcionalidade principal da API Nucleus RTOS.

Protótipo de chamada de serviço:

STATUS NUSE_Event_Group_Set (grupo NUSE_EVENT_GROUP,
U8 event_flags, operação OPTION);

Parâmetros:

grupo - o índice (ID) do grupo de eventos no qual os sinalizadores devem ser definidos / apagados

event_flags - o valor do bit do padrão de sinalizadores a serem operados

operação - a operação a ser executada; pode ser NUSE_OR (para definir sinalizadores) ou NUSE_AND (para limpar sinalizadores)

Retorna:

NUSE_SUCCESS - a chamada foi completada com sucesso

NUSE_INVALID_GROUP - o índice do grupo de sinalizadores de evento é inválido

NUSE_INVALID_OPERATION - a operação especificada não era NUSE_OR ou NUSE_AND

Implementação do Nucleus SE de Definir Sinalizadores de Evento

O código inicial do NUSE_ Event_Group_Set () A função API - após a verificação do parâmetro - é comum, quer o suporte para bloquear (suspender a tarefa) chamadas API esteja habilitado ou não. A lógica é bastante simples:
  NUSE_CS_Enter (); if (operação ==NUSE_OR) {NUSE_Event_Group_Data [group] | =event_flags;} else / * NUSE_AND * / {NUSE_Event_Group_Data [group] &=event_flags;}  

O padrão de bits, event_flags , é apenas ORed ou AND no grupo de sinalizadores de evento especificado.

O código restante só é incluído se o bloqueio de tarefas estiver habilitado:
  #if NUSE_BLOCKING_ENABLE   enquanto (NUSE_Event_Group_Blocking_Count [grupo]! =0)   {  Índice U8; / * verificar se alguma tarefa está bloqueada * /   / * neste grupo de eventos * /   para (índice =0; índice   {  if ((LONIB (NUSE_Task_Status [índice]) ==  NUSE_EVENT_SUSPEND)   &&(HINIB (NUSE_Task_Status [índice]) ==grupo))   {  NUSE_Task_Blocking_Return [index] =NUSE_SUCCESS;   NUSE_Task_Status [índice] =NUSE_READY;   pausa;  }  }   NUSE_Event_Group_Blocking_Count [grupo] -;  }   #if NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER   NUSE_Reschedule (NUSE_NO_TASK);   #endif   #endif   NUSE_CS_Exit ();   retornar NUSE_SUCCESS;  

Se alguma tarefa for suspensa (recuperando de) este grupo de sinalizadores de evento, todas serão retomadas. Quando eles têm a oportunidade de executar, o que depende do programador, eles podem determinar se suas condições de retorno foram atendidas - consulte Recuperando sinalizadores de evento abaixo.

Continue para a página dois>>

Integrado

  1. Uma introdução aos Cam Locks e como funcionam
  2. Uma introdução aos parafusos de olho e como eles funcionam
  3. Uma introdução aos ilhós e como eles funcionam
  4. Uma introdução ao aço inoxidável e como ele é feito
  5. Entrada e saída básica em C#
  6. Caixas de correio:introdução e serviços básicos
  7. Semáforos:serviços utilitários e estruturas de dados
  8. Semáforos:introdução e serviços básicos
  9. Grupos de sinalizadores de evento:serviços de utilidade e estruturas de dados
  10. Filas:introdução e serviços básicos