vou só aproveitar um pouco para perguntar uma cena.
Njay tive uma idea e gostava da tua opinião.
Para fazer tipo 2-3 programas a correr em paralelo poderia fazer isto?
Criar um interrupt periódico com um timer de 1 em 1 ms.
Programa1 começa.
Interrupt é chamado - salta para Programa2.
Interrupt é chamado - salta para Programa3.
Interrupt é chamado - salta para Programa1.
Por ai a fora.
A ideia é ter um interrupt handler que tem tipo um variavel que vai de 0-2, ou seja o numero do programa a correr (usando um if), e chama essa função.
O meu problema é que isto teria de ser de forma a que o interrupt chama-se a função mas era mesmo um Jump, não um jump and link para voltar. Não é?
Claro que teria de ter cuidados para os programas não se atropelarem mas isso é trabalho que teria de ser feito e cuidados a ter. Tambem algumas funções criticas podiam desativar o interrupt por momentos.
Isto seria para um ARM-M0 de 48Mhz ou um MCU mais rápido.
Se disser alguma asneira calem-me :p
Boas,
A primeira questão que deves colocar é se realmente necessitas de um verdadeiro multitasking ou
se uma simples state machine pode servir. Em termos de desempenho uma state machine tem
vantagens, um sistema verdadeiramente multitasking é muito mais versátil.
Nos cores ARM uso o Systick (e respectiva interrupção) para implementar um round-robin com uma
fracção de 5us por tarefa. Cada tarefa deve ter uma estrutura associada onde vais guardar o
estado da mesma, e podes até implementar um sistema de prioridades, e cada estrutura deve ter
uma área que sirva de stack. O switching de tarefas é relativamente simples, guardar o code pointer, stack pointer, interrups state, etc, e activar o novo code pointer, stack pointer, etc. Deves também
manter e actualizar (na dita INTR) uma variável com o tickcount que é muito útil para implementar
delays, sendo que para isso deves ter uma função de delay global que seja transversal a todas as
tarefas de forma a que os timings sejam assegurados.
É claro que numa verdadeira multi-tarefa é depois necessário controlar o acesso aos periféricos, e
uma vez que podes aceder aos mesmos dentro de diversas tarefas concorrentes, deves implementar
um sistema de semáforos para evitar que duas tarefas possam aceder por exemplo à UART1 ou usar
a mesma buffer da mesma enquanto a anterior não libertar este periférico. E isto é aplicável a todos
os periféricos, memória partilhada, canais DMA, etc.
Deves ponderar muito bem se necessitas mesmo de multi-tarefa, uma state-machine mesmo que
seja muito rude pode resolver a questão sem estes problemas.
Se realmente pretendes multi-tarefa tens toda a vantagem em recorrer a um RTOS que já tenha
dado provas, não vale a pena queimar neurónios e correr riscos a reinventar a roda, a não ser que
seja por um desafio pessoal.
Geralmente só uso o RTEMS nos cores SPARC (MCUs LEON) e o RTX da ARM/Keil nos cores ARM
mas existem por ai muitos RTOS com licença FOSS que podes usar sem problemas.
Abraços,
PA