280 likes | 385 Views
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.
E N D
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 Engenharia de Sistemas Embarcados
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
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
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
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
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
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
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
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
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
Operações com Bits • Utilização de registrado sombra #define STATUS_MASK 0x04 int shadow; device_register = (shadow |= STATUS_MASK); Engenharia de Sistemas Embarcados
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
Modificador de Classe de Armazenamento Volatile Engenharia de Sistemas Embarcados
Velocidade e Densidade de Código Engenharia de Sistemas Embarcados
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
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
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
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
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
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
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
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
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
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
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
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
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