Ontem o garagista Bruno publicou uma postagem simples e eficiente para resolver os problemas gerados quando o número de tarefas que um microcontrolador deve resolver começa a ficar grande. A postagem do Bruno me lembrou de algo parecido.


Um dia um amigo lá da longínqua e bela cidade de Vitória-ES, André Cafeta, me apresentou o site do Victor Behar, que traz um assunto bem bacana: “scheduler”. Nesse site é ensinado como tornar seu código para microcontroladores bem mais organizado e por que não, mais elegante.


Não satisfeito, fui atrás das origens, de onde esse cara havia tirado isso. A fonte veio do livro “Patterns for time-triggered embedded systems”. Cara, recomendo fortemente que você passe o olho nessa obra prima! Sim, trata-se de uma obra prima. A forma como o autor, Michael J. Pont, escreve é muito boa, sem contar que os exemplos são bem felizes.


A parte interessante do livro é aquela onde o autor escreve sobre o que ele chama de “scheduler”. Segundo suas próprias palavras, “scheduler” pode ser visto, a priori, como um sistema operacional simplificado, que permite chamar as tarefas periodicamente. Num nível mais baixo, “scheduler” pode ser visto como uma rotina de interrupção única vinda de um timer, que é compartilhada com todas as diferentes tarefas.


Fica aí a referencia. Adianto que não é o tipo de programa que você entende em dez minutos, mas incentivo que você seja perseverante, busque e leia o pdf que passei e entenda (e passe a usar) os conceitos nele contido. É muito bacana.


Eu adaptei o código (veja aqui) do Victor Behar, a fim de usá-lo para o arduino. Você precisará baixar a biblioteca MsTimer2. Criei três tarefas que são nada além do que escrever na serial o nome da tarefa (A, B ou C). Para a tarefa A, foi dado um delay inicial de 0 TICKs (TICK é a base de tempo definida pelo programador) e um período de 3 TICKs entre repetições sucessivas da tarefa. Para a tarefa B, delay de 1 e período de 4 TICKs , e para a tarefa C, delay de 4, período de 0.


Com esses parâmetros, é de se esperar que a cada interrupção do timer, ou seja, a cada período TICK, tenhamos uma tabela como a mostrada abaixo.



Quando descarrega-se o código na barriga do arduino, o que ele cospe pela serial é uma sequência correspondente ao previsto na nossa tabela:


-A-B---AC-C-BC-C-AC-C-C-BC-AC-C-C-C-ABC-C-C-C-AC-BC-C-C-AC-...


Divirta-se!

Exibições: 367

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Maristela Russe em 2 dezembro 2010 às 12:23
Muito interessante!
Comentário de Jefferson Moro em 30 novembro 2010 às 10:14
Igor, realmente do jeito que estava não se tinha uma ordem para o acontecimento das tarefas, mas mesmo assim elas eram atendidas no seu correto período (no intervalo de TICK destinado a tarefa). Contudo, achei bem legal a sua observação, ela me levou a corrigir o código. De uma olhada na função loop, agora o micro não faz nada após executar as tarefas e fica esperando por interrupção do timer. Obrigado.
Comentário de Igor Miranda Matias em 26 novembro 2010 às 20:42
Quando são levantados duas tasks ao mesmo tempo ele não tem um sistema de prioridade...
-A-B---AC-C-BC-C-AC-C-C-CB-AC-C-C-C-ABC-C-C-C-AC-BC-C-C-CA-
Ele executa uma hora BC e outra hora CB. O mesmo ele fez com AC e outra hora CA.
Parece que ele vai executando conforme é verificada a ocorrencia da task.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço