ULWOS - Multitarefa no RL78: Introdução

ULWOS Multitarefa Multitarefa no RL78
Este post faz parte da série ULWOS - Multitarefa no RL78. Leia também os outros posts da série:

Já pensou em ter a possibilidade de executar múltiplas tarefas simultaneamente num microcontrolador? Neste artigo vamos demonstrar que escrever um simples e pequeno agendador/comutador de tarefas não é tão complicado assim!

A multitarefa possibilita maior liberdade ao programador, pois é possível escrever diferentes rotinas de código que rodam praticamente de forma simultânea. A multitarefa pode auxiliar o programador de diversas formas: desde piscar leds em frequências diferentes (como nosso primeiro exemplo vai demonstrar), ler teclados, escrever em displays, processar dados, tudo de forma “paralela”.

O ponto principal na multitarefa é a alteração do ponto de execução do programa. Este conceito deve ser familiar a qualquer programador de firmware, já que as interrupções fazem exatamente isso: interrupções são alterações no fluxo de código provocadas pelo hardware, ou seja, ao contrário de desvios e chamadas de função, que são alterações no fluxo de código provocadas pelo programador, as interrupções essencialmente não podem ser previstas (isto é especialmente verdade no caso de interrupções assíncronas).

Mas o quê ocorre numa interrupção? Resumidamente podemos dizer que ocorre o salvamento do contexto atual e a alteração do fluxo de código para o novo contexto, no caso o código de tratamento de interrupção (ou ISR em inglês). Ao término do processamento da interrupção o contexto anterior é restaurado e a execução retorna ao ponto onde estava antes da interrupção.

ULWOS - Uma interrupção interrompe o código principal
Figura 1 - Uma interrupção interrompe o código principal

É importante esclarecer o significado de contexto em termos computacionais: trata-se do estado dos registradores da CPU envolvidos no processamento cotidiano. Normalmente estes registradores são o acumulador, o registrador de estado, o apontador de pilha (SP), o contador de programa (PC) e outros registradores internos que possam ser utilizados no processamento cotidiano. Podemos dizer que o contexto é uma “fotografia” que é tirada da CPU e que mostra exatamente o que ela estava fazendo. Com base nesta “fotografia” deve ser possível restaurar a execução da forma como se encontrava.

Um aspecto importante a ser observado é que o contexto computacional deve ser armazenado em memória e isso normalmente é feito utilizando-se a pilha ou o conceito de pilhas de memória.

Agora que já entendemos como ocorre a comutação de uma tarefa principal para uma outra secundária (a interrupção), é hora de identificar os conceitos associados a multitarefa.

Em primeiro lugar vamos lembrar o óbvio: um sistema dotado de uma única CPU e uma única unidade de execução não pode executar mais de uma tarefa simultaneamente. Mesmo uma CPU com mais de uma unidade de execução e capaz de executar mais de uma instrução simultaneamente (uma CPU superescalar) também não consegue executar mais de uma tarefa simultaneamente.

A técnica para se fazer com que uma CPU execute mais de uma tarefa simultaneamente é a de multiplexação por divisão de tempo, ou seja, divide-se o tempo útil da CPU entre cada tarefa, cada uma executando por uma fração do tempo útil total da CPU.

Esta multiplexação pode ser dividida em outras duas categorias: a multiplexação cooperativa e a multiplexação preemptiva. Na multiplexação ou multitarefa cooperativa, cada tarefa tem de provocar a alteração do fluxo de código para a tarefa seguinte. Isto significa que depende de cada tarefa individualmente (e da cooperação entre elas) a eficiência da multiplexação.

Na multiplexação preemptiva um programa especial (o agendador ou escalonador de tarefas) é encarregado de selecionar uma das tarefas disponíveis para ser executada. Existem diversos algoritmos utilizados para construir agendadores de tarefas, sendo o round-robin um dos mais simples, eficiente e bastante utilizado. O agendador round-robin procura dividir o tempo da CPU igualmente entre as tarefas disponíveis. Em algumas variações as tarefas de maior prioridade são executadas antes (e as vezes por mais tempo) que as tarefas de menor prioridade.

Os agendadores de tarefas utilizam também indicadores para sinalizar o estado de cada tarefa, normalmente encontramos os seguintes estados básicos: iniciando, pronta, executando, bloqueada, E/S e encerrada.

O nosso ULWOS utiliza um agendador de tarefas preemptivo round-robin, mas inicialmente não teremos nenhum mecanismo de prioridades e nem indicadores para as tarefas, ou seja, uma vez que cada tarefa seja criada, ela permanecerá executando indefinidamente (nem que seja executando um loop no final, mas a tarefa continuará recebendo periodicamente tempo da CPU). Obviamente que isso está longe de ser ideal, mas por hora é o suficiente para demonstrar o conceito. No futuro iremos incluir mais mecanismos para aumentar a eficiência do agendador e do nosso pequeno SO (mesmo ele não sendo exatamente um sistema operacional).

A figura a seguir representa, de uma forma simplificada, tudo o que foi dito e visto até aqui.

ULWOS - Um agendador de tarefas
Figura 2 - Um agendador de tarefas

Inicialmente, todas as pilhas de contexto do agendador de tarefas apontarão para o respectivo ponto de entrada de cada uma das tarefas. Assim, quando o agendador inicia a execução da tarefa 1, ele carrega o contexto da tarefa e desvia para a mesma. Após um intervalo de tempo (um quantum, o heart-beat ou batida de coração do sistema operacional) o agendador interrompe a tarefa 1 (que se encontrava no ponto hipotético designado “b”), salva o contexto da mesma, carrega o contexto da tarefa 2 e desvia para a mesma. Após outro heart-beat o agendador interrompe a tarefa 2 (que se encontrava no ponto “d”), salva o contexto, carrega o contexto da tarefa 3 e esta operação segue até que todas as tarefas sejam executadas e em seguida reinicia o ciclo. Neste caso, observe que quando o agendador retornar para a tarefa 1, a execução prosseguirá do ponto “b” que era o ponto anterior em que estava a tarefa 1.

Desta forma, é possível que uma única CPU execute diversos programas de forma virtualmente simultânea!

É claro que num sistema operacional comercial existe um rígido controle sobre a área de memória e de I/O que cada tarefa pode acessar, impedindo que uma tarefa altere memória que pertence ao kernel do sistema operacional ou a outras tarefas. Este tipo de controle é realizado com a ajuda de hardware dedicado (como as unidades de gerenciamento de memória ou MMUs) e de modos especiais de operação da CPU (modos supervisores ou de execução privilegiada). Além disso, um sistema operacional deverá prover mecanismos para que possa ocorrer a comunicação entre as tarefas (IPC - inter-process communication).

No presente caso, nenhuma destas funcionalidades de hardware está presente, razão pela qual não há como impedir que uma tarefa acesse código ou dados de outra ou do kernel do sistema operacional. Já com relação à comunicação entre tarefas, o tema será visto futuramente.

Nos próximos artigos vamos tratar da implementação no RL78 do nosso pequeno comutador de tarefas. Aguarde!

Outros artigos da série

ULWOS - Multitarefa no RL78: Comutador de tarefas >>
Este post faz da série ULWOS - Multitarefa no RL78. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fábio Pereira
Técnico em eletrônica, advogado, pós-graduado em projetos eletrônicos, autor de 9 livros na área de programação de microcontroladores (1 em inglês), entusiasta de eletrônica e computação. Desenvolvimento em diversas plataformas de 8, 16 e 32 bits, desde microcontroladores até desktop e celulares, utilizando C, C#, Java, Pascal, PHP dentre outras. Curte rock'n roll e cerveja. Atualmente residindo em Kitchener, ON, Canada, é também mantenedor do Embedded Systems Blog em http://embeddedsystems.io

1
Deixe um comentário

avatar
 
1 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
0 Comment authors
ULWOS – multitarefa no Renesas RL78 | FPB Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
trackback

[…] múltiplas tarefas simultaneamente num microcontrolador? Neste artigo (já publicado no portal Embarcados) vamos demonstrar que escrever um simples e pequeno agendador/comutador de tarefas não é tão […]