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:
-
Definir sinalizadores de evento. Implementado por NUSE_Event_Group_Set () no Núcleo SE.
-
Recupere sinalizadores de evento. Implementado por NUSE_Event_Group_Retrieve () no Núcleo SE.
-
Fornece informações sobre um grupo de sinalizadores de evento especificado. Implementado por NUSE_Event_Group_Information () no Núcleo SE.
-
Retorne uma contagem de quantos grupos de sinalizadores de evento estão (atualmente) configurados para o aplicativo. Implementado por NUSE_Event_Group_Count () no Núcleo SE.
-
Adicionar um novo grupo de sinalizadores de evento ao aplicativo (criar). Não implementado no Nucleus SE.
-
Remover um grupo de sinalizadores de evento do aplicativo (excluir). Não implementado no Nucleus SE.
-
Retorne ponteiros para todos os grupos de sinalizadores de evento (atualmente) no aplicativo. Não implementado no Nucleus SE.
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
- Uma introdução aos Cam Locks e como funcionam
- Uma introdução aos parafusos de olho e como eles funcionam
- Uma introdução aos ilhós e como eles funcionam
- Uma introdução ao aço inoxidável e como ele é feito
- Entrada e saída básica em C#
- Caixas de correio:introdução e serviços básicos
- Semáforos:serviços utilitários e estruturas de dados
- Semáforos:introdução e serviços básicos
- Grupos de sinalizadores de evento:serviços de utilidade e estruturas de dados
- Filas:introdução e serviços básicos