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

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

Embed Size (px)

Citation preview

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 1device_register = device_register & (~status_mask);

//força o 3o. bit da direita para 0device_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 1device_register = device_register & (~status_mask);

//força o 3o. bit da direita para 0device_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 0x04int shadow;device_register = (shadow |= STATUS_MASK);

2006.2 Engenharia de Sistemas Embarcados 13

Modificador de Classe de Armazenamento Volatile

Códigofonte compilador Có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

S alarme

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

interrompido2. Uma função reentrante não pode chamar outras

funções que não sejam reentrantes3. 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