Toda a verdade sobre o RTOS. Artigo 12. Serviços para trabalhar com tarefas



Continuamos a revisar os serviços RTOS que fornecem informações adicionais sobre tarefas e operações com eles.

As chamadas de API adicionais associadas às tarefas incluem chamadas para obter o ID da tarefa, verificar o tamanho da pilha, redefinir a tarefa, obter informações sobre a tarefa e determinar o número de tarefas no sistema. O Nucleus RTOS e o Nucleus SE fornecem quatro chamadas principais de API para essas operações, que abordarei neste artigo.

Artigos anteriores da série:
Artigo 11. Tarefas: configuração e introdução à API
Artigo 10. Agendador: recursos avançados e preservação de contexto
Artigo 9. Agendador: implementação
Artigo 8. Núcleo SE: Projeto Interno e Implantação
Artigo # 7 Núcleo SE: Introdução
Artigo 6. Outros serviços RTOS
Artigo 5. Interação e sincronização de tarefas
Artigo 4. Tarefas, alternância de contexto e interrupções
Artigo # 3 Tarefas e planejamento
Artigo 2. RTOS: estrutura e modo em tempo real
Artigo 1. RTOS: introdução.

Obtendo o ID da tarefa atual


Essa chamada de utilitário retorna o ID da tarefa chamada. Para o Nucleus RTOS, este é um ponteiro para a unidade de controle da tarefa atual. Para o Núcleo SE, o índice (0-15) da tarefa atual.

Chamando a tarefa atual no Nucleus RTOS
Protótipo de chamada de serviço:
NU_TASK * NU_Current_Task_Pointer (VOID);

Parâmetros:
Estão ausentes.

Valor de retorno:
Ponteiro para a unidade de controle da tarefa atual;
NU_NULL - nenhuma tarefa sendo executada.

Desafiando uma tarefa em andamento no Núcleo SE
Essa chamada de API suporta a funcionalidade principal da API do Nucleus RTOS.

Protótipo de chamada de serviço:
NUSE_TASK NUSE_Task_Current (nulo);

Parâmetros:
Estão ausentes.

Valor de retorno:
Índice da tarefa atual (chamada).

Conclua uma tarefa em andamento no Nucleus SE
A implementação da chamada da API neste caso é bastante simples: o valor da variável global NUSE_Task_Active é retornado .

Verificando o tamanho da pilha disponível


Essa chamada de utilitário retorna o tamanho da pilha disponível (em bytes) para a tarefa atual. Isso é aconselhável apenas para planejadores, onde cada tarefa tem sua própria pilha; isto é Não é adequado para o agendador Run To Completion (RTC) no Nucleus SE.

Recuperando informações de volume de pilha no Nucleus RTOS
Protótipo de chamada de serviço:
NU_Task_Check_Stack NÃO ASSINADO (VOID);

Parâmetros:
Estão ausentes.

Valor de retorno:
O tamanho do tamanho da pilha disponível para a tarefa atual em bytes.

Recuperando informações de tamanho de pilha no Nucleus SE
Essa chamada de API suporta a funcionalidade principal da API do Nucleus RTOS. No entanto, o Nucleus SE requer um parâmetro formal (fictício) para facilitar a obtenção do valor do ponteiro para a pilha usada.

Protótipo de chamada de serviço:
U16 NUSE_Task_Check_Stack (manequim U8);

Parâmetros:
manequim - qualquer valor, porque na verdade não é usado.

Valor de retorno:
O tamanho do tamanho da pilha disponível para a tarefa atual em bytes.

Implementação
Para essa chamada, o código deve ser portátil:



Se o planejador RTC for usado, o valor de retorno será 0 porque não é possível (usando código portátil) determinar o espaço de pilha disponível para a tarefa.

Em outros casos, o valor do ponteiro da pilha é determinado pela localização do endereço do parâmetro dummy, que estará localizado quase no início da pilha. A rigor, esse método depende das ferramentas de desenvolvimento / compilador, mas sempre funcionará. O valor de retorno é a diferença entre esse valor e o valor original do espaço da pilha, convertido em bytes.

Redefinição de tarefa


Uma chamada de API, nesse caso, retorna a tarefa ao seu estado original não utilizado. Essa função da API difere das funções normais de redefinição da API para outros objetos do kernel, mesmo que seja uma redefinição e não apenas configurando a tarefa para seu estado inicial (para o Nucleus SE é NUSE_READY ou a entrada NUSE_Task_Initial_State [] (consulte Estruturas de dados em próximo artigo)); a tarefa é colocada em espera ( NUSE_PURE_SUSPEND ) e deve ser retomada para ser agendada novamente. Essa lógica é semelhante à funcionalidade da chamada de API correspondente no Nucleus RTOS.

Chamada de redefinição de tarefa no núcleo RTOS
Protótipo de chamada de serviço:
STATUS NU_Reset_Task (tarefa NU_TASK *, args NÃO ASSINADOS, VOID * argv);

Parâmetros:
tarefa - um ponteiro para um bloco de controle de tarefas;
argc - um elemento de dados que pode ser usado para transferir informações para a tarefa;
argv é um ponteiro que pode ser usado para passar informações para a tarefa.

Valor de retorno:
NU_SUCCESS - chamada concluída com sucesso;
NU_INVALID_TASK - ponteiro inválido para a tarefa;
NU_NOT_TERMINATED - a tarefa descrita não está em um estado de suspensão completa (finalizada) ou conclusão (finalizada); somente tarefas em um estado pausado ou concluído podem ser redefinidas.

Chamada de redefinição de tarefa no Nucleus SE
Essa chamada de API suporta a funcionalidade principal da API do Nucleus RTOS.

Protótipo de chamada de serviço:
STATUS NUSE_Task_Reset (tarefa NUSE_TASK);

Parâmetros:
task - índice (ID) da tarefa a ser redefinida.

Valor de retorno:
NUSE_SUCCESS - chamada concluída com sucesso;
NUSE_INVALID_TASK - índice de tarefa inválido.

Implementar tarefas de redefinição no Nucleus SE
O principal objetivo da função de API NUSE_Task_Reset () após verificar o parâmetro é reinicializar todas as estruturas de dados da tarefa:



Se a tarefa for bloqueada quando a API for chamada para aguardar o acesso ao objeto do kernel, a primeira coisa a fazer é configurar o contador de tarefas bloqueadas correspondentes ao objeto. Isso é feito pela instrução switch.

Em seguida, as estruturas de dados da tarefa são inicializadas (basicamente com zeros, exceto pelo bloco de contexto), chamando a função de inicialização NUSE_Init_Task () . Sua implementação será discutida em mais detalhes no próximo artigo, descrevendo a inicialização do sistema. Por fim, o status da tarefa é definido como NUSE_PURE_SUSPEND .

Obtendo informações da tarefa


Esta chamada de serviço fornece informações parciais sobre a tarefa. A implementação do Nucleus SE difere do Nucleus PLUS, no qual menos informações são retornadas, porque a nomeação de objetos, suplantando uma tarefa de menor prioridade e um intervalo de tempo, não é suportada e a prioridade não é retornada como informações redundantes.

Informações da tarefa de chamada no Nucleus RTOS
Protótipo de chamada de serviço:
STATUS NU_Task_Information (NU_TASK * tarefa, CHAR * nome, DATA_ELEMENT * task_status, UNSIGNED * número_ agendado, OPTION * prioridade, OPTION * preempt, UNSIGNED * time_slice, VOID ** stack_base, UNSIGNED * stack_size, UNSIGNED * minimum_stack;

Parâmetros:
tarefa - um ponteiro para a tarefa cuja informação é solicitada;
nome - ponteiro para uma cadeia de 8 caracteres para o nome da tarefa; inclui uma área para caracteres nulos;
task_status - ponteiro para uma variável que recebe o valor atual do status da tarefa;
schedule_count - ponteiro para uma variável que recebe o valor do contador, quantas vezes a tarefa foi adicionada ao agendador;
prioridade - um ponteiro para uma variável para obter a prioridade da tarefa;
preempt - um ponteiro para uma variável para as opções de excluir uma tarefa de menor prioridade; NU_PREEMPT indica que a tarefa pode ser ocultada e NU_NO_PREEMPT indica que a tarefa não pode ser ocultada ;
time_slice - ponteiro para uma variável para obter o valor do quantum de tempo da tarefa; um valor 0 indica que a quantização do tempo não é possível para esta tarefa;
stack_base - ponteiro para uma variável para obter o endereço da pilha de tarefas;
stack_size - ponteiro para uma variável para obter o tamanho da pilha de tarefas;
minimum_stack - um ponteiro para uma variável para obter o número mínimo de bytes restantes na pilha.

Valor de retorno:
NU_SUCCESS - chamada concluída com sucesso;
NU_INVALID_TASK - ponteiro inválido para a tarefa.

Chamar informações de tarefas no Nucleus SE
Esta chamada suporta a funcionalidade principal da API Nucleus PLUS.

Protótipo de chamada de serviço:
STATUS NUSE_Task_Information (tarefa NUSE_TASK, U8 * status_da_unidade, U16 * número_ agendado, ADDR * stack_base, U16 * stack_size);

Parâmetros:
task - índice da tarefa sobre a qual as informações são solicitadas;
task_status - um ponteiro para uma variável U8 que recebe o valor atual do status da tarefa (se o estado de espera da tarefa não estiver disponível, nada será retornado);
schedule_count - ponteiro para a variável U16 , que recebe o valor do contador do número de tarefas adicionadas ao agendador (se o contador de tarefas agendadas estiver desativado, nada será retornado);
stack_base - um ponteiro para uma variável ADDR que recebe o endereço da pilha de tarefas (se o agendador RTC for usado, nada será retornado);
stack_size é um ponteiro para uma variável U16 que obtém o tamanho da pilha de tarefas (se o agendador RTC for usado, nada será retornado).

Valor de retorno:
NUSE_SUCCESS - chamada concluída com sucesso;
NUSE_INVALID_TASK - índice de tarefa inválido;
NUSE_INVALID_POINTER - os parâmetros do ponteiro (um ou mais) estão incorretos.

Implementar recuperação de informações de tarefas no Nucleus SE
A implementação desta chamada de API é bastante simples:



A função retorna o status da tarefa, levando em consideração várias opções de configuração.

Obtendo o número de tarefas


Esta chamada de serviço retorna informações sobre o número de tarefas configuradas no aplicativo. Enquanto no Nucleus RTOS esse número pode mudar, e o valor de retorno representa o número atual de tarefas no momento, no Nucleus SE o valor de retorno é definido durante a montagem e não muda mais.

O desafio de obter o número de tarefas no Nucleus RTOS
Protótipo de chamada de serviço:
NU_Established_Tasks NÃO ASSINADAS (VOID);

Parâmetros:
Estão ausentes

Valor de retorno:
O número de tarefas instaladas (criadas e não excluídas) no aplicativo.

O desafio de obter o número de tarefas no Nucleus SE
Esta chamada de API suporta a funcionalidade principal da API Nucleus PLUS.

Protótipo de chamada de serviço:
U8 NUSE_Task_Count (nulo);

Parâmetros:
Estão ausentes

Valor de retorno:
O número de tarefas configuradas no aplicativo.

Implementação
A implementação desta chamada de API é bastante simples: o valor da diretiva #define NUSE_TASK_NUMBER é retornado .

O artigo a seguir discutirá estruturas de dados no Nucleus SE relacionadas a tarefas e algumas chamadas de API padrão não suportadas pelo Nucleus SE.

Sobre o autor: Colin Walls trabalha na indústria eletrônica há mais de trinta anos, dedicando a maior parte de seu tempo ao firmware. Ele agora é engenheiro de firmware na Mentor Embedded (uma divisão da Mentor Graphics). Colin Walls frequentemente fala em conferências e seminários, autor de vários artigos técnicos e dois livros sobre firmware. Vive no Reino Unido. Blog profissional de Colin , e-mail: colin_walls@mentor.com.

Sobre tradução: essa série de artigos parecia interessante, pois, apesar das abordagens desatualizadas descritas em alguns lugares, o autor apresenta ao leitor pouco treinado os recursos do sistema operacional em tempo real. Eu próprio pertenço à equipe de criadores do RTOS russo , que pretendemos liberar , e espero que o ciclo seja útil para desenvolvedores iniciantes.

Source: https://habr.com/ru/post/pt424713/


All Articles