Download - Pg fabio louvatti
Desenvolvimento de uma plataforma em tempo real de
aquisição de dados em ambiente Linux
Fabio Louvatti do Carmo
Projeto de Graduação
Objetivo
● Utilizar o GNU/Linux e um computador
desktop para construir tarefas de tempo
real afim de fazer aquisição de dados
Computador desktop
– Computador de propósito geral● A princípio, o seu uso é inadequado para
tempo real.– Memória virtual (MMU), arbitragem em
barramentos, etc..
● Usualmente é usado microcontroladores.– Determinismo garantido, latência previsível.
Computador desktop
– Por que usar?● Alta capacidade de realizar operações com
ponto flutuante.
GNU/Linux
– Linux padrão não é de tempo real● Latências de interrupções e indeterminismo
no escalonamento de tarefas.
– Por que usar Linux para tempo real?● Comunicação entre tarefas
● Comandos
● Supervisão
● Logs em disco
● Visualização de dados
GNU/Linux
– Como fazer Linux em tempo real?●Modificação no kernel.
– Opções: RTLinux, RTAI, Xenomai
RTAI
– Real Time Application Interface
– Começou no Dipartimento di Ingegneria
Aerospaziale del Politecnico di Milano
(DIAPM) - Itália, em 1996/97
RTAI
– patch (remendo) aplicado ao kernel Linux.
– Camada de abstração de hardware de
tempo real (RTHAL).
– Controle de interrupções.
Camada de abstraçãoRTHAL
RTAI - Interrupções
RTAI - Serviços
– Possui uma API que disponibiliza:● Gerenciamento de processos;
● Gerenciamento de memória;
● Variáveis condicionais (semáforos);
● Mailboxes (caixa de mensagens);
● Temporizadores;
● dentre outros.
RTAI - Aplicações
– Suporte a periféricos (drivers):● Porta paralela.
● Porta serial.
– Projetos que suportam o RTAI:● RTNet – protocolo de tempo real para redes.
● COMEDI – Drivers de placas de aquisição de
dados.
● CANBUS
RTAI-Lab
– Disponibiliza ferramentas para
desenvolver diagramas de blocos que
são compilados e executados com
RTAI Linux.
– Podem ser desenvolvidos usando:● Matlab/Simulink/Real Time Workshop
● Scilab/Scicos (código livre)
Aquisição de dados
– Circuito baseado no microcontrolador
AVR● Atmega48
– Dados enviados pela porta paralela
#include <avr/io.h>#include <avr/interrupt.h>ISR(INT0_vect){ unsigned char temp; ADCSRA |= _BV(ADSC);/*inicia conversão*/ while(ADCSRA & 0x40);/*aguarda fim da conversão*/ temp = ADCH; PORTB = temp;}int main(void) { /* Inicializa portas*/ PORTB = 0x00; DDRB = 0xff; /* PORTB como saída*/ PRR = ~(_BV(PRADC)); /* Apenas ativa o ADC*/ /* Inicializa ADC*/ ADMUX = _BV(ADLAR); /* AREF como referencia, ADC0 como entrada, ajustedo resultado para esquerda*/ DIDR0 = _BV(ADC0D); /* desabilitar o buffer de entrada digital doADC0*/ ADCSRA = _BV(ADEN) | _BV(ADPS0); /* habilita ADC, pre-escala=2*/ /* Inicializa interrupção externa*/ EICRA = _BV(ISC00) | _BV(ISC01);/* Borda de subida em INT0 gera umainterrupção*/ EIMSK = _BV(INT0); /* habilita interrupção externa*/ sei(); while(1){} return 1;}
Diagrama de blocos - Scicos
Bloco 'Sensor'
#include <math.h>#include <stdlib.h>#include <scicos_block4.h>#include <sys/io.h>void i_generic_SENS(scicos_block *block,int flag){
int i;double *y;unsigned char temp;double t = get_scicos_time();switch(flag) {
case 4:break;
case 1: /* Atualização da saída do bloco */for (i=0;i<1;i++) {
outb(inb(0x37a)|0x01,0x37a);/* borda de subida*/outb(inb(0x37a)&0xfe,0x37a);/* coloca nível baixo no pino */y = block->outptr[i];temp = inb(0x378);y[0] = 0.019607843*temp;
}break;
case 5:break;
}}
QRtaiLab
Resultados
Conclusão
– Resultados bons apesar das limitações de um
computador desktop e da porta paralela.
– Boa alternativa ao Matlab/Simulink/RTW● Baixo custo
● Código aberto
– Possibilidade de muitos projetos envolvendo o
RTAI Linux.
Obrigado!