Toda a verdade sobre o RTOS. Artigo 11. Tarefas: configuração e introdução à API



O conceito de um problema foi introduzido em artigos anteriores. De fato, uma tarefa é simplesmente um conjunto de valores que podem ser carregados nos registros do processador (para que a tarefa seja executada) ou podem ser armazenados em um estado pronto para alternar contextualmente para a tarefa no futuro. Na maioria das vezes, uma tarefa tem sua própria pilha.

Obviamente, ao usar o agendador RTC (Run to Completion), a alternância de contexto não é usada e a tarefa pode ser considerada simplesmente o valor do contador de programa (ponto de entrada de código).

A definição da tarefa não inclui o próprio código. A tarefa deve executar o código, mas não pertence a ele. Tarefas podem ter funções comuns. Além disso, todo o código para várias tarefas pode ser compartilhado. Código geral quase sempre deve ser escrito de acordo com os requisitos de reentrada. A maioria dos compiladores pode lidar facilmente com esse código, mas é necessário ter cuidado com as funções da biblioteca, pois elas podem não ser adequadas para aplicativos multitarefa.

Essa definição determina determinadas regras que devem ser seguidas ao desenvolver estruturas de dados de tarefas e funções de API descritas neste artigo. Analisarei a configuração das tarefas no Nucleus SE e começarei uma visão geral detalhada das chamadas de serviço (chamadas de API) que se aplicam às tarefas no Nucleus SE e no Nucleus RTOS.

Artigos anteriores da série:
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.

Configuração de tarefas


Número de tarefas


No Nucleus SE, a configuração da tarefa é direcionada principalmente pelas diretivas #define em nuse_config.h . O parâmetro-chave NUSE_TASK_NUMBER determina o número de tarefas que podem ser configuradas no aplicativo. O valor padrão é 1 (ou seja, uma tarefa durante a execução) e o valor máximo do parâmetro é 16. Um valor incorreto levará a um erro de compilação, que será gerado ao verificar nuse_config_chech.h (incluído em nuse_config.c , o que significa compilado com este módulo), a diretiva #error será acionada . Este parâmetro é usado para determinar as estruturas de dados; seu tamanho depende do seu valor.

No Nucleus SE, exceto ao usar o agendador RTC, é essencial que pelo menos uma tarefa esteja sempre pronta para execução. Ao usar o agendador de prioridade, você precisa garantir que a tarefa com a prioridade mais baixa nunca fique em um estado suspenso; essa tarefa deve ser considerada uma "tarefa em segundo plano".

Diferentemente de outros núcleos em tempo real, o Nucleus SE não usa "tarefas do sistema", o que significa que todas as 16 tarefas estão disponíveis para o código do aplicativo do usuário ou o Middleware.

Parâmetros da API


Cada função da API (chamada de utilitário) no Nucleus SE é ativada pela diretiva #define em nuse_config.h . Para tarefas, esses parâmetros são:

  • NUSE_TASK_SUSPEND
  • NUSE_TASK_RESUME
  • NUSE_TASK_SLEEP
  • NUSE_TASK_RELINQUISH
  • NUSE_TASK_CURRENT
  • NUSE_TASK_CHECK_STACK
  • NUSE_TASK_RESET
  • NUSE_TASK_INFORMATION
  • NUSE_TASK_COUNT

Por padrão, todos os parâmetros acima são definidos como FALSE , desativando todas as chamadas de serviço e impedindo a inclusão de qualquer código que os implemente. Para configurar tarefas para o aplicativo, você precisa selecionar as chamadas de API necessárias e definir os caracteres correspondentes como TRUE .

A seguir, é um trecho do arquivo nuse_config.h padrão.



Se o seu código usar uma chamada de API que não foi ativada, um erro será exibido durante a vinculação porque o código de implementação não foi incluído no aplicativo.

Parâmetros funcionais


O Nucleus SE pode adicionar algumas funcionalidades de tarefa. E, novamente, os parâmetros necessários estão no arquivo nuse_config.h :

NUSE_SUSPEND_ENABLE permite pausar tarefas. Se esta opção não estiver selecionada, todas as tarefas aguardam constantemente o agendamento. A ativação deste parâmetro é necessária ao usar o planejador de prioridade.

NUSE_BLOCKING_ENABLE permite suspender tarefas para várias chamadas de API de função. Se esta opção estiver ativada, NUSE_SUSPEND_ENABLE também deverá ser ativado.

NUSE_INITIAL_TASK_STATE_SUPPORT permite definir o estado inicial da tarefa. Se essa opção não estiver selecionada, todas as tarefas serão adicionadas ao agendador imediatamente após a criação.

Chamadas de tarefas do utilitário


O Nucleus RTOS suporta 16 chamadas de serviço (APIs) para trabalhar com tarefas que fornecem a seguinte funcionalidade:

Descrição funcionalNúcleo RTOSNúcleo SE
Pausar uma tarefaNU_Suspend_Task ()NUSE_Task_Suspend ()
Retomar tarefaNU_Resume_Task ()NUSE_Task_Resume ()
Pausar uma tarefa para um específico
o período
NU_Sleep ()NUSE_Task_Sleep ()
Liberação de controle da CPUNU_Relinquish ()NUSE_Task_Relinquish ()
Obtendo o ID da tarefa atualNU_Current_Task_Pointer ()NUSE_Task_Current ()
Verificando o tamanho da pilha disponívelNU_Check_Stack ()NUSE_Task_Check_Stack ()
Retornar tarefa para não utilizado
estado (redefinição)
NU_Reset_Task ()NUSE_Task_Reset ()
Fornecendo informações sobre uma tarefa específicaNU_Task_Information ()NUSE_Task_Information ()
Como configurar o contador
tarefas (no momento) no aplicativo
NU_Established_Tasks ()NUSE_Task_Count ()
Adicionando uma nova tarefa ao aplicativo (criação)NU_Create_Task ()Não implementado.
Removendo uma Tarefa do AplicativoNU_Delete_Task ()Não implementado.
Retornar ponteiros para todas as tarefas
no aplicativo
NU_Task_Pointers ()Não implementado.
Alterar algoritmo de extrusãoNU_Change_Preemption ()Não implementado.
Alterar prioridade da tarefaNU_Change_Priority ()Não implementado.
Alterar o quantum de tempo de uma tarefaNU_Change_Time_Slice ()Não implementado.
Conclusão da tarefaNU_Terminate_Task ()Não implementado.

A implementação de cada uma das chamadas de serviço acima é discutida em detalhes abaixo, bem como nos seguintes artigos sobre RTOS.

Serviços de gerenciamento de tarefas


Operações básicas com tarefas: pausar uma tarefa por tempo indeterminado, retomar, pausar uma tarefa por um tempo específico, liberar o processador. O Nucleus RTOS e o Nucleus SE fornecem quatro chamadas básicas de API para executar essas operações, que descreverei abaixo.

Pausar uma tarefa


O Nucleus PLUS fornece uma chamada de API simples que permite pausar uma tarefa específica indefinidamente. O Núcleo SE possui uma chamada de escritório com funcionalidade semelhante.

Suspender uma tarefa no Nucleus RTOS
Protótipo de chamada de serviço:
STATUS NU_Suspend_Task (tarefa NU_TASK *);

Parâmetros:
task - um ponteiro para a unidade de controle da tarefa em pausa (que pode ser atual e seu ID pode ser obtido usando NU_Current_Task_Pointer () , mais no próximo artigo).

Valor de retorno:
NU_SUCCESS - a chamada foi concluída com sucesso;
NU_INVALID_TASK - ponteiro inválido para a tarefa;
NU_INVALID_SUSPEND - A tarefa especificada tem o status NU_FINISHED ou NU_TERMINATED .

Pausa da tarefa de desafio no Nucleus SE
Esta chamada de API suporta a funcionalidade principal da API Nucleus PLUS.

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

Parâmetros:
task - o índice (ID) da tarefa em pausa (que pode ser atual e seu ID pode ser obtido usando NUSE_Task_Current () - mais no próximo artigo).

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

Implementar a suspensão de uma tarefa no Nucleus SE
A principal funcionalidade da função API é bastante simples:



De fato, nesta implementação, a função do agendador NUSE_Suspend_Task () é chamada com o parâmetro "parada incondicional" ( NUSE_PURE_SUSPEND ). Esta função chama o agendador se a tarefa pausada estiver em andamento.

Retomar tarefa


O Nucleus RTOS fornece uma chamada de API simples que permite retomar uma tarefa que foi pausada anteriormente indefinidamente. O Núcleo SE possui uma chamada de escritório com funcionalidade semelhante.

Tarefa de resumo do desafio no Nucleus RTOS
Protótipo de chamada de serviço:
STATUS NU_Resume_Task (tarefa NU_TASK *);

Parâmetros:
tarefa - um ponteiro para a unidade de controle da tarefa renovada.

Valor de retorno:
NUSE_SUCCESS - a chamada foi concluída com sucesso;
NUSE_INVALID_TASK - ponteiro inválido para a tarefa;
NUSE_INVALID_RESUME - A tarefa não foi suspensa incondicionalmente.

Desafio retomar tarefas 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_Resume (tarefa NUSE_TASK);

Parâmetros:
task - índice (ID) da tarefa renovada.

Valor de retorno:
NUSE_SUCCESS - a chamada foi concluída com sucesso;
NUSE_INVALID_TASK - índice de tarefa inválido;
NUSE_INVALID_RESUME - A tarefa não foi suspensa incondicionalmente.

Implementando retomar tarefas no Nucleus SE
A principal funcionalidade da função API é bastante simples:



De fato, a função do agendador NUSE_Wake_Task () é chamada nesta implementação. Essa função chama o agendador se o agendador de prioridade for usado e a tarefa renovada tiver uma prioridade mais alta que a tarefa atual.

Pausando uma tarefa por um período específico


O Nucleus RTOS fornece uma chamada de API simples para pausar a tarefa atual por um período específico de tempo. O Núcleo SE possui uma chamada de escritório com funcionalidade semelhante.

Tarefas de suspensão de chamada por um período específico de tempo Nucleus RTOS
Protótipo de chamada de serviço:
VOID NU_Sleep (carrapatos NÃO ASSINADOS);

Parâmetros:
ticks - período de tempo em que a tarefa deve ser suspensa (em tempo real).

Valor de retorno:
Não.

Desafie uma pausa de tarefa por um período específico Nucleus SE
Essa chamada de API suporta a funcionalidade principal da API do Nucleus RTOS.

Protótipo de chamada de serviço:
NUSE_Task_Sleep nulo (ticks U16);

Parâmetros:
ticks - período de tempo em que a tarefa deve ser suspensa (em tempo real).

Valor de retorno:
Não.

Implementando uma suspensão de tarefas por um período específico no Nucleus SE
A principal funcionalidade da função API é bastante simples:



Este código carrega o valor do atraso no parâmetro de tarefa atual em NUSE_Task_Timeout_Counter [] . Depois disso, a tarefa é pausada usando NUSE_Suspend_Task () com o período de suspensão ( NUSE_SLEEP_SUSPEND ).

O valor do tempo limite é usado pelo manipulador de interrupção do relógio em tempo real. O código é mostrado abaixo e será discutido em mais detalhes em um artigo futuro.



Liberação de CPU


O Nucleus PLUS fornece uma chamada de API simples para permitir a transferência do controle do processador para qualquer uma das tarefas prontas para execução com a mesma prioridade, com base no algoritmo Round Robin. O Núcleo SE possui uma chamada de escritório com funcionalidade muito semelhante. No entanto, ele não pode ser usado com o Priority Scheduler, pois várias tarefas com a mesma prioridade não são suportadas. Tentar usar essa chamada de API com o agendador de prioridade resultará em um erro. Uma chamada de utilitário funciona com os agendadores Round Robin e Time Slice; com o agendador Executar até a conclusão, essa chamada de API é ineficiente.

Chamada de liberação do processador RTOS do núcleo
Esta chamada de API suporta a funcionalidade principal da API Nucleus PLUS.

Protótipo de chamada de serviço:
VOID NU_Relinquish (VOID);

Parâmetros:
Estão ausentes.

Valor de retorno:
Não.

Chamada de liberação do processador Nucleus SE
Esta chamada de API suporta a funcionalidade principal da API Nucleus PLUS.

Protótipo de chamada de serviço:
vazio NUSE_Task_Relinquish (vazio);

Parâmetros:
Estão ausentes.

Valor de retorno:
Não.

Implementação da versão do processador Nucleus SE
A principal funcionalidade da função API:



Essencialmente, essa implementação chama a função de agendador NUSE_Reschedule () . Essa função simplesmente informa ao agendador para concluir a próxima tarefa.

Os próximos dois artigos continuarão analisando as chamadas de utilitários RTOS relacionados à tarefa usando os exemplos Nucleus RTOS e 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 em um idioma muito compreensível 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/pt424481/


All Articles