ELT048 - SOEDriversRodrigo AlmeidaUniversidade Federal de Itajubá
Revisão● Sistema de tempo real● Requisitos temporais
Real time● Capacidade de umsistema em garantira peridiocidade deuma tarefa● Determinismo
Requisitos temporais● Para implementar um sistema que trabalhecom requisitos temporais:1)Deve existir um relógio que traba...
●1acondição:● É necessário um timer que possa gerar umainterrupção.●2acondição:● Adicionar as informações na estrutura dop...
Rotina de Interrupção//colocar no MCUinit.c na função isrVrti()#include “kernel.h”__interrupt void isrVrti(void){KernelClo...
Rotina de Interrupção//colocar no kernel.c#define MIN_INT -30000void KernelClock(void){unsigned char i;i = ini;while(i!=fi...
Exercício● Montar um relógio binário onde cada ledpisca numa frequência diferente12341 segundo2 segundos4 segundos8 segund...
Driver● Driver é uma abstração em software dohardware da placa, suas funcionalidades,opções e modos de funcionamento.● É d...
Driver● Exemplo:● Display de LCD:– 16 colunas X 2 linhas– Compatível com HD44780 (Hitachi)● Dragon12– Ligação em 4 bits– A...
Rotina de inicialização do LCD
Esquemático LCD - Dragon12
LCD + Dragon 12 + HCS12● Utilizar as portas do HCS12 conformeligação da Dragon12● PORTK(6:2) → Data● PORTK(1) → Enable● PO...
Rotinas de acesso ao LCD● Referencia para implementação das rotinas● http://www.evbplus.com/hcs12_9s12_resources/app_notes...
Rotinas de acesso ao LCDvoid writeLcd4(unsigned char data, unsigned char rs){unsigned char hi, lo;/* split byte into 2 nib...
Rotinas de acesso ao LCDvoid writeLcd8(unsigned char data) {unsigned char temp;/* shift upper nibble to data bits in port ...
Rotinas de acesso ao LCDvoid lcdDelay(unsigned long constant) {volatile unsigned long counter;for(counter = constant; coun...
Rotinas de acesso ao LCDvoid LCD_init(void) {/* initialise port */DDRK = 0xff;writeLcd8(0x30); // tell it oncelcdDelay(DEL...
Rotinas de acesso ao LCDvoid writeLine(char *string, int line) {int i;unsigned char instruction;/* Set address in LCD modu...
Criação de um driver● Para a criação de um driver bastaencapsular estas funções num conjuntoorganizado e de fácil acesso.●...
Padronização● A forma de uso de um drivers éextremamente ligada a seu dispositivo.● Padronizar os diversos tipos de driver...
Padronização● É possível separar as funções de umdispositivo em 3 modelos● Inicialização● Execução de serviço/funcionalida...
Padronização● As funções do tipo inicialização sãoexecutadas antes de utilizar o dispositivo.● Podem tomar muito tempo● Fa...
Padronização● As funções de execução de serviços são asfunções que realizam as operações dodispositivo● Escrever no LCD, g...
Padronização● As funções de retorno de informaçãodevolvem valores obtidos pelos dispositivos● Leitura de uma tecla, recepç...
Padronização● Para simplificar a padronização foi criadoum modelo com:● Uma função de inicialização do driver● Um vetor co...
Padronização
Estruturas para a criação do driver//Device Drivers Types (dd_types.h)//ptr. de func. para uma função do drivertypedef cha...
Drive genérico● Desenvolvimento de um drive que altera ovalor da portaB (LEDs)
Driver genérico#ifndef drvGenerico_h#define drvGenerico_h#include "dd_types.h"//lista de funções do driverenum {GEN_PORTB,...
Driver genérico//(drvGenerico.c)// implementação do driver em struct// apresenta todas as funções do driverstatic driver t...
Driver genérico//(drvGenerico.c)//funcionalidades implementadaschar changePORTB(void *parameters) {PORTB = (char) paramete...
Driver genérico//(drvGenerico.c)//função para acesso ao driver//deve inicializar a estrutura do driver//e a lista de funçõ...
Exercício● Desenvolver um driver para o LCDutilizando o modelo proposto
Próximos SlideShares
Carregando em…5
×

Desenvolvimento de drivers para sistemas embarcados

1.307 visualizações

Publicada em

Apresenta a definição de driver sob a ótica da programação. Desenvolve um modelo genérico para implementação de drivers apresentando um exemplo para acesso à um barramento de leds, além das ligações e rotinas para acesso à um dispositivo de LCD 2x16.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.307
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
32
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Desenvolvimento de drivers para sistemas embarcados

  1. 1. ELT048 - SOEDriversRodrigo AlmeidaUniversidade Federal de Itajubá
  2. 2. Revisão● Sistema de tempo real● Requisitos temporais
  3. 3. Real time● Capacidade de umsistema em garantira peridiocidade deuma tarefa● Determinismo
  4. 4. Requisitos temporais● Para implementar um sistema que trabalhecom requisitos temporais:1)Deve existir um relógio que trabalhe com umafrequência precisa.2)O kernel deve ser informado da frequência, ouperíodo, de execução de cada processo.3)A soma dos tempos de cada processo deve“caber” no tempo disponível do processador.
  5. 5. ●1acondição:● É necessário um timer que possa gerar umainterrupção.●2acondição:● Adicionar as informações na estrutura doprocesso●3acondição:● Testar, testar e testar.● Em caso de falha:– Chip mais rápido– OtimizaçãoRequisitos temporais
  6. 6. Rotina de Interrupção//colocar no MCUinit.c na função isrVrti()#include “kernel.h”__interrupt void isrVrti(void){KernelClock();//limpar a flag de interrupçãoCRGFLG = 0x80;}
  7. 7. Rotina de Interrupção//colocar no kernel.c#define MIN_INT -30000void KernelClock(void){unsigned char i;i = ini;while(i!=fim){if((pool[i].start)>(MIN_INT)){pool[i].start--;}i = (i+1)%SLOT_SIZE;}}//colocar no kernel.hvoid KernelClock(void);
  8. 8. Exercício● Montar um relógio binário onde cada ledpisca numa frequência diferente12341 segundo2 segundos4 segundos8 segundos //Ligar o 1o ledPORTB = PORTB | 0x01;//Desligar o 1o ledPORTB = PORTB & ~0x01;//Piscar o 1o ledPORTB = PORTB ^ 0x01;
  9. 9. Driver● Driver é uma abstração em software dohardware da placa, suas funcionalidades,opções e modos de funcionamento.● É dependente do processador,doscomponentes conectados e das ligaçõesentre eles.
  10. 10. Driver● Exemplo:● Display de LCD:– 16 colunas X 2 linhas– Compatível com HD44780 (Hitachi)● Dragon12– Ligação em 4 bits– Acesso à EN e RS● MC9HCS12DG256– Utilizada a porta K● Rotinas de inicialização e comunicação
  11. 11. Rotina de inicialização do LCD
  12. 12. Esquemático LCD - Dragon12
  13. 13. LCD + Dragon 12 + HCS12● Utilizar as portas do HCS12 conformeligação da Dragon12● PORTK(6:2) → Data● PORTK(1) → Enable● PORTK(0) → RS (data/cmd)● Montar as rotinas de acordo com odatasheet do HD44780● Comunicação em 4 bits
  14. 14. Rotinas de acesso ao LCD● Referencia para implementação das rotinas● http://www.evbplus.com/hcs12_9s12_resources/app_notes.html● Apresenta 4 funções● void initLcd(void)● void writeLine(char *string, int line)● void writeLcd8(unsigned char data, unsigned char rs)● void writeLcd4(unsigned char data, unsigned char rs)● void lcdDelay(unsigned long constant)
  15. 15. Rotinas de acesso ao LCDvoid writeLcd4(unsigned char data, unsigned char rs){unsigned char hi, lo;/* split byte into 2 nibbles and shift to line up* with data bits in port K */hi = ((data & 0xf0) >> 2) | (rs & 0x01) ;lo = ((data & 0x0f) << 2) | (rs & 0x01) ;/* do write pulses for upper, then lower nibbles */PORTK = hi; // write with EN=0PORTK = hi | ENBIT; // write with EN=1PORTK = hi; // write with EN=0PORTK = lo; // write with EN=0PORTK = lo | ENBIT; // write with EN=1PORTK = lo; // write with EN=0/* allow instruction to complete */lcdDelay(DELAY40US);} // end writeLcd4()
  16. 16. Rotinas de acesso ao LCDvoid writeLcd8(unsigned char data) {unsigned char temp;/* shift upper nibble to data bits in port K */temp = (data >> 2); // rs is always 0/* Now do the EN pulsing */PORTK = temp; // write with EN=0PORTK = temp | ENBIT; // write with EN=1PORTK = temp; // write with EN=0/* allow instruction to complete */lcdDelay(DELAY40US);} // end writeLcd8()
  17. 17. Rotinas de acesso ao LCDvoid lcdDelay(unsigned long constant) {volatile unsigned long counter;for(counter = constant; counter > 0; counter--);} // end lcdDelay()
  18. 18. Rotinas de acesso ao LCDvoid LCD_init(void) {/* initialise port */DDRK = 0xff;writeLcd8(0x30); // tell it oncelcdDelay(DELAY4_1MS);writeLcd8(0x30); // tell it twicelcdDelay(DELAY100US);writeLcd8(0x30); // tell it thrice// last write in 8-bit mode sets bus to 4 bit modewriteLcd8(0x20);/* In 4 bit mode, write upper/lower nibble */writeLcd4(0x28, 0); // 4-bit, 2 lines, 5x7 matrixwriteLcd4(0x0c, 0); // disp on, cursor & blink offwriteLcd4(0x01, 0); // display clearwriteLcd4(0x06, 0); // disable display shift} // end initLcd()
  19. 19. Rotinas de acesso ao LCDvoid writeLine(char *string, int line) {int i;unsigned char instruction;/* Set address in LCD module */if( 1 == line)instruction = 0xc0; // write bottom lineelseinstruction = 0x80; // write top linewriteLcd4( instruction, 0); // rs=0 means command/* blast out 16 bytes */for( i = 0; i < LCDWIDTH; i++) {writeLcd4( string[i], 1); // rs=1 means data}} // end writeLine()
  20. 20. Criação de um driver● Para a criação de um driver bastaencapsular estas funções num conjuntoorganizado e de fácil acesso.● Headers e defines● A mudança do driver não deve gerarnenhuma alteração no código da aplicação.● A criação de um driver deve se concentrarna função e não nos recursos dodispositivo.
  21. 21. Padronização● A forma de uso de um drivers éextremamente ligada a seu dispositivo.● Padronizar os diversos tipos de driversenvolve conceder concessões e inserir umoverhead que pode ser prejudicial aosistema● No entanto isto permite construir umsistema para gerenciamento dos mesmos
  22. 22. Padronização● É possível separar as funções de umdispositivo em 3 modelos● Inicialização● Execução de serviço/funcionalidade● Retorno de informação● Função de acesso ao driver
  23. 23. Padronização● As funções do tipo inicialização sãoexecutadas antes de utilizar o dispositivo.● Podem tomar muito tempo● Fazem parte do “boot” do sistema
  24. 24. Padronização● As funções de execução de serviços são asfunções que realizam as operações dodispositivo● Escrever no LCD, gerar um sinal de PWM,enviar uma informação via serial● Em geral são executadas rapidamentepodendo ser sequenciadas num processosem impactos na velocidade de execução
  25. 25. Padronização● As funções de retorno de informaçãodevolvem valores obtidos pelos dispositivos● Leitura de uma tecla, recepção de um valor viaserial● Estas funções são eventuais e nãodeterminísticas.● Por esse motivo é uma boa pratica não esperarque elas aconteçam.
  26. 26. Padronização● Para simplificar a padronização foi criadoum modelo com:● Uma função de inicialização do driver● Um vetor com ponteiros de função com cadafunção de execução● Um sistema de callback para cada evento deresposta do dispositivo● Uma função que retorna uma struct dodriver
  27. 27. Padronização
  28. 28. Estruturas para a criação do driver//Device Drivers Types (dd_types.h)//ptr. de func. para uma função do drivertypedef char(*ptrFuncDrv)(void *parameters);//estrutura do drivertypedef struct {char drv_id;ptrFuncDrv *drv_func;ptrFuncDrv drv_init;} driver;//função de retorno do drivertypedef driver* (*ptrGetDrv)(void);
  29. 29. Drive genérico● Desenvolvimento de um drive que altera ovalor da portaB (LEDs)
  30. 30. Driver genérico#ifndef drvGenerico_h#define drvGenerico_h#include "dd_types.h"//lista de funções do driverenum {GEN_PORTB, GEN_END};//função de acesso ao driverdriver* getGenericoDriver(void);#endif // drvGenerico_h
  31. 31. Driver genérico//(drvGenerico.c)// implementação do driver em struct// apresenta todas as funções do driverstatic driver thisDriver;//lista de funções que o driver contémstatic ptrFuncDrv this_functions[GEN_END];
  32. 32. Driver genérico//(drvGenerico.c)//funcionalidades implementadaschar changePORTB(void *parameters) {PORTB = (char) parameters;return FIM_OK;}//função para inicialização do hardwarechar initGenerico(void *parameters) {DDRB = 0xFF;thisDriver.drv_id = (char) parameters;return FIM_OK;}
  33. 33. Driver genérico//(drvGenerico.c)//função para acesso ao driver//deve inicializar a estrutura do driver//e a lista de funções disponíveisdriver* getGenericoDriver(void) {//função de inicializaçãothisDriver.drv_init = initGenerico;//funções do driverthis_functions[GEN_PORTB] = ChangePORTB;//atualizando a referencia da listathisDriver.drv_func = &this_functions;return &thisDriver;}Endereço dafunção
  34. 34. Exercício● Desenvolver um driver para o LCDutilizando o modelo proposto

×