Vous êtes sur la page 1sur 15

Tutorial PICOS18

Este tutorial tem como objetivo introduzir ao leitor o uso do Sistema Operacional PICOS18. Nele utilizada a verso 3.0 deste SO. No so discutidos neste tutorial detalhes da implementao do SO, tampouco de sistema operacionais em tempo real. Peo para que os interessados em entender melhor esse sistema busquem informaes no site da do fabricante do PICOS18, em: http://www.picos18.com/. Este tutorial apresenta de forma detalhada como instalar o PICOS18 e explorar algumas das suas funcionalidades usando o PIC18F4620. Como exemplo, foi utilizado o projeto tuto.mcw disponibilizado pela prpria Pragmatec, fabricante do PICOS18.

Ferramentas necessrias:
IDE MPLAB, disponvel em: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406& dDocName=en019469&part=SW007002 MPLAB C18 COMPILER (verso acadmica), disponvel em:
https://www.microchip.com/wwwregister/default.aspx?ReturnURL=http://www.micr ochip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en01 0014

PICOS 18, disponvel em: http://www.picos18.com/index_us.htm

Primeiramente deve ser instalada o IDE MPLAB. A instalao deste ambiente de desenvolvimento bastante simples, sendo necessrio somente clicar em Avanar para que o sistema seja instalado corretamente. Em seguida deve ser instalado o compilador para os microcontroladores pic da famlia 18, o MPLAB C18 COMPILER. Neste trabalho usamos a verso acadmica deste software, sendo esta suficiente para o desenvolvimento dos exemplos aqui apresentados. A instalao desta ferramenta tambm bastante simples. O PICOS18, incluindo os arquivos fontes do kernel e alguns exemplos de aplicaes deve ser baixado do endereo http://www.picos18.com/index_us.htm em formato .zip. Neste tutorial usado o PICOS18 v.3.0 reviso B4.

Como configurar o PICos18


O arquivo .zip contendo o PICOS18 deve ser descompactado no diretrio C:\ e renomeado para PICos18, pois todos os arquivos carregados nos exemplos de projetos do MPLAB utilizam esse endereo como referncia. Segue abaixo, na Figura1, a estrutura de arquivos resultantes da descompactao do arquivo PICos18_v3_00_B4.zip.

Figura 1. Estrutura de arquivos do PICOS18 3.0. Na Tabela 1 so explicados os contedos de cada diretrio. Tabela 1. Contedos dos diretrios do PICOS18
Include Este diretrio contm todos os arquivos cabealho (.h) do kernel do PICOS18. Neste diretrio so encontrados todos os arquivos fonte (.c e .asm) do Kernel do PICOS18. Neste diretrio so encontrados todos os linkers script (.lkr). H um arquivo .lkr para cada microcontrolador suportado pelo PICOS18. Estes scripts so usados pelo MPLINK para prover a linkagem dos arquivos .c escritos pelo desenvolvedor com os arquivos de biblioteca pr-compilados

Kernel

Linker

(.o). Project/MyApp Project/Tutorial Neste diretrio apresentado um projeto simples usando o PICOS18 Este diretrio contm um projeto explorando as principais caractersticas do PICOS18. Este projeto ser explorado ao longo deste tutorial.

Caso o diretrio raiz do PICOS18 no seja renomeado para PICos18 e colocado no diretrio C:\, ao abrir um dos projetos contidos na pasta Project, por exemplo o Tutorial\tuto.mcw, ser apresentada na tela inicial do MPLAB uma mensagem informando que alguns arquivos presentes no projeto no foram encontrados, conforme ilustrado na Figura 2.

Figura 2. Tela do MPLAB informando que algum arquivo presentes no projeto no foram encontrados. Caso o usurio tente compilar o projeto sem estes arquivos ocorrer um erro de compilao, informando que algum arquivo no foi encontrado, conforme apresentado na Figura 3.

Figura 3. Erro de compilao no MPLAB devido a alguns arquivos do projeto no terem sido encontrados. Para corrigir esses erros deve-se renomear o diretrio raiz para PICos18 e coloc-lo no diretrio C:\.

A verso 3.0 do PICos18 tm um problema que impede a correta execuo dos exemplos. Mesmo que o diretrio raiz do picos esteja no lugar certo (C:\) e com o nome certo (PICos18) nenhum dos projetos exemplo disponibilizados na pasta Projects compila corretamente gerando o arquivo executvel (.hex). Este erro se deve a falta de alguns arquivos com a extenso .o os quais contm parte do PICOS18 pr compilada. Como exemplo, a compilao do projeto tuto.mcw gera o erro: Error could not find file 'PICos18iz.o', informando que o arquivo PICos18iz.o no foi encontrado. Essa mensagem exibida na Figura 4.

Figura 4. Erro de compilao devido a falta de alguns arquivos com extenso .o Para corrigir esse problema deve-se copiar os arquivos: PICos18.o, PICos18i.o e PICos18iz.o de alguma verso do PICOS18 anterior a 3.0 (nesse projeto foi usada a verso 2.10, disponvel para download na link http://www.picos18.com/index_us.htm) para o diretrio C:\PICos18\Kernel. Desta forma todos os exemplos devem funcionar corretamente. A partir de agora, temos o ambiente configurado e com todos os exemplos disponvel no PICOS18 v3.0. Iniciaremos ento o desenvolvimento de exemplos utilizando as funcionalidades deste SO. Utilizaremos o tutorial disponvel no diretrio C:\PICos18\ Tutorial\tuto.mcw no qual so exploradas grande parte das funes do PICOS18 no desenvolvimento de um relgio digital. Inicialmente apresentaremos a organizao e o contedo dos principais arquivos em um projeto com o PICOS18. Em seguida ser apresentado o mecanismo de preempo de uma tarefa por outra. Em sequncia, sero utilizados os mecanismos de sincronizao entre tarefas atravs de eventos. Aprenderemos tambm como usar interrupes e escrever rotinas de interrupo no PICos18.

Viso Geral
Antes de iniciarmos o projeto necessrio que saibamos quais so os arquivos principais de um sistema usando o PICOS18.

Como todo programa em C, necessrio que em um projeto com o PICOS18 exista uma funo principal (main). No tutorial disponibilizado pela Pragmatec essa funo est localizada no arquivo main.c. Como podemos observar na Figura 5, essa funo bastante simples, contendo basicamente a chamada a funo Init, responsvel por fazer a configurao inicial do hardware e um loop infinito com uma chamada ao sistema operacional.

Figura 5. Funo main. Na funo Init (Figura 6) est apresentada a funo Init. Nesta funo deve ser colocado o cdigo de configurao das interrupes, dos timers, dos pinos digitais de entrada e sada, dos conversores A/D, etc.

Figura 6. Funo de inicializao do hardware (Init).

Todas as caractersticas das tarefas gerenciadas pelo SO so definidas no arquivo taskdesc.c. No incio do cdigo so definidos os contadores e os alarmes. Um contador uma estrutura usada para contagem do tempo. A referncia de tempo do PICOS18 1ms, ou seja, 1ms a menor quantidade de tempo que pode ser usada como referncia para gerar eventos temporizados. Os alarmes so estruturas conectadas aos contadores capazes de enviar eventos temporizados para tarefas. Na figura 7 exibido o cdigo para a definio de um alarme. As linhas mais importantes so a 102 e a 103. Na 102 definida a tarefa que vai receber o evento, neste caso, a tarefa 0. Na linha 103 definido o evento que ser enviado para a tarefa, neste caso um evento do tipo alarme (ALARM_EVENT). Alm de gerar um evento um alarme pode fazer uma chamada a uma funo. Para isso deve-se substituir o valor 0 da linha 104 por o nome da funo a ser chamada.

Figura 7. Definio de um alarme. Um recurso um outro objeto gerenciado pelo kernel, em geral, um perifrico compartilhado por diferentes tarefas, por exemplo, uma porta de 8 bits do PIC18. Na Figura 8 apresentado um exemplo de declarao de um recurso. Um recurso tem a sua prpria prioridade (campo de prioridade) e pode ser bloqueado (campo de bloqueio) por uma tarefa (campo tarefa de prioridade). Ento, quando uma tarefa deseja conceder acesso a porto de 8 bits pode ter um acesso seguro atravs do recurso e bloquear a outras tarefas para um acesso durante um curto perodo de tempo. A gesto de recursos no ser abordada neste tutorial.

Figura 8. Definio de um recurso.

No PICOS18 cada tarefa tem sua prpria pilha de software de forma a trabalharem isoladas sem interferirem nas demais tarefas gerenciadas pelo SO. Na pilha de software onde so armazenadas as variveis locais quando a tarefa executada, mas tambm todo o contexto PIC18 (registros da pilha de hardware), quando a tarefa no executada. Alm disso, o PICOS18 tem uma deteco de estouro de pilha automtica que ocorre quando uma pilha de software torna-se maior do que o esperado (flag kernelpanic). No momento da declarao de uma tarefa deve ser declarado o tamanho da sua pilha de software. S existem trs valores possveis: 64, 128 e 256. Se voc no sabe qual o valor mais adequado para sua tarefa use 128. Na Figura 9 mostrado um trecho de cdigo para declarao de 6 tarefas e da alocao de suas respectivas pilhas. Observe que primeiro deve ser feita uma chamada a funo DeclareTask enviando como parmetro o nome da tarefa a ser declarada (linha 146 a 151 na Figura 9). Em seguida, devem ser declaradas as pilhas de cada tarefa, que consistem em um vetor de volatile unsigned char, como pode ser visto nas linhas 154 a 159.

Figura 9. Declarao de tarefas e alocao das pilhas de software. No fim do arquivo taskdesc.c ns encontramos a lista de tarefas da aplicao. A estrutura da tarefa 0 mostrada na Figura 10. Cada tarefa declarada e alocada anteriormente deve ter uma estrutura semelhante a essa.

Figura 10. Estrutura da tarefa 0. Os seis elementos que definem a estrutura de uma tarefa so (em ordem): Prioridade inicial: a prioridade da tarefa de 1 a 15. 1 a prioridade mais baixa, 15 a mais alta. A prioridade 0 reservado para o kernel e no deve ser utilizado por sua aplicao. Endereo de pilha: o endereo da pilha da tarefa (explicado anteriormente). Endereo de incio: o endereo da tarefa ao iniciar o sistema, usado pelo kernel para iniciar a tarefa pela primeira vez. Estado inicial: o estado inicial da tarefa. Em nossa aplicao READY isso significa que a tarefa ser iniciada assim que o kernel terminar de carregar-se. Esse campo pode receber os valores: SUSPENDED, READY, WAITING e RUNNING. Identificador da tarefa: valor inteiro de 1 a 15 que define univocamente uma tarefa. O tamanho da pilha: o tamanho da pilha de software. O kernel usa esse valor para verificar se uma pilha estourou e atingiu outra tarefa.

Um outro arquivo importante o int.c. Neste arquivo definido uma espcie de vetor de interrupes. Deixaremos para explicar os detalhes desse arquivo para quando formos falar de interrupes. No arquivo define.h definido: a freqncia do sistema, o preset do Timer 0, os cdigos dos eventos (que devem ser potncia de 2, ex.: 0x01, 0x02,0x04, 0x08...), os identificadores das tarefas e suas prioridades Alm dos arquivos apresentados anteriormente (main.c, taskdesc.c e int.c, define.h) para cada uma das tarefas gerenciadas pelo sistema operacional deve ser criado um arquivo com o nome tsk_taskNUM_DA_TAREFA.c, onde NUM_DA_TAREFA o nmero do identificador da tarefa (de 0 a 14).

Alarmes
Iremos agora manipular os alarmes para aprendermos como usar suas funcionalidades. Usaremos um alarme para fazer um led piscar periodicamente. O cdigo para implementar essa funcionalidade est no arquivo tsk_task0.c e exibido na Figura 11. Esta tarefa (tarefa 0) composta por duas fases, divididas pelo comando while (linha 66). Na primeira fase temos trs instrues. As duas primeiras so usadas para manipular as portas de entrada e sada digital do PIC 18. A palavra chave "TRISx" usado para configurar uma porta como entrada ou sada e a palavra chave "TRISxbits" uma estrutura que permitem modificar o estado de um bit da porta. Aqui temos o pino RB4 configurado como uma sada e o valor de sada em "0" (palavra-chave LATxbits). A funo SetRelAlarm usado para programar o alarme da tarefa. Vimos anteriormente o que um alarme: um objeto TIMER com base em um contador em software de 1ms. No arquivo "tascdesc.c" o ID do alarme 0 (ALARM_TSK0) e est ligado tarefa TASK0, conforme pde ser visualizado anteriormente na Figura 7.

Figura 11. Cdigo da tarefa 0. A funo SetRekAlarm tem trs parmetros (em ordem): Alarm ID: indice do alarme na lista de alarmes (definidos no arquivo taskdesc.c); TIMER 1: Tempo em milissegundos at o timer postar o primeiro evento; TIMER 2: Tempo em milissegundos entre dois eventos consecutivos.

Em nosso exemplo, o alarme 0 (a constante ALARM_TSK0 tem o valor 0) espera 1000 ms (1s) para postar o primeiro evento (do tipo ALARM_EVENT,

definido na declarao do alarme no arquivo taskdesc.c) e ento posta o mesmo evento periodicamente a cada 1000 ms (1s). Na segunda parte da tarefa 0, aps os pinos de E/S digital e o alarme terem sido configurados, o programa entra em um loop infinito. Neste loop feita uma chamada a funo WaitEvent que permite que a tarefa seja posta para dormir at que um evento ALARM_EVENT seja postado. Quando o evento postado feito uma limpeza na varivel que armazena o evento, inverte-se o estado do pino RB4 e faz-se uma chamada a tarefa 1, a qual ser explicada a seguir. Desta forma foi construda uma funo que controla o piscar de um LED periodicamente a cada 1 segundo.

Preempo
Iremos agora estudar a tarefa 1 para entendermos como funciona o processo de preempo do PICOS18. Lembrando que a tarefa 0 tem um alarme a ela relacionada que gera um evento com periodicidade de 1 segundo que faz com que mude o estado do pino RB4 e seja gerado um evento TASK1_EVENT. Esse evento faz com que a tarefa 1 seja executada. A tarefa 1 implementa um relgio, armazenando nas variveis do tipo unsigned char a hora, o minuto e o segundo correntes. O cdigo dessa tarefa exibido na Figura 12.

Figura 12. Cdigo fonte da tarefa 1.

No arquivo define.h (Figura 13), podemos observar que a tarefa 1 possui a maior prioridade (10) entre todas as tarefas gerenciadas pelo SO. Sendo assim, a gerao de um evento chamador da tarefa 1 (SetEvent(TASK1_ID, TASK1_EVENT);), colocar esta em execuo e preemptar a tarefa em execuo no momento da chamada.

Figura 13. Definio das prioridades das tarefas. Desta forma, a chamada da tarefa 1 pela tarefa 0 (linha 72 da Figura 11) tirar esta de estado de RUNNING e colocar em READY e colocar a tarefa 1 que estava em estado READY em RUNNING, este processo denominado preempo. Como o PICOS18 tem capacidade de tirar uma tarefa em execuo e colocar outra, considerado um SO preemptivo.

Interrupes
Aprenderemos agora a usar interrupes no PICOS18. Iremos usar os pinos RB1 e RB2 para fazer leitura de duas teclas, usadas para ajuste da hora e minuto, as quais quando pressionadas geraro interrupes as quais provero chamada de funes para o ajuste de hora e minuto. Como comentado anteriormente, a configurao das interrupes feita no arquivo int.c. O PICOS18 gerencia dois tipos de interrupes: interrupes de baixa prioridade (T_vector_low) e interrupes de alta prioridade (T_vector_high). As interrupes de baixa prioridade no so capazes de preemptar operaes realizadas pelo kernel do SO. Porm garantido que o tempo de latncia mximo, ou seja, o tempo mximo para uma interrupo ser atendida de no mximo 50s. As interrupes de alta prioridade, por sua vez, so capazes de tomar o controle do programa assim que sejam disparadas, mesmo que o kernel esteja executando alguma operao interna. Para isso utiliza alguns mecanismos de hardware para armazenar os registradores principais (como o WREG e o STATUS), e portanto no permite que no tratamento da interrupo sejam escritos cdigos complexos. De fato, a nica operao que pode ser feita o incremento e o decremento de uma varivel, nem mesmo a chamada a uma funo pode ser feita.

Em um primeiro momento o arquivo int.c pode parecer complexo, mas de fato fcil de entender. Somente duas reas precisam ser modificadas: as funes InterruptVectorL() e InterruptVectorH().Na grande maioria dos casos, as interrupes de baixa prioridade so mais adequadas, e portanto, somente essas sero apresentadas nesse tutorial. As interrupes externas INT0 (gerada pelo pino RB0), INT1 (gerada pelo pino RB1) e INT2 (gerada pelo pino RB2) so por padro de alta prioridade, e portanto, quando uma interrupo deste tipo ocorre, a execuo do cdigo corrente interrompida e a funo InterruptVectorH() executada. Para processar as interrupes dos botes conectados aos pinos RB1 e RB2, necessrio escrever um cdigo para implementar o anti-rebound, de forma que ao ser pressionado o boto no sejam geradas vrias interrupes sucessivas at que o boto estabilize no estado fechado. Esse cdigo no pode ser escrito na funo InterruptVectorH(). Ao contrrio da INT0, as interrupes INT1 e INT2 podem ser configuradas para ter baixa prioridade e quando ocorrerem fazer chamada a funo InterruptVectorL(). Para isso, os bits INT1IP e INT2IP do registrador INTCON3 devem ser alterados, conforme feito na funo Init() apresentada na Figura 6. Desta forma, ao ser gerada uma interrupo nos pinos RB1 e RB2 ser gerada uma inteeruo de baixa prioridade e a funo InterruptVectorL() ser executada. Na Figura 14 exibido o cdigo no arquivo int.c para implementar o tratamento dessas interrupes.

Figura 14. Cdigo para o tratamento de interrupes de baixa prioridade.

Na linha 89 feito um teste para verificar se a interrupo gerada devido ao estouro do TIMER 0. Caso afirmativo, feita uma chamada a funo do sistema operacional AddOneTick() a qual prove um incremento no temporizador base do SO. Na linha 92 verificado se a interrupo gerada devido a uma mudana de sinal nos pinos RB1 ou RB2. Caso afirmativo a funo MyOwnISR() chamada. A funo MyOwnISR() deve ser escrita em uma tarefa ociosa. Uma tarefa ociosa aquela que fica executando em um loop infinito sem esperar um evento pela funo WaitEvent(). Esta tarefa pode bloquear outras tarefas caso estas tenham menor prioridade. Desta forma, esta tarefa deve ter a menor prioridade da aplicao, caso contrrio, tarefas de menor prioridade nunca sero executadas. O PICOS18 permite que vrias tarefas com a mesma prioridade coexistam no mesmo programa. Para isso faz uso do algoritmo de escalonamento Round Robin. Desta forma as tarefas ociosas podem compartilhar o processamento do PICOS18, podendo cada uma executar em ma fatia do tempo de no mximo 1 ms. Depois desse perodo uma tarefa de mesma prioridade ser posta em execuo pela mesma fatia de tempo. Para implementar o ajuste da hora e minuto sero escritas duas tarefas ociosas, a tarefa 2 e a tarefa 3, respectivamente. Os cdigos dessas tarefas so apresentados respectivamente nas Figuras 15 e 16.

Figura 15. Cdigo para o ajuste da hora (tarefa 2).

Figura 15. Cdigo para o ajuste do minuto (tarefa 3).

Ambos os cdigos so bastante simples e semelhantes, e nada mais fazem do que incrementar as variveis externas hora ou minuto em uma unidade. Foi explicado at aqui como configurar os pinos RB1 e RB2 para gerar uma interrupo de baixa prioridade, como reconhecer essa interrupo no interior da funo InterruptVectorL() e qual operao fazer aps a interrupo ser gerada (tarefas 2 e 3). Porm no foi explicado como a funo InterruptVectorL() faz com que as tarefas 2 ou 3 sejam executadas. Como apresentado anteriormente ao ser reconhecida uma interrupo nos PINOS RB1 ou RB2 feita uma chamada a funo MyOwnISR(), a qual deve ser escrita em uma tarefa ociosa. No exemplo em estudo essa funo foi escrita na tarefa 2 e o seu cdigo exibido na Figura 16.

Figura 16. Funo MyOwnISR. Essa funo nada mais faz do que identificar quais dos dois pinos (RB1 ou RB2) gerou a interrupo e colocar em execuo a tarefa 2 (caso a interrupo tenha sido gerada pelo pino RB1), ou a tarefa 3 (caso a interrupo tenha sido gerada pelo pino RB2). Desta forma ao ser pressionado o boto conectado ao pino RB1 ou RB2 uma interrupo de baixa prioridade ser gerada, fazendo com que a funo InterruptVectorL() seja executada. Por sua vez essa faz uma chamada a funo MyOwnISR(), que faz com que as tarefas 2 ou 3 sejam postas em execuo caso o boto conectado ao pino RB1 ou RB2 sejam pressionados. Por sua vez, as tarefas 2 ou 3 so executadas provento o incremento na varivel externa hora ou minuto e logo em seguida postas novamente em estado suspenso.

Referncias
FISCHMEISTER, Sebastian. Real-Time Operating Systems With Example PICOS18. Frana, 2005. Disponvel em: <http://www.cis.upenn.edu/~lee/06cse480/lec-rtos.pdf> Acesso em: 1 de Jul. de 2011. PRAGMATEC. PICos18 Real time kernel for PIC18: Tutorial & Developer Guide. Frana, 2005. Disponvel em: <http://www.picos18.com/Download/PICos18_tuto_us.pdf> Acesso em: 1 de Jul. de 2011. PRAGMATEC. PICos18 Real time kernel for PIC18: Tutorial & Developer Guide. Frana, 2005. Disponvel em: <http://www.picos18.com/Download/PICOS18_API_us.pdf> Acesso em: 1 de Jul. de 2011.

Vous aimerez peut-être aussi