PicMiK - the PIC Micro Kernel
(para a plataforma PIC16F876)
O
kernel PicMik foi desenvolvido em finais de 2003 no âmbito da disciplina de Sistemas
de Tempo-Real, pelos alunos Rudolfo Andrade e André Quinta. A
motivação para o desenvolvimento do PicMik foi a de fornecer uma estrutura de
software que facilite o desenvolvimento de múltiplos comportamentos cíclicos
para pequenos robôs, como os que concorrem ao Concurso
Micro-Rato da UA. No fundo, o PicMik segue na linha do anterior RetMik,
um kernel multi-tarefa disponibilizado aos participantes do Concurso Micro-Rato
desde 1998 e destinado à plataforma Kit188.
O kernel PicMik é simples e permite gerir a execução concorrente de até 9 tarefas, activando-as aos ritmos especificados pelo utilizador. Cada tarefa está associada a uma função escrita em C, que representa o respectivo código. A execução dessa função é despoletada automaticamente pelo kernel, de forma completamente transparente para o programador. A utilização do kernel adequa-se a situações do tipo:
Pretende-se executar a função A todos os 40ms, a função B todos os 500ms, a função C todos os 90ms e a função D todos os 40ms mas sempre 10ms depois da função A
O
programador apenas tem que fornecer o código de cada função e especificar
o período e a fase com que pretende que a função seja executada.
Os
recursos do processador utilizados pelo kernel são, aproximadamente 1064Words
de código, 16 bytes no Bank0 e 80 bytes no Bank1. As respectivas funções
estão disponíveis na livraria picmik.c
O
kernel foi escrito para a
plataforma PIC16F876, inteiramente em C, utilizando o compilador da Hi-Tech.
Basicamente, este kernel permite transformar normais funções de C em tarefas
periódicas cuja activação e execução concorrente é controlada pelo próprio
kernel e completamente transparente para o utilizador.
As
tarefas não admitem preempção o que quer dizer que quando uma tarefa
inicía execução, executa até ao final, podendo apenas ser interrompida por
interrupções ao processador. A execução das tarefas é efectuada por ordem
das respectivas prioridades, que são fixas, atribuídas automaticamente
de forma decrescente, de acordo com a ordem da criação das tarefas. Para
melhores resultados sugere-se criar primeiro as tarefas com períodos menores e
por último as que tiverem períodos mais longos (escalonamento Rate-Monotonic)
As
várias tarefas podem comunicar através de variáveis globais. A resolução
temporal do kernel (tempo que demora um tick)
é um parâmetro de entrada da função de inicialização init_system(). Sugere-se
10ms.
Ao criar-se cada tarefa é necessário fornecer dois parâmetros: o respectivo período e o instante da primeira activação. O segundo parâmetro permite controlar a fase relativa de activação de tarefas com o mesmo período ou múltiplos entre si.
A
versão actual necessita da livraria Robot2.c que faz a inicialização e
atendimento da interrupção do timer1 do PIC.
Documentação
E agora?
A melhor forma de começar a utilizar o PicMiK e aderir à MiKmania é alterar o programa exemplo sample2.c, alterando as tarefas e adicionando as que forem necessárias. Força nisso! Dúvidas enviem-nas para: