[MIKROC][PIC]RTOS em microcontroladores PIC

(Livre tradução do site:http://noumanqaiser.blogspot.com.br/2014/03/rtos-in-pic-microcontrollers-devil.html)

board-electronics

Um circuito digital moderno com microcontrolador como coração. (cortesia wallpoper.com)

Microcontroladores são o coração da maioria dos dispositivos eletrônicos modernos. Varias pessoas adoram o poder de processamento e controle desses minúsculos microcontroladores. Se você está lendo esse post, posso afirmar com segurança que você é um apaixonado por microcontroladores e procura como utilizar todo o potencial dessas pequenas feras para um design real de sistemas eletrônicos.

Estou assumindo que você conhece um minimo sobre microcontroladores e sabe trabalhar com ele. Caso contrario recomendo você estudar um pouco mais sobre o assunto antes de ler o restante deste post.

Área de foco: Aplicações com processamento paralelo baseado em RTOS usando microcontroladores PIC com o RTOS OSA nos compiladores da série mikroC pro for PIC.

Porque você precisa de um RTOS?

A maioria dos programadores de microcontroladores escrevem código sequenciais para suas aplicações. O microcontrolador executa cada função chamada e dá algum retorno. Está bem razoável para pequenas aplicações pequenas para uma coisa simples. Quando usar o microcontrolador para piscar um LED e nada mais, você consegue executar sem nenhum problema sem um sistema operacional dentro do seu microcontrolador. Mas para qualquer outra aplicação que é necessário mais de uma tarefa simultânea, você está com sérios problemas.

Você pode ver como o seu computador trabalha maravilhosamente bem enquanto você está escrevendo documentos, navega na internet e ouve musica, tudo simultaneamente. Isso é possivel porque o sistema operacional executa várias tarefas simultaneamente. Todos os dispositivos eletrônicos modernos tem usado de uma forma ou outra sistemas operacionais.

Pense em um problema super simples, suponha que ao invés de piscar um LED no seu microcontrolador, você precisasse piscar 5 LEDs com diferentes frequências. Soa como um problema sem uso no mundo real e qualquer dispositivo atual pode executar essa sequencia sem problemas com um código sequencial que você venha a escrever!.

Como problemas mais práticos, geralmente, necessitam de um grande numero de tarefas sendo executadas em paralelo. Um exemplo seria que enquanto estivesse sendo realizada uma interação com o usuário, o núcleo do programa estará realizando uma tarefa de controle em paralelo.

Um RTOS(Real Time Operating System [Sistema Operacional de Tempo Real]) disponibiliza a você rodar um numero de tarefas periodicamente ou providenciar um agendamento de serviços para compartilhar o tempo de processador entre varias tarefas diferentes. Todos os processadores executam somente uma linha de código por vez.

Este tutorial irá te demonstrar como criar uma aplicação multi-tarefa utilizando um microcontrolador da linha PIC18. O compilador que será usado é o MikroC Pro for PIC versão 6.0.0, somente porque gosto muito dele, sem outra razão especifica. O sistema operacional que usaremos é o OSA. Nós iremos criar uma aplicação que servirá como um template básico para ser usado em qualquer outra aplicação.

Sobre o OSA

Tenho trabalhado com diferentes RTOSes até agora, e nunca encontrei um que realmente tenha um tamanho ultra-reduzido e uma grande eficiência que possa ser portado para microcontroladores com baixíssima memoria de programa. Um microcontrolador PIC18F452 tem geralmente em torno de 1.5KB de RAM. Você nunca oide usar toda a memoria para criar agendamento de tarefas.

OSA é um RTOS cooperativo e não-preemptivo para dispositivos com baixa memoria o pode ser portado para a maioria dos microcontroladores mais populares e geralmente tem suporte para os compiladores mais famosos incluindo MPLAB, CCS PICC, AVR studio e MikroC Pro. Uma grande quantidade de bibliotecas de funções são providas pelo kernel[núcleo] do SO[Sistema Operacional]. A estrutura de programa é muito similar ao que você tem trabalhado até então. Consumindo somente 60 bytes da memoria RAM, o OSA é a escolha ideal para aplicações baseadas em microcontroladores.

Alguns termos que usaremos a partir de agora:

Chaveamento de contexto: Pausando a tarefa e atendendo outra tarefa, e o SO ira voltar a essa tarefa posteriormente.

Tarefa[Task]: Uma parte do código que o SO irá executar. Tarefa é uma função pode ser chamada repetidamente.

Thread: Este pode ser intercambiavel com um tarefa, porem neste tutorial essa função nunca terá fim(tem um loop while(1) loop dentro) e roda em paralelo com outros threads.

Limitações:

Ser não-preemptivo é uma desvantagem, se no seu programa tiver um grande loop dentro de uma tarefa de baixa prioridade, o agendador de tarefas não podera prever ou forçar o chaveamento de contexto. Chaveamento de contexto é utilizado em todos os RTOSes cooperativos. Esse não será o maior problema a você pode contornar essa dificuldade com uma programação inteligente. Isso é para a criação de programas baseados em RTOS para microcontroladores, diferente de sistemas operacionais complexos como o windows, esse é otimo para pequenos computadores como o PIC.

Criando seu primeiro programa multi-tarefas

O plano é solucionar um simples problema, criaremos um programa que ira piscar 4 LEDs com frequências muito diferentes, todos simultaneamente. Executaremos 4 execuções simultâneas. Você usará a função main no seu programa com um loop infinito para a execução do programa. Iremos escrever um código com 4 funções que aparentemente irão ser executadas em paralelo pe dará a sensação que você terá 4 funções principais no seu programa. Quando você ver os 4 leds piscando em paralelo, você verá que é mais simples do que imaginava.

Downloads

Para começarmos a escrever nossa primeira aplicação, precisamos dos seguintes arquivos:

MikroC Pro for PIC, preferencialmente registrado para não receber mensagens de limite de demonstração.

Página do MikroC Pro  Download do MikroC Pro Ver.6.0.0

Utilitário de Timer: Faz sua vida mais fácil sem precisar de um monte de cálculos.

Calculadora do Timer para MikroC  Download

O Configurador e o código-fonte do OSA

Site ocficial OSA  Download código-fonte OSA  Gerador de arquivo de configuração OSA

Seria o ideal se você tiver o Proteus ou o hardware para testar o funcionamento do seu projeto.

Seria interessante você navegar no site do OSA e estudar sua documentação.

Primeiro passo:

  1. Crie uma nova pasta e extraia o arquivo .zip do OSA.
  2. Execute o MikroC Pro e crie um novo projeto.
  3. Selecione a mesma pasta que você extraiu o OSA. OSA trabalha com a maioria do microcontroladores mas eu prefiro o 18F452, ele tem memoria suficiente para nosso trabalho. Usar um cristal entre 8 e 12MHz.

Porque eu escolhi um cristal de baixa frequência, depois de muito planejar não terei a menor misericórdia dessa criaturinha. Você está certo, sem misericórdia hoje, usaremos um cristal de 12MHz e habilitaremos o PLL para usar nosso microcontrolador em 48MHz!!!, isso é outro nome para tortura, mas isso é necessário para um tempo ultra pequeno para a troca de contexto e uma performance suprema.

Agora iremos adicionar os arquivos do sistema operacional ao nosso projeto.Clique “Add” e selecione os arquivos osa.h e osa.c.

Clique em “Next” e inclua todas as bibliotecas, então abra a configuração para o projeto e selecione o oscilador HS com PLL habilitado.

Agora, voltaremos a escrever o código. Salve o projeto. Abra o arquivo OSAcfg_Tool.exe selecione as seguintes opções. Coloque as tasks oara 4 porque iremos ter 4 threads em nossa aplicação, selecione as configurações como mostrado, clique em “Save” e salve o arquivo de configuração na pasta do seu projeto.

O arquivo salvo OSAcfg.h necessita ser adicionado ao projeto. No MikroC, com seu projeto aberto, vá até “Project Menu” e adicione o arquivo OSAcfg.h ao seu projeto

Configurando o Timer:

Não iremos discutir porque um programa RTOS precisa de um timer. Todos os RTOS precisam de a noção do tempo real. Então a todo o momento o Kernel precisa saber o tempo e baseado nisso gera a informação para gerar delays precisos, e o agendamento das chamadas de função. De forma objetiva, você não pode ter uma rotina diária sem a noção do tempo. Sabemos que os timers dentro do PIC contam tempo. Mas o clock do nosso sistema operacional roda muito mais devagar que o timer. Então iremos incrementar o clock do sistema operacional a cada overflow do timer.

Estou considerando um passo a cada 1ms. De qualquer forma, minha aplicação não conseguira medir tempos menores 1ms, você não deveria chamar delays menores que 1ms, estará ok se a thread necessitar de tempos menores que 1ms. Selecionando um longo período para o clock o maior beneficio é que seu controlador de tempo de serviço, terá mais tempo para executar as tarefas destinadas a ele.

Sim, esqueça os prescalers, registros de configuração e outras coisas estudadas em classe, Não gosto de quando programas te fazem lembar dessas coisas. Execute o timer calculator. Ele sabe tudo o que você esqueceu :).

O utilitário de geração de timer gera configurações precisas. Ele gera a função InitTimer0 que deve ser chamada na inicialização do programa para a configuração do timer. Copie todas as funções para o seu projeto.

Na sua função main, insira uma chamada a função InitTimer0. No inicio do projeto, inclua os headers do OS usando a diretiva #include . Para gerar o incremento de clock a cada estouro do timer, insira a chamada da função OS_Timer() no rotina de tratamento de interrupção. Então seu código deve ter o visual deste agora:

Agra precisaremos adicionar as Threads e executar o agendador para um programa completo. Para definir uma task que será chamada pelo agendador é desfinida como a seguir:

Você deve estar começando a entender a importancia das funções OS_Yeild e OS_Delay(). Em um programa RTOS, OS_Delay é para uma contagem eficiente dos delays usados antes. Delay_ms é um caminho extremamente ineficiente para para contar o tempo no seu programa. Quando chamada a função OS_Delay, enquanto conta o tempo seu programa pode atender outras threads. O beneficio é otimizar sua aplicação em RTOS. Mas lembre-se, Uma thread em um programa RTOS nunca devem chamar Yields ou chamar delays para habilitar outras threads a qualquer momento do processador. Então sempre use a chamada OS_Yeild dentro da threada para que seja possivel executar todas as outras threads. O agendador decidirá a prioridade de cada thread, quem pega e qual a porcentagem do tempo total do processador a ser utilizada.

Geralmente desenvolvedores de RTOS encarajam a utilização de variaveis globais. Particularmente durante a troca de contexto, as variaveis locais serão conservadas na memoria. então como todas as threads rodam em paralelo, todas as variaveis locais existiram ao mesmo tempo na memoria. Então ter variaveis locais é um grande beneficio. Mas em alguns casos quando é necessária a otimização do seu código, lembre-se de usar o identificador ‘static’ com a declaração da sua variavel local.

Pelo menos uma thread deve ser definida, você pode definir qualquer numero de threads provendo a informação ao OS enquanto está criando o arquivo de configuração.

O ultimo passo é criar as threads e chamar o agendados na função main.

Então é isso!!, agora é só preencher as tasks respectivas  com o codigo do seu gosto e terá o OSA rodando 4 tarefas em paralelo em seu programa. OSA ié poderoso e bem desenvolvido sistema operacional. De qualquer forma  você deveria explorar todos os serviços na documentação.

O exemplo completo esta disponivel para download no link a seguir, incluindo o arquivo de simulação do proteus. O arquivo compactado tem o utilitário de timer o configurador OSA e a sua documentação.

Download do pacote completo


Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[MIKROC][PIC] RTOS em microcontroladores PIC
Tags:                                 

Deixe uma resposta

%d blogueiros gostam disto: