ELT048 - SOEControladora de DriversRodrigo AlmeidaUniversidade Federal de Itajubá
Revisão● Sistema de tempo real● Requisitos temporais
Driver● Driver é uma abstração em software dohardware da placa, suas funcionalidades,opções e modos de funcionamento.● É d...
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
Exercício● Desenvolver um driver para o LCDutilizando o modelo proposto
Controladora de Drivers● É utilizada como uma interface entre okernel e os drivers● É a responsável pela inicialização ema...
● A implementação a ser apresentada possuiapenas 2 funções:● Uma para inicialização de um driver– Além da inicialização de...
● Para obter acesso à todos os drivers énecessário que a controladora obtenha oendereço de uma estrutura do tipo driver.● ...
static driver* driversLoaded[QNTD_DRV];static char qntDrvLoaded;char initDriver(char newDriver) {char resp = FAIL;if(dLoad...
● As funções de retorno de estrutura sãoapresentadas à controladora no arquivo deheader.● O header da controladora inclui ...
#ifndef ctrdrv_h#define ctrdrv_h#define QNTD_DRV 20char initCtrDrv(void);char callDriver(char drv_id, char func_id, void*p...
//ddCtr.h#include "drvGenerico.h"#include "drvInterrupt.h"#include "drvTimer.h"enum {DRV_GEN, /*1st driver*/DRV_INTERRUPT,...
char callDriver(char drv_id,char func_id,void *param) {char i;for (i = 0; i < dLoaded; i++) {//find the right driverif (dr...
void main(void) {//Atualizar kernelInit para inicializar a CtrkernelInit();initDriver(DRV_LCD);callDriver(DRV_LCD, LCD_CHA...
Exercício● Montar um relógiocom o LCDutilizando acontroladora paraacesso ao driver.
Controladora de DriversCamada de Abstração de InterrupçõesInterrupt Abstract Layer - IAL
Interrupt Abstract Layer - IAL● Um tipo de hardware comum a quase todomicrocontrolador é o dispositivo deinterrupção.● Est...
Interrupt Abstract Layer - IAL● Com o intuito de simplificar este dispositivodo ponto de vista do software é comumcriar um...
Interrupt Abstract Layer - IAL//drvInterrupt.c//define o ponteiro de função a ser chamado//na interrupçãotypedef void (*in...
Interrupt Abstract Layer - IAL● A função para execução da interrupção édependente do compilador e doprocessador utilizado....
Interrupt Abstract Layer - IAL//mc9s12 + Codewarriortypedef void (*near tIsrFunc)(void);static const tIsrFunc _InterruptVe...
Interrupt Abstract Layer - IAL● A IAL facilita o uso das interrupções porparte do programador, bastando apenas 3passos● O ...
Interrupt Abstract Layer - IAL//Função desejada para rodar na interrupção do timervoid timerISR(void) {callDriver(DRV_TIME...
Controladora de DriversCallback para drivers
Callback● Funções de callback lembram os eventosnas linugagens de alto nível● Quando o mouse clicar no botão Y execute X● ...
Controladora de Drivers● No processo do callback existem duaspartes separadas que devem serexecutadas sequencialmente.● A ...
Callback:Process A :Driver:InterruptLayerISRsetup(isrPtr)DataRequest(&callback)HW interruptisrPtr():KernelkernelAddProc(&c...
Callback//********** Excerpt from drvAdc.c **********// called from setup time to enable ADC interrupt// and setup ADC ISR...
Callback//********** Excerpt from main.c **********// Process called by the kernelchar adc_func(void) {//creating callback...
Callback//********** Excerpt from drvInterrupt.c **********//interrupt functionvoid isr(void) interrupt 1 {if (BitTst(INTC...
Callback//********** Excerpt from main.c **********//callback function started from the kernelchar adc_callback(void) {uns...
Próximos SlideShares
Carregando em…5
×

Projeto de uma controladora de drivers

595 visualizações

Publicada em

  • Seja o primeiro a comentar

Projeto de uma controladora de drivers

  1. 1. ELT048 - SOEControladora de DriversRodrigo AlmeidaUniversidade Federal de Itajubá
  2. 2. Revisão● Sistema de tempo real● Requisitos temporais
  3. 3. 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.
  4. 4. 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.
  5. 5. Padronização
  6. 6. Exercício● Desenvolver um driver para o LCDutilizando o modelo proposto
  7. 7. Controladora de Drivers● É utilizada como uma interface entre okernel e os drivers● É a responsável pela inicialização emanutenção dos drivers● Armazena informações sobre os driverscarregados● Funciona como uma camada de segurança,evitando que comandos “errados” sejamrepassados aos drivers.
  8. 8. ● A implementação a ser apresentada possuiapenas 2 funções:● Uma para inicialização de um driver– Além da inicialização deve fornecer um ID para odriver.● Uma para repassar os comandos da aplicaçãopara os driversControladora de Drivers
  9. 9. ● Para obter acesso à todos os drivers énecessário que a controladora obtenha oendereço de uma estrutura do tipo driver.● Estáticamente:● é montada uma lista com funções que retornamesta estrutura.● Dinâmicamente:● recebe-se esta estrutura via comunicaçãoserial e retorna-se o endereço onde os dadosforam salvos.Controladora de Drivers
  10. 10. static driver* driversLoaded[QNTD_DRV];static char qntDrvLoaded;char initDriver(char newDriver) {char resp = FAIL;if(dLoaded < QNTD_DRV) {//obtem a estrutura do driver desejadodrivers[dLoaded] = drvInitVect[newDriver]();//should test if driver was loaded correclyresp = drivers[dLoaded]->drv_init(&newDriver);dLoaded++;}return resp;}Controladora de Drivers
  11. 11. ● As funções de retorno de estrutura sãoapresentadas à controladora no arquivo deheader.● O header da controladora inclui cada um dosarquivos de header dos drivers conhecidos emtempo de execução.● Uma lista com as funções é montadajuntamente com um enumerado descritivodesta mesma lista.Controladora de Drivers
  12. 12. #ifndef ctrdrv_h#define ctrdrv_h#define QNTD_DRV 20char initCtrDrv(void);char callDriver(char drv_id, char func_id, void*parameters);char initDriver(char newDriver);// Drivers conhecidos estáticamenteenum {DRV_END /*DRV_END must always be the last*/};static ptrGetDrv drvGetFunc[DRV_END] = {};#endif // ctrdrv_hControladora de Drivers
  13. 13. //ddCtr.h#include "drvGenerico.h"#include "drvInterrupt.h"#include "drvTimer.h"enum {DRV_GEN, /*1st driver*/DRV_INTERRUPT, /*2nd driver*/DRV_TIMER, /*3rd driver*/DRV_END /*DRV_END must always be the last*/};//the functions to get the drivers should be put inthe same order as in the enumstatic ptrGetDrv drvGetFunc[DRV_END] = {getGenericoDriver, /*1st driver*/getInterruptDriver, /*2nd driver*/getTimerDriver /*3rd driver*/};Controladora de Drivers
  14. 14. char callDriver(char drv_id,char func_id,void *param) {char i;for (i = 0; i < dLoaded; i++) {//find the right driverif (drv_id == drivers[i]->drv_id) {returndrivers[i]->func[func_id].func_ptr(param);}}return DRV_FUNC_NOT_FOUND;}Controladora de Drivers
  15. 15. void main(void) {//Atualizar kernelInit para inicializar a CtrkernelInit();initDriver(DRV_LCD);callDriver(DRV_LCD, LCD_CHAR, U);callDriver(DRV_LCD, LCD_CHAR, N);callDriver(DRV_LCD, LCD_CHAR, I);callDriver(DRV_LCD, LCD_CHAR, F);callDriver(DRV_LCD, LCD_CHAR, E);callDriver(DRV_LCD, LCD_CHAR, I);callDriver(DRV_LCD, LCD_CHAR, @);callDriver(DRV_LCD, LCD_CHAR, 0);callDriver(DRV_LCD, LCD_CHAR, 4);callDriver(DRV_LCD, LCD_CHAR, 8);}Controladora de Drivers
  16. 16. Exercício● Montar um relógiocom o LCDutilizando acontroladora paraacesso ao driver.
  17. 17. Controladora de DriversCamada de Abstração de InterrupçõesInterrupt Abstract Layer - IAL
  18. 18. Interrupt Abstract Layer - IAL● Um tipo de hardware comum a quase todomicrocontrolador é o dispositivo deinterrupção.● Este dispositivo pausa o processadorquando há uma chamada de interrupção.● Em seguida ele verifica qual a fonte dachamada e, após salvar as variáveis daCPU na stack, começa a executar de umendereço pré-definido.
  19. 19. Interrupt Abstract Layer - IAL● Com o intuito de simplificar este dispositivodo ponto de vista do software é comumcriar um driver para realizar a gestão deste.● Este driver receberá o endereço de funçõesque serão executadas quando umadeterminada interrupção acontecer.● É necessário uma função para receber oendereço e uma variável para armazená-lointernamente
  20. 20. Interrupt Abstract Layer - IAL//drvInterrupt.c//define o ponteiro de função a ser chamado//na interrupçãotypedef void (*intFunc)(void);//variável para armazenar o endereço da função//a ser executada na interrupçãostatic intFunc thisInterrupt;//setup da função de interrupçãochar setInterruptFunc(void *parameters) {thisInterrupt = (intFunc) parameters;return SUCESS;}
  21. 21. Interrupt Abstract Layer - IAL● A função para execução da interrupção édependente do compilador e doprocessador utilizado. Deste modo a funçãodeve ser customizada para cada aplicação.● Seguem-se três exemplos deimplementação.
  22. 22. Interrupt Abstract Layer - IAL//mc9s12 + Codewarriortypedef void (*near tIsrFunc)(void);static const tIsrFunc _InterruptVectorTable[] @0xFFF0={isrVrti};void interrupt isrVrti (void){thisInterrupt();}//pic18f4550 + SDCCvoid isr(void) interrupt 1 {thisInterrupt();}//pic18f4550 + C18void isr (void){thisInterrupt();}#pragma code highvector=0x08void highvector(void){_asm goto isr _endasm}#pragma code
  23. 23. Interrupt Abstract Layer - IAL● A IAL facilita o uso das interrupções porparte do programador, bastando apenas 3passos● O driver desejado é inicializado.● O driver de interrupção é inicializado● A função desejada é configurada
  24. 24. Interrupt Abstract Layer - IAL//Função desejada para rodar na interrupção do timervoid timerISR(void) {callDriver(DRV_TIMER, TMR_RESET, 1000);kernelClock();}void main (void){kernelInit();//inicializando e configurando o timerinitDriver(DRV_TIMER);callDriver(DRV_TIMER, TMR_START, 0);callDriver(DRV_TIMER, TMR_INT_EN, 0);//inicializando e configurando a interrupçãoinitDriver(DRV_INTERRUPT);callDriver(DRV_INTERRUPT, INT_ENABLE, 0);//configurando a rotina a ser chamadacallDriver(DRV_INTERRUPT, INT_TIMER_SET, (void*)timerISR);kernelLoop();}
  25. 25. Controladora de DriversCallback para drivers
  26. 26. Callback● Funções de callback lembram os eventosnas linugagens de alto nível● Quando o mouse clicar no botão Y execute X● Quando a tecla “t” for pressionada execute Z● Para isso é necessário que o hardware sejacapaz de iniciar uma interrupção
  27. 27. Controladora de Drivers● No processo do callback existem duaspartes separadas que devem serexecutadas sequencialmente.● A primeira é o código que é executado dentroda interrupção. Ele deve ser rápido e utilizarpoucos recursos. Geralmente são apenassalvos os dados ou informações geradas pelainterrupção e seu processamento é postergadoneste momento● A segunda é o processo de callback, rodadoagora pelo kernel pode levar mais tempo sematrapalhar a temporização do sistema.
  28. 28. Callback:Process A :Driver:InterruptLayerISRsetup(isrPtr)DataRequest(&callback)HW interruptisrPtr():KernelkernelAddProc(&callback)KernelLoop:ProcessA()KernelLoop:callback()
  29. 29. Callback//********** Excerpt from drvAdc.c **********// called from setup time to enable ADC interrupt// and setup ADC ISR callbackchar enableAdcInterrup(void* parameters){callDriver(DRV_INTERRUPT,INT_ADC_SET,(void*)adcISR);BitClr(PIR1,6);return FIM_OK;}//********** Excerpt from drvInterrupt.c **********// store the pointer to the interrupt functiontypedef void (*intFunc)(void);static intFunc adcInterrupt;// function to set ADC ISR callback for latter usechar setAdcInt(void *parameters) {adcInterrupt = (intFunc)parameters;return FIM_OK;}
  30. 30. Callback//********** Excerpt from main.c **********// Process called by the kernelchar adc_func(void) {//creating callback processstatic process proc_adc_callback = {adc_callback, 0, 0};callDriver(DRV_ADC,ADC_START,&proc_adc_callback);return REPEAT;}//********** Excerpt from drvAdc.c **********//function called by the process adc_func (via drv controller)char startConversion(void* parameters){callBack = parameters;ADCON0 |= 0b00000010; //start conversionreturn SUCCESS;}
  31. 31. Callback//********** Excerpt from drvInterrupt.c **********//interrupt functionvoid isr(void) interrupt 1 {if (BitTst(INTCON, 2)) { //Timer overflow}if (BitTst(PIR1, 6)) { //ADC conversion finished//calling ISR callback storedadcInterrupt();}}//********** Excerpt from drvAdc.c **********//ADC ISR callback functionvoid adcISR(void){value = ADRESH;value <<= 8;value += ADRESL;BitClr(PIR1,6);kernelAddProc(callBack);}
  32. 32. Callback//********** Excerpt from main.c **********//callback function started from the kernelchar adc_callback(void) {unsigned int resp;//getting the converted valuecallDriver(DRV_ADC,ADC_LAST_VALUE,&resp);//changing line and printing on LCDcallDriver(DRV_LCD,LCD_LINE,1);callDriver(DRV_LCD,LCD_INTEGER,resp);return SUCCESS;}

×