Introdução ao NXP MQX RTOS

Escalonador no MQX RTOS tarefas
Este post faz parte da série NXP MQX RTOS. Leia também os outros posts da série:

Olá caros leitores, neste artigo eu (Evandro Teixeira) e Eder Tadeu iniciaremos uma série sobre o RTOS (Real Time Operating System – Sistema Operacional de Tempo Real) da NXP, o MQX RTOS. Além desta proposta, também sugerir mais uma opção de RTOS que as grandes companhias oferecem e também “pegar carona” na série sobre o mesmo tema que o Rodrigo Almeida abordou.

MQX RTOS

O MQX é um Sistema Operacional de Tempo Real (RTOS) que inclui um Kernel multi-tarefa, ou seja, é um software que gerencia recursos de hardware e tarefas (funções como em sistemas baremetal) a fim de garantir as respectivas execuções dentro do tempo estimados e também respeitando as prioridades (pre-empetive scheduling – um escalonador de tarefas para serem executadas já com as prioridades pré-definidas). Além disso, garante um tempo de resposta muito rápido para interrupções.

Seu pequeno e configurável tamanho conserva o espaço de memória para aplicação embarcadas e pode ser configurado com poucos 6KB de memória ROM, incluindo o Kernel, interrupções, semáforos (semaphores), listas (queues) e o gerenciador de memória.

O MQX tem suporte integrado a pilhas de protocolo TCP/IP stack (RTCS), MS-DOS File System (MFS), USB host/device stack e suporte também a múltiplos núcleos de processamento (multicore).

A seguir temos uma visão geral de MQX RTOS (figura 1) em uma aplicação. 

Visão geral de MQX RTOS
Figura 1 – Visão geral de MQX RTOS

Termos encontrados no MQX

Tanto no MQX RTOS quanto em qualquer outro RTOS, levando em conta suas particularidades, mas de forma geral, encontramos os seguintes termos recorrentes:

  • Task: uma task em RTOS pode ser entendida como pequeno programa independente que executa seu próprio contexto sem nenhuma dependência de outra task dentro sistema. É responsabilidade do escalonador (scheduling RTOS) assegurar o contexto do processador (valores de registradores, conteúdo da pilha, etc) quando há uma permuta entre tasks, ou seja, quando uma deixa de ser ativa para dar lugar a outra (em Round-Robin seria uma task de alta prioridade estar como “ready” enquanto a que está em “running” ter prioridade menor). Assim, todo momento em que a task for executada novamente, seu contexto sempre será restaurado e salvo quando uma task der lugar a outra;
  • Task Management (Gestão de Tarefas): é um componente do núcleo do MQX e cria automaticamente tasks quando o MQX RTOS inicia. Uma aplicação pode também criar, gerenciar e finalizar outras tasks. Também pode criar mulíiplas instâncias da mesma task e não há limite do total de número de tasks na aplicação. Qualquer aplicação também pode dinamicamente mudar os atributos de qualquer task. O MQX RTOS libera recursos quando ele termina uma task;
  • Scheduling (Escalonador): o Scheduling ou Escalonador é um algoritmo responsável por escolher qual a próxima task será executada. É complacente ao POSIX.4 e fornece como opções de funcionamento: FIFO Scheduling (baseado em prioridades e a task ativa permanece em funcionamento enquanto outra com maior prioridade ainda não estiver ativa), Round Robin (parecido com o modelo anterior e também baseado em prioridade, mas possui um tempo de execução chamado de “time slice” que não pode ser estrapolado) e Explicit (usando listas de tasks – tasks queues). Para detalhes de cada tipo, sugere-se que seja lido o Manual do Usuário MQX RTOS;
  • Gerenciando memória com alocadores de memória dinâmica: para alocar e liberar pedaços de tamanhos variáveis (chamados de blocos de memória), o MQX RTOS fornece um serviço de núcleo que é similar às funções “malloc()” e “free()” que a maioria das bibliotecas de tempo de execução fornecem. É possível escolher uma das três opções possíveis de implementação de alocação dinâmica: LWMEM, MEM ou TLSF;
  • Eventos (Events): Eventos são componentes opcionais do MQX,  eles suportam o gerenciamento dinâmico de objetos que são formatados como campos de bits. Tasks e ISR (Interrupt Service Routine – Rotina de Serviço de Interrupção) pode usar eventos para sincronizar e transmitir simples informações na forma de mudança de estados dos bits. Existem os grupos de eventos rápidos e os nomeados. Esses grupos podem se auto “resetar” o bit de evento, além disso o MQX automaticamente “reseta” os bits após a criação;
  • Semáforos (Semaphores): Semáforos são componentes opcionais. Pode-se usá-los para sincronizar as tasks, ou seja, se algum recurso da aplicação estiver sendo usado (lido ou escrito como uma memória Flash, por exemplo), o semáforo permite que uma task faça o uso enquanto outra aguarda, ou que esse recurso seja restrito ou não restrito, assim implementando um mecanismo de sinalização produtor/consumidor;
  • Mensagens (Messages): Mensagens são componentes opcionais. Tasks podem comunicar com outras enviando mensagens para queue (fila) de mensagens (message queues). Cada task abre sua própria queue de mensagem de entrada (input-message queue). Uma mensagem é unicamente identificada pela sua ID da queue que o MQX atribui quando a própria queue é criada. Qualquer task pode enviar uma mensagem para a queue quando ela estiver aberta, desde que a task saiba o ID da queue.

Versões do MQX

A NXP elaborou algumas versões do MQX RTOS para os microcontroladores e processadores de seu portifólio, assim, a seguir faremos um breve resumo das respectivas características que cada família possui, veja:

  • MQX RTOS

Visão macro do MQX RTOS.
Figura 2 – Visão macro do MQX RTOS.

É uma versão completa e funcional do MQX RTOS. Suporta as principais famílias (Kinetis, Vybrid, ColdFirei.MX e Power Architecture). Ocupa em torno de 6KB de memoria ROM e 2,5KB de memória RAM, Além disso, seus drives são compatíveis com o padrão POSIX.

  • MQX Lite RTOS

Visão macro do MQX Lite RTOS.
Figura 3 – Visão macro do MQX Lite RTOS.

NXP MQX™ Lite RTOS é o mais simples MQX RTOS dedicado para microcontroladores com recursos limitados. Inicialmente desenvolvido para a família Kinetis série L. O NXP MQX Lite RTOS esta disponível como componente do Processor Expert e é facilmente configurável.

  • MQX RTOS for Kinetis SDK

MQX RTOS para Kinetis SDK. 
Figura 4 – MQX RTOS para Kinetis SDK.

É uma versão dedicada à família de microcontroladores Kinetis. Também é uma versão completa do MQX RTOS integrada ao Kinetis Software Development Kit (KSDK).

Microcontroladores suportados

A seguir uma lista de microcontroladores e processadores que podem embutir o MQX RTOS em suas aplicações:

Tabela 1 – MCUs e MPUs suportados pelo MQX.

MCU/MPUDESCRIÇÃOMQXMQX for KSDKMQX Lite
MCUKinetis K1x – microcontroladores de linha base (MCUs)X X
MCU Kinetis K2x – microcontroladores com suporte USB (MCUs)X X
MCU Kinetis K3x – microcontroladores com suporte LCD (MCUs)X X
MCU Kinetis K4x – microcontroladores com suporte USB  e LCD (MCUs)X X
MCU Kinetis K5x – microcontrolador de medição (MCUs)X X
MCUKinetis K6x –  microcontroladores de criptografía e Ethernet (MCUs)X X
MCU Kinetis K7x – microcontroladores de LCD gráfico (MCUs)X X
MCU Kinetis série L – microcontroladores de linha base de baixissimo consumo de energia.X X
MPUVFxxx série F – microprocessadores (MPUs) baseados nos núcleos  ARM® Cortex®-A5 e M4X  
MPU i.MX série 6 – multi-núcleo (multicore), núcleo ARM® Cortex®-A9 e ARM Cortex-M4X  
MCUColdFire+ (famílias Jx e Qx) – microcontroladores X  
MCU/MPUColdFire® V1 (MCU), V2 (MCU) e V2 (MPU)X  
MPUColdFire® V3 e V4X  
MCUKinetis K22_100 – microcontroladores Kinetis K22 de baixo consumo de energia, 100 MHz, suporte USB (MCUs). X 
MCUKinetis K22_120 – microcontroladores Kinetis K22 de baixo consumo de energia, 120 MHz, alta performance, suporte USB (MCUs). X 
MCUKinetis K24_120 – microcontroladores Kinetis K24 e baixo consumo de energia, 256 KB de SRAM, 120 MHz, alta performance, suporte USB, (MCUs). X 
MCUKinetis K60_100 – microcontroladores Kinetis K60, 100 MHz, suporte Ethernet e USB, com integração analógica (MCUs). X 
MCUKinetis K63_120 – microcontroladores Kinetis K63, 120 MHz, suporte Ethernet e USB, criptografia, 256 KB de SRAM, Detecção de adulteração (MCUs). X 
MCUKinetis K64_120 – microcontroladores Kinetis K64, 120 MHz, suporte Ethernet e USB, 256 KB de SRAM (MCUs). X 
MCUKinetis KL4x – microcontroladores Kinetis KL4x de baixíssimo consumo de energia, 48 MHz, suporte USB e LCD (MCUs). X 
MCUKinetis KV1x – microcontroladores Kinetis KV1x, 75 MHz, suporte motores BLDC e PMSM (MCUs). X 
MCUKinetis KV3x – microcontroladores Kinetis KV3x, 100/120 MHz, suporte motores BLDC e PMSM, DSP, FPU, alta performance (MCUs). X 

Criando projeto com MQX RTOS para Kinetis SDK 

Para aderir o MQX em um projeto, faremos o uso do Kinetis Design Studio e também do KSDK Project Generator, mas a princípio utilizaremos o último, assim proceda da seguinte forma:

1) Procure pela opção “Advanced” e configure conforme a figura 5;

Configurando o KSDK Project Generator.
Figura 5 – Configurando o KSDK Project Generator.

2) Feito o primeiro passo, abra o Kinetis Design Studio e importe o projeto feito no passo anterior.

3) Clique em “File” e depois em “Import”. Nesta última procure por “General” e selecione a opção “Existing Project into Workspace”, em seguida, clique em “Next”.

4) Clique em “Browse” e selecione o diretório do projeto gerado pelo KSDK Project Generator, em seguida, clique em “Finish”.

Observe que além do projeto criado, também são importados os projetos do MQX RTOS e KSDK (ksdk_mqx_libMK22FN512VLH12, mqx_frdm_k22f_MK22FN512VLH12, mqx_frdmk22f, mqx_stdlib_frdmk22f, nshell_frdmk22f). Assim, compile todos os projetos.

Visão do KDS com todos os projetos
Figura 6 – Visão do KDS com todos os projetos

Feito isto, vamos estudar um pouquinho o projeto criado. Assim: abra o diretório “Sources”, ele contém dois arquivos (main.c e main.h). O arquivo main.h possui os include’s dos arquivos do MQX RTOS e KSDK, já o arquivo main.c contém duas tarefas (main_task e task_example) além dos “templates” das tarefas.

A tarefa main_task é inicializada pelo próprio MQX RTOS e inicializa os periféricos do hardware, a UART para auxiliar no Debug e criar a tarefa task_example.

A tarefa task_example possui apenas a estrutura básica, imprime uma mensagem para Debug e a tarefa entra em loop infinito.

Código fonte main.c

Código fonte main.h

Conclusão

O MQX RTOS é uma ótima opção para utilizar em sua aplicação em conjunto com os microcontroladores da NXP, contém um número grande de API’s que auxilia no desenvolvimento do seu projeto. No próximo artigo iremos explorar as API’s para trabalhar com as tarefas.

Referências

MQX™ Software Solutions

MQX™ RTOS for Kinetis SDK v1.3

MQX™ Lite Real-Time Operating System (RTOS)

MQX Lite ™ RTOS – Reference Manual

Fonte das Imagens: NXP MQX™ RTOS

Outros artigos da série

Tarefas no MQX RTOS >>
Veja + conteúdo

Desenvolvedor de Sistemas Embarcados.
Sou formado Técnico em Instrumentação e Automação Industrial/Mecatrônica pelo Colégio Salesiano Dom Bosco de Americana-SP, cursei o Engenharia Elétrica com Ênfase em Eletrônica pela UNISAL Centro Universitário Salesiano de São Paulo e atualmente estou cursando Superior de Tecnologia em Análise e Desenvolvimento de Sistemas pela UNIP Universidade Paulista.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
tryedge
tryedge
13/01/2016 09:35

Muito bom conhecer mais sobre o MQX! Ótimo artigo!

Talvez você goste:

Séries



Outros da Série

Menu