NOP
Não realiza nenhuma operação
Pode ser elimininada no pipeline (i.e. pode ser executado em tempo 0)
Uso: alinhamento de código em fronteira de word ou double-word
SEV
Send Event Formato:
SEV
Informa da ocorrência de um evento
Seria usado com WFE que não existe no LPC11xx
© Prof. Dr. Douglas Renaux
SVC
Chamada ao Supervisor (S.O.) Formato
SVC #imm // 0 .. 255 Gera uma exceção do tipo SVC
A ISR pode ler o valor de #imm para identificar o serviço solicitado
WFI
Wait for Interrupt Formato:
WFI
entra em modo de baixo consumo até que:
exceção
IRQ, mesmo que mascarada por PRIMASK
solicitação de DEBUG
© Prof. Dr. Douglas Renaux
Módulo 6
Acesso à Memória
© Prof. Dr. Douglas Renaux
© Prof. Dr. Douglas Renaux
Memória – Processadores 13xx
Módulo 7
Exceções/Interrupções
© Prof. Dr. Douglas Renaux
Interrupções são uma forma eficiente de se responder às demandas solicitadas pelos periféricos.
Alternativa é polling:
desperdício de consultas
atendimento mais demorado
Interrupções
Estrutura típica de Interrupção
217
Microprocessor Core
(e.g Cortex-M)
Interrupt Controller
Peripheral 1
P2 P3 P4
Pn
IRQ
Interrupções
Princípio de funcionamento
durante a execução de um programa, um sinal de hardware (IRQ = Interrupt Request) é ativado.
um controlador de interrupções percebe o sinal, verifica se está habilitado (desmascarado) e sua prioridade e então informa o processador da existência de um pedido de interrupção pendente
o processador verifica se as interrupções estão habilitadas e finaliza a execução da instrução corrente
SALVAMENTO DE CONTEXTO (registradores, palavra de status)
[em alguns casos] - muda o ponteiro de pilha para IRQ_STACK
busca no vetor de interrupção: identifica quem é a rotina responsável pelo atendimento daquela interrupção específica
execução da ISR (parte do salvamento de contexto pode ser feito aqui)
Interrupções
É um processo complexo
Qualquer falha em algum passo causa uma parada total do sistema
Depuração difícil, principalmente porque é um evento assíncrono
Um programador só é realmente um programador de sistemas embarcados quando sabe trabalhar bem com o atendimento de interrupções.
Quando se usa RTOS, em geral, passa-se ao RTOS a responsabilidade de tratar as IRQs.
219
Controlador de Interrupção
Em geral são vetorizados:
detectam automaticamente qual dos pedidos de interrupção ativo é o mais prioritário, consultam a tabela de endereços de ISR (vetor de
interrupção) e entregam ao processador o endereço da ISR.
portanto, a CPU só precisa ler o endereço da ISR e executar a partir dali
Desabilitando o Atendimento de IRQs
Também chamado de mascaramento de IRQs No controlador de interrupções é possível
mascarar / desmascarar IRQs específicas:
p.ex. mascarar apenas a IRQ da UART2
No processador é possível
mascarar / desmascarar o atendimento de interrupções por completo.
221
Teste e Depuração
Teste e Depuração de ISRs é uma atividade complexa.
Quando finalmente se consegue atender à primeira interrupção:
o teste NÃO acaba aqui !!!
atender a segunda IRQ do mesmo periférico também requer teste e depuração
p.ex. esquecer de enviar um EOI impede o atendimento do pedido seguinte.
Importante testar situações de stress:
Como registrar uma ISR num Cortex-M3
Basta colocar o nome da ISR na tabela de
vetores de exceção localizada no endereço 0 da memória.
233
Como registrar uma ISR num Cortex-M3
Cortex-M:
o vetor de interrupções fica na memória do processador a partir do endereço 0.
basta armazenar a tabela com os endereços das ISRs nesta região de memória.
Interrupções - Conceitos
Latência:
tempo entre o pedido de interrupção (ativação do sinal IRQ) até o início da execução da ISR:
HW: detecção, processamento no Cont. IRQ
tempo de finalização da instrução corrente
tempo que as IRQs estão desabilitadas
outras ISR em execução (aninhamento x prioridade)
no device driver
no RTOS
na aplicação
Tempo de Resposta (pior caso):
Somar:
Pior caso da Latência
Pior caso do tempo de execução da ISR.
235
Exceções
Qualquer solicitação para mudança do fluxo normal de um programa.
interrupção
detecção de falha / erro (p.ex. acesso desalinhado)
Exceções
Estados
Inativo (inactive) = não ativo nem pendente
Pendente (pending) = aguardando atendimento (p.ex. pedido de interrupção – irq – de
periférico)
Ativo (active) = em atendimento
pode haver mais de uma interrupção em
atendimento (interrupções aninhadas – nested)
Ativo e Pendente = interrupção em atendimento e outro pedido da mesma fonte está pendente
© Prof. Dr. Douglas Renaux
Tipos de Exceção
Reset – reinício da execução (modo Thread) (-3) NMI - prioridade -2
HardFault – prioridade -1
falha genérica: representa todas as classes de falhas que não foram tratadas
SVC – causada pela instrução SVC (Supervisor Call)
PendSV – solicitação de serviço (p.ex.
chaveamento de contexto)
Configurável: prioridade de 0 (default) a 3
Prioridades: valor menor significa maior prioridade
PRIMASK: pode mascarar as IRQ com prioridade configurável
© Prof. Dr. Douglas Renaux
Atendimento
Um atendimento de exceção ocorre quando:
existe uma exceção pendente com prioridade suficiente (*); e
o processador está em modo Thread; ou
a exceção pendente é de prioridade maior que a exceção sendo atendida (preempção)
(*) prioridade suficiente significa prioridade maior do que o limite estabelecido no PRIMASK
© Prof. Dr. Douglas Renaux
Atendimento (2)
Stacking – salva o estado
O SP está alinhado em double-word
se necessário pula um word antes de começar o empilhamento
Atendimento (3)
O processador lê do vector_table o endereço do handler;
LR := EXC_RETURN (ver próximo slide)
após o stacking, a execução se dá a partir do handler, a exceção passa ao status de ativa Se durante o stacking ocorreu outra exceção
de maior prioridade então esta é atendida (late-arriving exception)
© Prof. Dr. Douglas Renaux© Prof. Dr. Douglas Renaux
Atendimento (4)
Retorno de Exceção
Ocorre quando uma instrução escreve no PC um dos valores de EXC_RETURN
As instruções que podem ser usadas para retorno de exceção são POP e BX
© Prof. Dr. Douglas Renaux
Tratamento de Faltas
Todas as faltas causam HardFault
Trava se a falta ocorre no handler da NMI ou HardFault Faltas:
SVC
BKPT fora de depuração (i.e. não conectado ao IAR)
erro de acesso a memória (erro de barramento) em LD ou ST
tentativa de execução em área XN
tentativa de execução causando erro de barramento
erro de barramento em acesso ao vector_table
Hard Faults
© Prof. Dr. Douglas Renaux
Módulo 8
ATPCS
ATPCS
ARM-Thumb Procedure Call Std Passagem de parâmetros:
- primeiros parâmetros em R0 .. R3 demais parâmetros pela pilha
- retorno: R0 ou R1:R0
© Prof. Dr. Douglas Renaux
ATPCS – Tipos de Dados
Tipo Tamanho Tipo Tamanho
char 8 bits [ ] 32 bits
short 16 bits struct ptr = 32 bits
int 32 bits float 32 bits
unsigned 32 bits double 64 bits
long 32 bits enum = int
long long 64 bits
* 32 bits
ATPCS
Quem tem a obrigação de salvar o valor dos registradores caso interesse manter este valor após a chamada de uma função ?
- rotina chamada: deve salvar R4 – R11 antes de alterar
- R0 – R3,R12 podem ser livremente utilizados pela rotina chamada
© Prof. Dr. Douglas Renaux
Código de Entrada e Saída de Função
PUSH {R4-R7,LR}
…
POP {R4-R7,LR}
MOV PC,LR
PUSH {R4-R7,LR}
Exercício – continuação MDC
2) Como transformar em subrotina ?
3) Como chamar a partir de outra rotina em assembly ?
4) Como chamar a partir de uma função em C ?
© Prof. Dr. Douglas Renaux
Exercício de Alinhamento
C:
struct s { char a;
short b;
char c;
int d;
© Prof. Dr. Douglas Renaux
Alinhamento Assembly (n) 0 1 2 3
C: #pragma pack(n) 1 2 4 8
bytes bits
1 8 bool
char X 1 X 1 X 1 X 1
2 16 short X 1 X 2 X 2 X 2
4 32
int
unsigned long
* float
X 1 X 2 X 4 X 4
8 64 long long
double X 1 X 2 X 4 X 8
x1 - objeto armazenado em qualquer endereço
x2 - objeto armazenado em endereços pares
x4 - objeto armazenado em endereços múltiplos de 4
x8 - objeto armazenado em endereço múltiplo de 8
Prova – questão 2
Janela de registradores Janela de memória
Janela de watch / variáveis
Janela de stack ? / janela de memória na região stack
Prova – questão 3
Formas:
1. LR tem um código especial começando por 0xFFFFFFF_
2. Modo do processador:
handler (ver IPSR)
main stack (CONTROL) privilegiado (CONTROL)
© Prof. Dr. Douglas Renaux
Prova – Questão 4
DRAM – RAM dinâmica – requer refresh periódico 1 bit = 1 cap+1 tr
acesso: end_linha+ RAS + precarga bit_lines end_coluna+CAS
RD/WR
leitura é destrutiva: reescrever todos os capacitores da linha após leitura
SDRAM = DRAM com sinal de clock acesso = clk + RAS + end linha
Prova – Questão 4
SRAM – RAM estática – não requer refresh mais rápida
1 bit = 6 transistores
operação muito simples,
acesso: endereços, CS, RD/WR
leitura: dados disponíveis no final do ciclo
escrita: dados devem ser enviados no início do ciclo DRAM – RAM dinâmica – requer refresh periódico
1 bit = 1 cap+1 tr
acesso: end_linha+ RAS + precarga bit_lines end_coluna+CAS
RD/WR
leitura é destrutiva: reescrever todos os capacitores da linha após leitura© Prof. Dr. Douglas Renaux
Prova 2015 - Questão 1
PUBLIC bcd
SECTION .text : CODE (2) THUMB
#define R2_acc1 R2
#define R3_acc2 R3
#define R4_ten R4
#define R5_mult R5
#define R12_digit R12 bcd:
push {R4_ten, R5_mult}
mov R4_ten,#10 mov R5_mult,#10 and R2_acc1,R0,#0xF
op2:
mov R5_mult,#10 and R3_acc2,R1,#0xF next_dig2:
lsrs R1,R1,#4 beq end
and R12_digit,R1,#0xF
mla R3_acc2,R12_digit,R5_mult,R3_acc2 mul R5_mult,R5_mult,R4_ten
b next_dig2 end:
mul R0,R2_acc1,R3_acc2 pop {R4_ten, R5_mult}
BX LR
CLK CLK
CLK
CLK
Questão 3
Atendimento (4)
© Prof. Dr. Douglas Renaux
Estudo do problema Planejar
algoritmo
alocação de memória alocação de variáveis escrever código
Projeto PWM
Objetivo:
Usar um timer do LPC1343 para gerar um sinal PWM de ciclo de trabalho (duty cycle)
variável. Uma vez filtrado este sinal deve produzir uma onda senoidal.
Requisitos:
Freq onda senoidal: 50 a 1000 Hz
Número de amostras por ciclo: >= 32
Resolução das amostras: >= 256 (8 bits)
© Prof. Dr. Douglas Renaux
PWM
© Prof. Dr. Douglas Renaux
FPB e Amplificador
© Prof. Dr. Douglas Renaux