Introdução à criação de Drivers Prof.Fernando Branquinho Construção de Drivers Objetivo da criação de um driver Isolar a lógica do domínio do problema, das diferentes tecnologias que podem ser aplicadas. Prática muito utilizada pelos Sistemas Operacionais Exemplo de criação de um sistema de Semáforo Inteligente Objetivo Controlar os semáforos de um cruzamento, dando prioridade de passagem pela rua com maior quantidade de veículos. Exemplo de diferentes soluções tecnológicas que podem ser empregadas Exemplos de diferentes interfaces com o computador 1. Paralela do PC 2. Serial do PC 3. Placa de E/S (Entrada/Saída) específica 4. Comunicação com dispositivos especiais 5. Internet
6.... Como fazer um software que atenda a todas estas possibilidades facilmente? Construção do software em camadas Interface entre a camada de negócio e o driver Esta interface deve atender as necessidades que a aplicação possui para realizar seus objetivos. Não deve ser definida em função do tipo de tecnologia aplicada, mas sim, em função somente das necessidades do sistema. Esta interface é definida pelo fabricante do software de gestão do domínio do problema. Métodos para construção da interface entre a camada de negócio e o driver: Existem vários modos de implementar esta interface. Exemplos: Código fonte para compilação Compartilhamento de área de memória Compartilhamento de arquivos em disco Interrupções de software Uso da área de transferência Bibliotecas de ligação dinâmica (DLL Windows) DDE Componentes de software (COM, CORBA) Exemplo de especificação da interface entre a camada de negócio e o driver, através de "Código fonte para compilação": Função: lampadas_semaforo Objetivo: Controlar cada uma das lâmpadas do semáforo Parâmetros de Entrada: um byte para controle das lâmpadas, onde bit 0 = Lâmpada Vermelha do semáforo da rua vertical bit 1 = Lâmpada Amarela do semáforo da rua vertical bit 2 = Lâmpada Verde do semáforo da rua vertical bit 3 = Lâmpada Vermelha do semáforo da rua horizontal bit 4 = Lâmpada Amarela do semáforo da rua horizontal bit 5 = Lâmpada Verde do semáforo da rua horizontal Parâmetros de Saída: nenhum Função: carros_na_vertical Objetivo: Informar o números de carros existentes na rua vertical Parâmetros de Entrada: nenhum Parâmetros de Saída: Número de carros na rua vertical
Função: carros_na_horizontal Objetivo: Informar o números de carros existentes na rua horizontal Parâmetros de Entrada: nenhum Parâmetros de Saída: Número de carros na rua horizontal Função: inicializa_driver Objetivo: Permitir ao driver a realização de qualquer inicialização para seu funcionamento Parâmetros de Entrada: nenhum Parâmetros de Saída: nenhum Função: finaliza_driver Objetivo: Permitir ao driver encerrar seu funcionamento Parâmetros de Entrada: nenhum Parâmetros de Saída: nenhum Exemplo de um software com a lógica de controle do semáforo
Código correspondente em "C"
Rotina: SEMAFORO.C #include "driver.h" #define VM_V 1 #define AM_V 2 #define VD_V 4 #define VM_H 8 #define AM_H 16 #define VD_H 32 #define VERTICAL 1 #define HORIZONTAL 2 void main() { int ch=0,aberto; clrscr(); inicializa_driver(); lampadas_semaforo(vd_v+vm_h); aberto=vertical; while(ch!= 27) { if (kbhit()) ch=getch(); if (carros_na_horizontal() > carros_na_vertical() && aberto==vertical) { lampadas_semaforo(am_v+vm_h); sleep(2); lampadas_semaforo(vm_v+vd_h); aberto=horizontal; if (carros_na_vertical() > carros_na_horizontal() && aberto==horizontal) { lampadas_semaforo(am_h+vm_v); sleep(2); lampadas_semaforo(vm_h+vd_v); aberto=vertical; finaliza_driver(); Exemplo de implementação do driver Escolha de uma tecnologia Utilização dos sensores de solo Utilização da interface paralela do PC Especificação da interface entre o driver e o hardware Acionamento das lâmpadas PORT 0x378
Leitura dos sensores PORT 0x379 Exemplo do software do driver Rotina: driver.h (Incluída no software SEMAFORO.C, acima.) #include "dos.h" void inicializa_driver(); void finaliza_driver(); void lampadas_semaforo(char); carros_na_horinzontal(); carros_na_vertical(); void le_sensores(); int h_carros,v_carros; void inicializa_driver() { Pino Bit Função 2 0 Lâmpada Vermelha da rua vertical 3 1 Lâmpada Amarela da rua vertical 4 2 Lâmpada Verde da rua vertical 5 3 Lâmpada Vermelha da rua horizontal 6 4 Lâmpada Amarela da rua horizontal 7 5 Lâmpada Verde da rua horizontal Pino Bit Função 13 4 1º Sensor rua Vertical (entrada do carro) 12 5 2º Sensor rua Vertical (saída do carro) 10 6 1º Sensor rua Horizontal (entrada do carro) 11 7 2º Sensor rua Horizontal (saída do carro) h_carros=0; v_carros=0; void finaliza_driver() { outp(0x378,0); void lampadas_semaforo(char byte) { outp(0x378,byte); carros_na_horizontal() { le_sensores(); return(h_carros);
carros_na_vertical() { le_sensores(); return(v_carros); void le_sensores() { static int ult_ch; int ch; ch=(inp(0x379) & 0xf0 ^ 0x70) >> 4 ; if (ch & 1 &&!(ult_ch & 1)) h_carros++; if (ch & 2 &&!(ult_ch & 2)) if (h_carros > 0) h_carros--; if (ch & 4 &&!(ult_ch & 4)) v_carros++; if (ch & 8 &&!(ult_ch & 8)) if (v_carros > 0) v_carros--; ult_ch=ch; Exercícios 1. Quais as vantagens em isolar a lógica do domínio do problema, da tecnologia aplicada? 2. Existiria alguma desvantagem nisto? 3. O que significa "construção de software em camadas"? 4. Em termos de implementação de software, quais as diferenças entre utilizar as interfaces "paralela" e "serial" do PC? 5. Qual a desvantagem em se criar drivers baseados em código fonte para compilação? 6. Na utilização de software em camadas, o que é necessário modificar quando se altera a tecnologia utilizada? 7. Crie um novo driver para o "sistema de semáforo", que permita simular o funcionamento do hardware através de um esboço do cruzamento entre duas ruas na tela do computador. Ex: Simulacao do funcionamento do Semaforo Press 1 e 2 p/ horizontal ou 3 e 4 p/ vertical. ESC p/ sair o o x ---------------- ---------------- x o o Carros = 0 ---------------- ----------------
Carros = 0 O programa deverá simular a passagem pelos sensores de solo, utilizando-se as teclas 1 e 2 para a rua horizontal, e 3 e 4 para a rua vertical. Também deve aparecer na tela, o número de carros existentes em cada uma das ruas. Os semáforos devem representar o estado passado pelo programa "SEMAFORO.C". Resumindo, o driver deve ser feito em linguagem "C", fornecido em um arquivo com o nome "DRIVER.H", para ser compilado em conjunto com o programa "SEMAFORO.C". Final do documento Fernando J.C.Branquinho http://br.geocities.com/branqs