• Nenhum resultado encontrado

Capítulo 5 CONCLUSÃO

A.4. Particularidades do Xoberon

A.4.3. Programando Sistemas de Tempo Real

O capítulo ‘Programming Real-Time Systems’ da apostila [6] aborda de forma superficial o assunto programação em tempo real. O leitor deve ler atentamente as páginas 33 à 46 desta apostila que fornece uma explicação mais detalhada.

Os dois tipos de eventos mais utilizados na programação de sistemas em tempo real são o Main Event e Every Event. Portanto as explicações e exemplos serão direcionados para compreensão destes eventos.

O Main Event é utilizado para implementação de tarefas que são executadas somente quando houver tempo computacional disponível, isto é, quando não houver uma tarefa de tempo crítico sendo executada. Por isto são consideradas tarefas de tempo não crítico (NTC).

O Every Event implementa tarefas de tempo crítico (TC). Neste caso a tarefa tem de ser obrigatoriamente executada no tempo especificado.

Abaixo será apresentado um pequeno módulo que instala um Main Event e um

Every Event. M O DU LE InstalarEventos; IMPORT X O K :=PPCXOKemel; CONST clock = 5; V A R

ctrlE ven t: XOK.EveryEvent; p rin E ven t: XOK.MainEvent; co n tad or: REAL;

PROCEDURE Incrementador (e : XOK.Event); V A R

BEGIN

INC (contador); EN D Incrementador;

A - A Linguagem XOberon 108

V A R BEGIN

REPEAT (* não faz nada *) U N TIL con tad or>l000.0; ctrlEvent.Unlnstall; EN D Principal. PROCEDURE Instalar*; VA R BEGIN contador := 0.0;

XOK.InitM ain( prinEvent); prinEvent.Install ( Principal); prinEvent.Notify; XOK.InitEvery( ctrlEvent, clock, XOK.ONEm s); ctrlEvent.Install ( Incrementador); EN D Instalar;

BEG IN

NEW (prinEvent); NEW (ctrlEvent); EN D InstalarEventos.

Passaremos à análise deste módulo, explicando como se efetua a implementação de tarefas NTC e TC.

Iniciamos o módulo nomeando-o.

M O DU LE InstalarEventos;

É necessário importar o módulo PPCXOKernel. Neste módulo estão definidos os eventos. Não é necessário entender este módulo, devemos apenas saber usá-lo como uma ferramenta.

IMPORT

X OK :=PPCXOKemel;

É definida a constante clock. Esta constante será posteriormente usada na especificação do tempo de clock do ctrlEvent.

C O N ST

A - A Linguagem XOberon 109

Nas declarações é necessário especificar o tipo de evento a ser utilizado. Neste caso, ctrlEvent é do tipo EveryEvent e prinEvent é do tipo MainEvent, os quais são pré-definidos no. módulo PPCXOKernel. Foi declarada também um a variável do tipo

REAL que será utilizada no módulo. V A R

ctrlE ven t: XOK.EveryEvent; p rin E ven t: XOK.M ainEvent; co n tad or: REAL;

Antes de entrarmos nos procedimentos, vamos verificar o corpo do módulo. BEG IN

N EW (prinEvent); N E W (ctrlEvent); EN D InstalarEventos.

O corpo do módulo é executado quando o programa é carregado no sistema. Caso o módulo ainda não esteja carregado e algum procedimento deste módulo for chamado, as declarações e o corpo do módulo serão carregados antes da execução do procedimento. Ao utilizar o comando NEW, estamos alocando espaço na memória para executar estes eventos.

Desta forma, os eventos acima descritos com certeza terão seu espaço reservado na memória antes da execução de qualquer procedimento deste módulo. Também seria possível fazer esta alocação a partir do procedimento Instalar. Neste caso teríamos de ter o cuidado de usar este procedimento uma única vez enquanto o módulo estiver carregado. Do contrário, cada vez que acionássemos o procedimento

Instalar, reservaríamos desnecessariamente um novo espaço na m em ória para estes eventos.

Iniciaremos analisando o módulo Instalar. Não houve necessidade de declarações. Neste caso a palavra VAR poderia ser suprimida.

PROCEDURE Instalar*; V A R

A - A Linguagem XOberon 110

N a primeira linha de seu corpo a variável contador é inicializada.

contador := 0.0;

A seguir é feita a implementação da tarefa associada ao evento prinEvent.

XOK.InitM ain( prinEvent); prinEvent.Install ( Principal); prinEvent.Notify;

Esta seqüência é obrigatória e se repete cada vez que tivermos de instalar um

Main Event. É importante identificar corretamente o nome do evento e da tarefa. Neste caso o nome do evento é prinEvent e o nome da tarefa é Principal.

Somente quando fazemos prinEvent.Notify a tarefa Principal passa a ser executada.

A seguir é instalada a tarefa associada ao evento ctrlEvent.

XOK.InitEvery( ctrlEvent, clock, X O K .O N Em s); ctrlEvent.Install ( Incrementador);

EN D Instalar;

Após o comando XOK.lnitEvery, devemos especificar dentro dos parêntesis e nesta ordem, nome do evento, tempo de execução e base de tempo.

O tempo deverá ser sempre um número inteiro. Ao invés de utilizar a constante pré-definida clock, poderíamos digitar diretamente um valor para o tempo desejado de cada ciclo.

XOK.InitEvery( ctrlEvent, 5, XOK .O N Em s);

As bases de tempo existentes são:

- ONEsec, equivalente a um segundo;

- ONEms, equivalente a um milisegundo;

- ONEts, equivalente a um décimo de milisegundo.

Neste módulo, como clock é igual a cinco e a base de tempo usada é ONEms, a tarefa associada ao evento será executada a cada 5 milisegundos.

A - A Linguagem XOberon 111

O comando ctrlEvent.lnstall instala a tarefa Incrementador. Não é necessário utilizar Notify. A partir deste ponto as duas tarefas estão em funcionamento.

Vamos verificar o que ocorre em Incrementador. Ao escrever a tarefa deverá obrigatoriamente aparecer (e : XOK.Event) sendo que a variável e pode ser substituída por qualquer outra variável desejada.

Esta tarefa se repete obrigatoriamente a cada cinco milisegundos e o que ela faz é simplesmente incrementar o valor de contador em um a unidade a cada ciclo. Sua execução irá term inar somente quando for desinstalada por algum outro procedimento

PRO C ED URE Incrementador (e : XOK.Event); V A R

B E G IN

INC (contador); E N D Incrementador;

Simultaneamente à tarefa Incrementador o sistema estará executando a tarefa

Principal. Simultaneamente talvez não seja a palavra correta pois o sistema somente irá executar esta tarefa quando houver disponibilidade de tempo. A tarefa

Incrementador nunca é interrompida antes de chegar ao final de um ciclo. Já a tarefa

Principal pode ser interrompida em qualquer ponto de sua execução se houver necessidade de executar um Every Event.

Vamos verificar o que ocorre em Principal.

PR O C ED URE Principal ( e : XOK.Event); V A R

BEGIN

R EPEAT (* não faz nada *) U N TIL contador>l 000.0; ctrlEvent.Unlnstall; EN D Principal.

A - A Linguagem XOberon 112

Ao contrário do Every Event, o Main Event por sua definição seria executado somente uma vez. Se quisermos que seja executado mais de uma vez temos de criar algum tipo de loop interno. Neste caso foi utilizado REPEAT - UNTIL, mas outras formas também são possíveis como por exemplo LOOP - EXIT.

Utilizando REPEAT - UNTIL a tarefa irá se repetir até que um a condição seja satisfeita.

Neste programa a condição é que a variável contador seja m aior que mil. Enquanto esta condição não for satisfeita, a tarefa irá se repetir sem fazer nada, pois não temos nenhuma operação ou comando a ser executado.

Como descrito anteriormente, a tarefa Incrementador incrementa a variável

contador. Quando esta variável atingir o valor 1001, a tarefa Principal sai de seu loop e antes de ser terminada chama o evento ctrlEvent e desinstala a tarefa a ele associada, que neste caso é Incrementador.

O Main Event não pode ser desinstalado enquanto estiver no interior de um loop. Sua execução irá terminar quando alguma condição for satisfeita. Já o Every Event necessita ser desinstalado.

Para iniciar estas tarefas utilizaríamos por exemplo comando:

X System .C all InstalarEventos.Instalar ~

Se o módulo InstalarEventos ainda não estivesse carregado, seriam executados inicialmente suas declarações e seu corpo.

Resumindo o que ocorre após a chamada do procedimento InstalarEventos.

1- as duas tarefas são instaladas.

2- a tarefa Incrementador começa a incrementar o valor de contador.

3- quando a variável contador atingir 1001, a tarefa Incrementador é desinstalada e a tarefa Principal é terminada.

Para rodar novamente, bastaria repetir o comando de chamada pois no procedimento Instalar a variável contador é zerada.

A - A Linguagem XOberon 113

Esta é a idéia geral da utilização de Main Events e Every Events que são os eventos principais na programação de sistemas em tempo real.

O leitor pode questionar porque utilizar um M ain Event ao invés de utilizar um procedimento normal. Existem duas razões principais.

A primeira é que o Main Event possui prioridade de execução sobre procedimentos normais.

A segunda é que quando a execução de um programa fica presa no interior de um loop dentro de um M ain Event, é possível fazer chamadas externas para a execução de outros comandos. No entanto, quando ficamos presos no interior de um loop de um procedimento normal, não é possível executar outros comandos. Temos de esperar que o loop termine.

Documentos relacionados