Semáforos:serviços utilitários e estruturas de dados
Veja a série RTOS Revelado
Este artigo continua a examinar os semáforos.
Serviços utilitários de semáforo
O Nucleus RTOS tem quatro chamadas API que fornecem funções utilitárias associadas aos semáforos:redefinir o semáforo, retornar informações sobre um semáforo, retornar o número de semáforos no aplicativo e retornar ponteiros para todos os semáforos no aplicativo. Os três primeiros são implementados no Nucleus SE.
Redefinindo um Semáforo
Esta chamada de API restaura o semáforo ao seu estado inicial não utilizado. Esta função da API é incomum, comparada com aquela disponível para outros objetos do kernel, pois, embora seja uma reinicialização, ela simplesmente não inicializa seu contador com o valor de inicialização; uma nova contagem inicial é fornecida na chamada. Todas as tarefas que foram suspensas no semáforo são retomadas e recebem um código de retorno de NUSE_SEMAPHORE_WAS_RESET (em Nucleus SE, ou NU_SEMAPHORE_RESET com Nucleus RTOS).
Chamada da API Nucleus RTOS para redefinir um semáforo
Protótipo de chamada de serviço:
STATUS NU_Reset_Semaphore (NU_SEMAPHORE * semáforo,
UNSIGNED initial_count);
Parâmetros:
semáforo - ponteiro para bloco de controle de semáforo fornecido pelo usuário
initial_count - o valor para o qual o contador do semáforo deve ser definido
Retorna:
NU_SUCCESS - a chamada foi completada com sucesso
NU_INVALID_SEMAPHORE - o ponteiro do semáforo não é válido
Chamada de Nucleus SE API para redefinição de um semáforo
Esta chamada de API oferece suporte à funcionalidade principal da API Nucleus RTOS.
Protótipo de chamada de serviço:
STATUS NUSE_Semaphore_Reset (NUSE_SEMAPHORE semáforo,
U8 initial_count);
Parâmetros:
semáforo - o índice (ID) do semáforo a ser redefinido
initial_count - o valor para o qual o contador do semáforo deve ser definido
Retorna:
NUSE_SUCCESS - a chamada foi completada com sucesso
NUSE_INVALID_SEMAPHORE - o índice do semáforo não é válido
Implementação do Nucleus SE do Semaphore Reset
A principal tarefa de NUSE_Semaphore_Reset () A função API - após a verificação do parâmetro - é simplesmente definir a entrada apropriada em NUSE_Semaphore_Counter [] ao valor inicial fornecido.
Quando o bloqueio está habilitado, mais código é necessário para desbloquear as tarefas:
while (NUSE_Semaphore_Blocking_Count [semáforo]! =0) {índice U8; / * verificar se alguma tarefa está bloqueada * / / * neste semáforo * / for (index =0; index
Cada tarefa suspensa no semáforo é marcada como “pronta” com um código de retorno de suspensão de NUSE_SEMAPHORE_WAS_RESET . Após a conclusão desse processo, se o agendador de prioridade estiver em uso, uma chamada é feita para NUSE_Reschedule () , já que uma ou mais tarefas de prioridade mais alta podem ter sido preparadas e precisam ser executadas.
Informações do semáforo
Esta chamada de serviço obtém uma seleção de informações sobre um semáforo. A implementação do Nucleus SE difere do Nucleus RTOS porque retorna menos informações, pois a nomenclatura de objetos e a ordem de suspensão não são suportadas e a suspensão de tarefas pode não estar ativada.
Chamada de Nucleus RTOS API para informações de semáforo
Protótipo de chamada de serviço:
STATUS NU_Semaphore_Information (NU_SEMAPHORE * semáforo,
CHAR * name, UNSIGNED * current_count, OPTION * suspend_type,
UNSIGNED * tasks_waiting, NU_TASK ** first_task);
Parâmetros:
semáforo - ponteiro para cima do bloco de controle do semáforo sobre a qual a informação está sendo solicitada
nome - ponteiro para uma área de destino de 8 caracteres para o nome do semáforo; isso inclui espaço para o terminador nulo
current_count - um ponteiro para uma variável, que receberá o valor atual do contador do semáforo
suspend_type - ponteiro para uma variável que contém o tipo de suspensão da tarefa; os tipos de suspensão de tarefa válidos são NU_FIFO e NU_PRIORITY
tasks_waiting - um ponteiro para uma variável que receberá o número de tarefas suspensas neste semáforo
first_task - um ponteiro para uma variável do tipo NU_TASK que receberá um ponteiro para o bloco de controle da primeira tarefa suspensa
Retorna:
NU_SUCCESS - a chamada foi completada com sucesso
NU_INVALID_SEMAPHORE - o ponteiro do semáforo não é válido
Chamada de API Nucleus SE para informações de semáforo
Esta chamada de API oferece suporte à funcionalidade principal da API Nucleus RTOS.
Protótipo de chamada de serviço:
STATUS NUSE_Semaphore_Information (semáforo NUSE_SEMAPHORE,
U8 * current_count, U8 * tasks_waiting, NUSE_TASK * first_task);
Parâmetros:
semáforo - o índice do semáforo sobre o qual as informações estão sendo solicitadas
current_count - um ponteiro para uma variável, que receberá o valor atual do contador do semáforo
tasks_waiting - um ponteiro para uma variável que receberá o número de tarefas suspensas neste semáforo (nada retornado se a suspensão da tarefa for desativada)
first_task - um ponteiro para uma variável do tipo NUSE_TASK que receberá o índice da primeira tarefa suspensa (nada retornado se a suspensão da tarefa for desativada)
Retorna:
NUSE_SUCCESS - a chamada foi completada com sucesso
NUSE_INVALID_SEMAPHORE - o índice do semáforo não é válido
NUSE_INVALID_POINTER - um ou mais dos parâmetros do ponteiro são inválidos
Implementação Nucleus SE de Informações de Semáforo
A implementação desta chamada de API é bastante direta:
NUSE_CS_Enter (); * current_count =NUSE_Semaphore_Counter [semáforo]; # if NUSE_BLOCKING_ENABLE * tasks_waiting =NUSE_Semaphore_Blocking_Count [semáforo]; if (NUSE_Semaphore_Blocking_Count [semáforo]! =0) {índice U8; para (índice =0; índice
A função retorna o status do semáforo. Então, se o bloqueio de chamadas de API estiver habilitado, o número de tarefas em espera e o índice da primeira são retornados (caso contrário, esses dois parâmetros são definidos como 0).
Obtenção do número de semáforos
Esta chamada de serviço retorna o número de semáforos configurados no aplicativo. Enquanto no Nucleus RTOS isso irá variar ao longo do tempo e o valor retornado representará o número atual de semáforos, no Nucleus SE o valor retornado é definido no momento da construção e não pode ser alterado.
Chamada de Nucleus RTOS API para contagem de semáforo
Protótipo de chamada de serviço:
UNSIGNED NU_Established_Semaphores (VOID);
Parâmetros:
Nenhum
Retorna:
O número de semáforos criados no aplicativo
Chamada de API Nucleus SE para contagem de semáforo
Esta chamada de API oferece suporte à funcionalidade principal da API Nucleus RTOS.
Protótipo de chamada de serviço:
U8 NUSE_Semaphore_Count (vazio);
Parâmetros:
Nenhum
Retorna:
O número de semáforos configurados no aplicativo
Implementação de Núcleo SE de Contagem de Semáforo
A implementação desta chamada de API é quase trivialmente simples:o valor de #define símbolo NUSE_SEMAPHORE_NUMBER é devolvido.
Continue para a página dois:“Estruturas de dados”>>
Integrado
- Os prós e contras da nuvem versus serviços internos
- Token Blockchain e Serviços de Gerenciamento de Dados do Microsoft Azure
- Termos e conceitos de memória digital
- Variáveis C# e tipos de dados (primitivos)
- Estruturas e classes em C ++
- Caixas de correio:introdução e serviços básicos
- Semáforos:introdução e serviços básicos
- Grupos de sinalizadores de evento:serviços de utilidade e estruturas de dados
- Grupos de sinalizadores de evento:introdução e serviços básicos
- Filas:introdução e serviços básicos