Engenharia de Sistemas Embarcados 2006.2Aula 5: Técnicas Especiais de Software
2006.2 Engenharia de Sistemas Embarcados 2
Agenda
• Como manipular o hardware usando C• Alguns algoritmos para sistemas embarcados• UML para sistemas embarcados
2006.2 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
2006.2 Engenharia de Sistemas Embarcados 4
In-line Assembly
• 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,
newvalout 0x42
“);}
2006.2 Engenharia de Sistemas Embarcados 5
In-line Assembly
• 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,
newvalout 0x42
“);}
2006.2 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;
}
2006.2 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 fileextern volatile int device_register;
LINKER FILEPUBLIC _device_register = $40000000
2006.2 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 fileunsigner short x; //Variável localvolatile unsigner short *io_regs; //Ponteiro para ASICio_regs = (unsigner short* ) 0x40000000; //Aponta para o ASICx = io_regs[10]; //Lê registrador 10
2006.2 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
2006.2 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
device_register |= status_mask;
device_register &= (~status_mask);
device_register ^= status_mask;
Versão simplificada
2006.2 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
2006.2 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);
2006.2 Engenharia de Sistemas Embarcados 13
Modificador de Classe de Armazenamento Volatile
Códigofonte
compiladorCódigo
otimizado
a = 0
a == 1
...
SN
Compilador otimiza o código
2006.2 Engenharia de Sistemas Embarcados 14
Modificador de Classe de Armazenamento Volatile
2006.2 Engenharia de Sistemas Embarcados 15
Velocidade e Densidade de Código
2006.2 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
2006.2 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
2006.2 Engenharia de Sistemas Embarcados 18
Do Uso de Laços de Polling para Baseado em Interrupção
inicializar
Sensorativado
S
Verifica sensor 1
Sensorativado
Verifica sensor 1
alarme
Salarme
Polling ouInterrupção?
2006.2 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
2006.2 Engenharia de Sistemas Embarcados 20
Regras para determinação de função reentrante
1. 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
2. Uma função reentrante não pode chamar outras funções que não sejam reentrantes
3. Uma função reentrante não pode utilizar o hardware de modo não atômico
2006.2 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
2006.2 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
2006.2 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
2006.2 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
2006.2 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
2006.2 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
2006.2 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
2006.2 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
Top Related