1 / 28

Engenharia de Sistemas Embarcados 2006.2

Engenharia de Sistemas Embarcados 2006.2. Aula 5: Técnicas Especiais de Software. Agenda. Como manipular o hardware usando C Alguns algoritmos para sistemas embarcados UML para sistemas embarcados. Manipulando o Hardware.

kirk-snider
Download Presentation

Engenharia de Sistemas Embarcados 2006.2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Engenharia de Sistemas Embarcados 2006.2 Aula 5: Técnicas Especiais de Software

  2. Agenda • Como manipular o hardware usando C • Alguns algoritmos para sistemas embarcados • UML para sistemas embarcados Engenharia de Sistemas Embarcados

  3. Manipulando o Hardware • Software de sistema embarcado  manipulação de dispositivo periférico • Dependência da arquitetura • Dispositivo mapeado em porta • Dispositivo mapeado em memória • Dispositivo mapeado em porta • Alternativa  escrever código em assembly para manipulação das portas • Compilador C não possui noção intrínseca de portas • Dispositivo mapeado em memória • Pode ser manipulado por código C Engenharia de Sistemas Embarcados

  4. Escreve código assembly em funções C Operação simples Fortemente dependente do compilador Pouco portável Deve-se verificar a documentação do compilador Boa prática Agrupar funções com código in-line assembly em arquivos separados para não contaminar o resto do código int read_reg() { asm(“in acc, 0x42”); } void write_reg(int newval) { asm (“ mov acc, newval out 0x42 “); } In-line Assembly Engenharia de Sistemas Embarcados

  5. Leitura e escrita de um registrador de dispositivo localizado no endereço 0x42 Função read_reg assume que valor de retorno está no acumulador Varia de compilador para compilador Função write_reg assume que compilador traduzirá referência para newval em uma referência para a pilha int read_reg() { asm(“in acc, 0x42”); } void write_reg(int newval) { asm (“ mov acc, newval out 0x42 “); } In-line Assembly Engenharia de Sistemas Embarcados

  6. In-line Assembly • Alguns compiladores não dão suporte a in-line assembly • Código assembly deve ser escrito separadamente • Código assembly deve linkado ao resto do programa • Programação mais complexa pois o programador deve saber as convenções utilizadas pelo compilador para frames da pilha • Sugestão  criar template a partir de uma função falsa (fake) int read_reg_fake() { return 0x7531; } Engenharia de Sistemas Embarcados

  7. Acesso Mapeado em Memória • Modos para manipulação de memória • Baseado no linker • Baseado em ponteiro • Manipulação de memória baseado no linker • Utiliza qualificador extern para informar ao compilador que o programa utilizará um recurso definido fora do programa C Source file extern volatile int device_register; LINKER FILE PUBLIC _device_register = $40000000 Engenharia de Sistemas Embarcados

  8. Manipulação de Memória Baseada em Ponteiro • Utilização de ponteiros em C • Utilizar casting para forçar um ponteiro para apontar para um endereço específico de memória Exemplo de ASIC mapeado para o endereço 0x40000000 C Source file unsigner short x; //Variável local volatile unsigner short *io_regs; //Ponteiro para ASIC io_regs = (unsigner short* ) 0x40000000; //Aponta para o ASIC x = io_regs[10]; //Lê registrador 10 Engenharia de Sistemas Embarcados

  9. Operações com Bits • Programas embarcados normalmente realizam operações de manipulação de bits em registradores de dispositivos • Maneira tradicional • Leitura do registrador • Manipular bits correspondentes • Escrever valor atualizado no registrador const char status_mask = 0x04; extern volatile char device_register; device_register = device_register | status_mask; //força o 3o. bit da direita para 1 device_register = device_register & (~status_mask); //força o 3o. bit da direita para 0 device_register = device_register ^ status_mask; //inverte o estado do 3o. bit da direita Engenharia de Sistemas Embarcados

  10. Operações com Bits const char status_mask = 0x04; extern volatile char device_register; device_register = device_register | status_mask; //força o 3o. bit da direita para 1 device_register = device_register & (~status_mask); //força o 3o. bit da direita para 0 device_register = device_register ^ status_mask; //inverte o estado do 3o. bit da direita Versão simplificada device_register |= status_mask; device_register &= (~status_mask); device_register ^= status_mask; Engenharia de Sistemas Embarcados

  11. Operações com Bits • Ler/modificar/escrever funciona na maioria dos casos • Leitura de registrador pode ocasionar efeitos indesejáveis • Ex: limpar flag de uma interrupção pendente • Utilização de um shadow register (registrador sombra) • Variável utilizada para manter-se a par do conteúdo do registrador • Passos para mudança de bit utilizando-se shadow register • Ler o registrador sombra • Modificar o registrador sombra • Salvar o registrador sombra • Escrever o novo valor para o dispositivo Engenharia de Sistemas Embarcados

  12. Operações com Bits • Utilização de registrado sombra #define STATUS_MASK 0x04 int shadow; device_register = (shadow |= STATUS_MASK); Engenharia de Sistemas Embarcados

  13. Código otimizado compilador a = 0 Compilador otimiza o código a == 1 S N ... Modificador de Classe de Armazenamento Volatile Código fonte Engenharia de Sistemas Embarcados

  14. Modificador de Classe de Armazenamento Volatile Engenharia de Sistemas Embarcados

  15. Velocidade e Densidade de Código Engenharia de Sistemas Embarcados

  16. Interrupções e Rotinas de Serviço de Interrupção (ISRs) • Objetivo: maior eficiência no uso do processador • Evitar que a CPU gaste ciclos para verificação da ocorrência de eventos assíncronos • ISR (Interrupt Service Routine) • Pedaço simples de código • Dispositivo externo ao núcleo da CPU sinaliza uma interrução Engenharia de Sistemas Embarcados

  17. Interrupções e Rotinas de Serviço de Interrupção (ISRs) • Ciclo de resposta de uma ISR • Coloca endereço da próxima instrução no topo da pilha • Pega o endereço do vetor da ISR na memória para executar a próxima instrução • Decide quando desabilitar e reabilitar outras interrupções • Salvar o estado de qualquer recursos internos (registradores) utilizados na ISR • Determinar que dispositivo está causando a interrupção (especialmente com interrupções compartilhadas) • Executar o código da ISR • Resetar dispositivos geradores de interrupções externos, se necessário • Restaurar o estado do sistema • Habilitar interrupções • Retornar da interrupção Engenharia de Sistemas Embarcados

  18. Polling ou Interrupção? Do Uso de Laços de Polling para Baseado em Interrupção inicializar Verifica sensor 1 Sensor ativado S alarme Verifica sensor 1 Sensor ativado S alarme Engenharia de Sistemas Embarcados

  19. Interrupções Aninhadas e Reentrância • Interrupções com prioridades diferentes • Interrupção de mais alta prioridade pode preemptar interrupção de mais baixa prioridade • Sistemas simples desabilitam todas as interrupções assim que o programa responde a uma interrupção • Ao final rotina de interrupção reabilita as interrupções • Sistemas complexos • Permite aninhamento de interrupções • Função chamadas durante o tempo em que a interrupção está sendo executada são chamadas de funções reentrantes • Função reentrante • Função que pode ser chamada assincronamente a partir de múltiplos threads sem se preocupar com sincronização ou acesso mútuo Engenharia de Sistemas Embarcados

  20. Regras para determinação de função reentrante • Uma função reentrante não pode utilizar variáveis de modo não atômico a menos que sejam armazenadas na pilha da tarefa que chamou a função ou são variáveis privadas da tarefa • Código atômico é aquele que não pode ser interrompido • Uma função reentrante não pode chamar outras funções que não sejam reentrantes • Uma função reentrante não pode utilizar o hardware de modo não atômico Engenharia de Sistemas Embarcados

  21. Uso de ISR com Funções não Reentrantes • Interrupção modifica dados que estão sendo utilizados por outra tarefa de maneira assíncrona • Aparecimento de bugs de sincronização • Aparecimento de bugs de acesso mútuo • Exemplo • Relógio de tempo real altera a estrutura de dados de relógio do sistema a cada segundo • Rotina lê metade dos dados do relógio do sistema e é interrompida pelo relógio de tempo real • Resultado  rotina lê metade dos dados antigos e metade dos dados atualizados Engenharia de Sistemas Embarcados

  22. Medindo o Tempo de Execução • Sistemas embarcados de tempo real • Desempenho é tão crítico quanto funcionalidade • Utilização de ferramentas para medição precisa de tempo de execução de rotinas do programa • Também aplicável a rotinas de interrupção Engenharia de Sistemas Embarcados

  23. Watchdog Timers • Responsável por levar o sistema a um estado de execução normal quando este se perde • Watchdog é normalmente ligado ao RESET ou a uma interrupção não mascarável • Boas práticas de utilização de watchdog • Realizar verificação de sanidade do sistema • Profundidade da pilha • Número de buffers alocados • Estado de componentes mecânicos do sistema • Utilização de flags de verificação em vários pontos do código Engenharia de Sistemas Embarcados

  24. Watchdog Timer: Debugando o Sistema Alvo • Watchdog timer executa independente do sistema • O que acontece se o usuário para a execução do programa? • Isto acontece durante o debug do programa? • Qual a conseqüência? • Utilizar mecanismo para desabilitar o watchdog timer para debug • Exemplo: utilização de compilação condicional (#if DEBUG) • Isolar trechos de código que contém as rotinas de temporização Engenharia de Sistemas Embarcados

  25. Memória Flash • Facilita upgrade de software • Ajuste de código e parâmetros enquanto o sistema está ativo • Código deve ser auto-modificável • Deve ser capaz de uma falha de maneira que não se torne inoperável • Estratégias para viabilizar uso inteligente de memória flash • Programador embarcado e microprogramador Engenharia de Sistemas Embarcados

  26. Programador Embarcado • Código que é parte do firmware que acompanha o produto • Vantagens • Implementação direta • Não precisa de programas de suporte sofisticados • Desvantagens • Deve estar disponível desde o primeiro release do produto • Utiliza recursos de RAM e ROM • Falta de flexibilidade Engenharia de Sistemas Embarcados

  27. Microprogramador • Abordagem é ter apenas o código mínimo (boot loader) necessário para o download do algorítmo da memória flash (microprogramador) e a nova imagem do software • Vantagens • Flexibilidade • Pouco overhead de ROM devido ao boot loader • Desvantagens • Mais difícil de implementar • Utilização de programas de suporte mais inteligentes Engenharia de Sistemas Embarcados

  28. Sugestões para o Projeto do Algorítmo da Flash • Programa de boot loader que executa durante power up • Inicializa o sistema de forma rudimentar • Disponibiliza RAM e E/S • Sistema pergunta ao usuário se deve baixar o programa normal ou o algoritmo de reprogramação da flash • O código real da aplicação que pode ser reprogramado pelo algoritmo de reprogramação da flash • Um algoritmo de reprogramação residente em RAM que realiza de fato a reprogramação do dispositivo • Código é movido da flash para a RAM quando a opção de reprogramação é escolhida Engenharia de Sistemas Embarcados

More Related