Professional Documents
Culture Documents
Daniel Quadros
dqsoft.blogspot.com
O Palestrante
Engenheiro Eletrnico 81 Scopus Tecnologia (82-86) Humana Informtica (86-93) Seal Eletrnica (93-02) Tamid Tecnologia (02-)
A Palestra
O Problema da Simultaneidade Loop Infinito de Polling Mquinas de Estado Interrupo, Filas e Pilhas Loop de Mensagens Multiprogramao No Preemptiva Multiprogramao Preemptiva Concluso
O Problema da Simultaneidade
Em uma aplicao embarcada comum o software ter que tratar vrias coisas ao mesmo tempo
O Problema da Simultaneidade
Um exemplo simples
Big Iron
Terminal de Vdeo
O Problema da Simultaneidade
Em um sistema embarcado podem existir vrias entradas que exijam tratamento Estas entradas costumam ser assncronas (ocorrem em momentos independentes) Alguns tratamentos podem ser demorados
a soluo mais bvia e comum No requer grandes teorias... mas bastante limitada
No Funciona!
Mquinas de Estado
Em cada momento o software est em um estado dentre vrios possveis Uma entrada pode causar uma mudana de estado e/ou a execuo de uma ao
A
ESC
Normal
ESC
Mquinas de Estado
enum { EST_N, EST_ESC } estado; estado = EST_N; while (1) { if (TemTecla()) TrataTecla(); if (TemRx()) if (estado == EST_N) { if (Rx == ESC) estado = EST_ESC; else Mostra (Rx); } else // EST_ESC { if (Rx == A) SobeCursor(); estado = EST_N; } }
Mquinas de Estado
Podemos ter vrias mquinas de estado em um programa Implementao
If (poucos estados e entradas) Switch (mais legvel se tem muitos estados ou entradas) Tabela de estado anterior, entrada, novo estado, ao (mais lento se procurar sequencialmente)
Interrupo garante atendimento imediato mas no pode fazer tratamento demorado Entrada precisa ser guardada em um lugar temporrio
Loop de Mensagens
Ou usar uma fila genrica para armazenar diversos tipos de entradas Cada entrada gerar uma mensagem (ou evento) na fila, com tipo e dados
Teclado Serial Fila de Mensagens
Loop de Mensagens
while (1) { if (TemMsg(&msg)) { switch (msg->tipo) { case MSG_TEC: TrataTec(); break; case MSG_RX: TrataRx(); break; } } }
Resumo At Agora
Polling, mquinas de estado e filas resolvem a maioria dos problemas, mas... Mquinas de estado complexas reduzem a legibilidade do cdigo Cdigo que ser executado seqencialmente no tempo precisa ser quebrado no fonte
Multiprogramao No Preemptiva
Programa dividido em tarefas executadas independentemente (em paralelo) Uma tarefa executa at que passar o controle para outra As tarefas precisam ser bem comportadas Minimiza problema de regies crticas
Multiprogramao No Preemptiva
Em uma chamada normal de rotina o estado do processador salvo na entrada e restaurado na sada, normalmente usando uma pilha O chaveamento de processos feito chamando uma rotina que salva o estado do processo atual e restaura o estado do processo seguinte
Multiprogramao No Preemptiva
Proc A
... Chaveia(); ...
Proc B
... Chaveia(); ...
Multiprogramao No Preemptiva
Uma fila (ou algo mais complexo) anota os processos prontos para executar Primitivas
Chaveia() passa para o processo seguinte, processo atual entra na fila de prontos Dorme(tempo) passa para o processo seguinte, processo atual s entra na fila de prontos aps o tempo
Multiprogramao No Preemptiva
Primitivas (semforos contadores)
p() solicita um recurso, se no disponvel passa para o processo seguinte, processo atual entra na fila de espera do recurso v() libera o recurso, se tinha algum na fila do recurso coloca na fila de processos prontos para execuo implementados atravs de contador + fila variao: ptemp(tempo) p() com timeout para recurso ficar disponvel
Multiprogramao No Preemptiva
ProcTeclado() { while (1) { p(semTecla); TrataTecla(); } } ProcRx() { while (1) { p(semRx); if (Rx == ESC) { p(semRx); if (Rx == A) SobeCursor(); } else Mostra(Rx); } }
Cdigo Legvel!
Multiprogramao Preemptiva
Programa dividido em tarefas executadas independentemente (em paralelo) Uma tarefa pode ser interrompida para passar o controle para outra Resiste melhor a tarefas mal comportadas Surge o problema de regies crticas
Multiprogramao Preemptiva
int var; ProcA () { int aux; ... aux = var; aux = aux+1; if (aux > MAX) aux = 0; var = aux; ... } ProcB () { int aux; ... aux = var; aux = aux-1; if (aux < 0) aux = MAX; var = aux; ... }
Multiprogramao Preemptiva
Programao fica mais complexa Implementao bem mais complexa (contexto maior, chaveamento feito em tempo de interrupo) Aplicaes embarcadas requerem tempos reduzidos e determinsticos para operar em tempo real
Multiprogramao Preemptiva
Normalmente se utilizam solues prontas:
proprietrios derivados do Linux Windows CE
Concluso
A simultaneidade est sempre presente em aplicaes embarcadas Polling, mquinas de estado e filas so adequados para projetos pequenos e mdios Multiprogramao no preemptiva uma soluo para sistemas mdios Multiprogramao preemptiva para projetos maiores e mais complexos
Obrigado!
Perguntas?