Buscar

4 registradores excecoes

Prévia do material em texto

1César Ofuchi – ofuchi@utfpr.edu.br
Arquitetura Cortex-M
(Adaptado do Prof. Hugo Vieira Neto/Prof. Douglas Renaux)
César Yutaka Ofuchi
ofuchi@utfpr.edu.br
2César Ofuchi – ofuchi@utfpr.edu.br
Referências
• Joseph Yiu – The definitive
guide to the arm córtex-M3 
(second edition)
– Capítulos 3, 7 e 8
3César Ofuchi – ofuchi@utfpr.edu.br
3
Sumário
• CMSIS
• Registradores Especiais
• Memória
• Exceções
4César Ofuchi – ofuchi@utfpr.edu.br
CMSIS – Cortex Microcontroller System 
Interface Standard
5César Ofuchi – ofuchi@utfpr.edu.br
Principais Componentes
• CMSIS-CORE
– API para núcleos e periféricos Cortex-M
• CMSIS-Driver
– Drivers genéricos para interface com periféricos (pilhas de 
comunicação, sistemas de arquivos, interfaces gráficas, …)
• CMSIS-DSP
– Biblioteca de funções para processamento digital de sinais em 
ponto fixo (q7, q15 e q31) e ponto flutuante (32 bits)
• CMSIS-RTOS
– API para sistemas operacionais em tempo real
6César Ofuchi – ofuchi@utfpr.edu.br
Registradores
MSP = main SP
Kernel do S.O.
Exceções
PSP = process SP
Aplicações (threads)
PRIMASK
Desabilita interrupções
CONTROL
Seleciona modo
Seleciona pilha
Nível de acesso privilegiado
7César Ofuchi – ofuchi@utfpr.edu.br
SP - Stack Pointer
• Pode-se trabalhar apenas com o MSP
• O SP atual é acessado como R13 ou SP
• O SP sempre está alinhado em 32 bits 
– 2 bits menos significativos são sempre 0
– Ex. endereços múltiplos de 4
• Instruções:
– PUSH (empilha)
– POP (desempilha)
• Full descending stack
Decimal Binário
0 00000
4 00100
8 01000
12 01100
16 10000
20 10100
24 11000
28 11100
8César Ofuchi – ofuchi@utfpr.edu.br
LR - Link Register
• Acessado como R14 ou LR
• Armazena o endereço de retorno de uma 
subrotina
• Deve ser salvo antes de se chamar outra 
subrotina
9César Ofuchi – ofuchi@utfpr.edu.br
PC - Contador de Programa
• Acessado como R15 ou PC 
• PC contém endereço da instrução sendo executada
+ 2 ou +4 (dependendo do tamanho da instrução
atual)
• O endereço de uma instrução é sempre par (bit0 = 0)
• Bit0 do PC é usado para indicar modo Thumb após
reset e em algumas instruções de salto: BL e BLX
• Bit0 = 0 ARM
• Bit0 = 1 Thumb
Decimal Binário
0 0000
2 0010
4 0100
6 0110
8 1000
10César Ofuchi – ofuchi@utfpr.edu.br
Registradores Especiais
• Program Status Registers (xPSR):
– Application Program Status Register (APSR) – RW
– Interrupt Program Status Register (IPSR) – RO
– Execution Program Status Register (EPSR) – RO
• Acesso por meio de instruções específicas:
• Assembly
– MRS R0, APSR
– MSR APSR, R0
• C – apenas leitura (API CMSIS)
– __get_PSR()
– __get_IPSR()
10
11César Ofuchi – ofuchi@utfpr.edu.br
Program Status Registers (PSR)
12César Ofuchi – ofuchi@utfpr.edu.br
Interrupt Program Status Register (IPSR)
• “Exception number” é diferente de “(CMSIS) IRQ number 
16+”!
Somar 16
13César Ofuchi – ofuchi@utfpr.edu.br
Registradores Especiais - Interrupções
• Interrupt Mask Registers (Acesso somente em nível privilegiado)
– PRIMASK (1bit): usado para habilitar/desabilitar todas as 
interrupções e exceções (exceto NMI e Hard Fault)
– FAULTMASK(1bit): usado para habilitar/desabilitar exceções de falta
– BASEPRI(8 bits): define o mascaramento de interrupções abaixo de 
um limiar de prioridade
• Acesso pelas Instruções MRS, MSR e Change Processor State 
CPSE e CPSD (Enable e Disable) I (Interrupt) ou F (Fault)
Exemplo MSR: Escreve 1 em PRIMASK para desabilitar TODAS as interrupções
MOV R0, #1
MSR PRIMASK, R0
Exemplo CPSE e CPSD: Enable/Disable das interrupções
CPSIE I //Clear Primask (Enable interrupts and configurable fault handlers)
CPSID F // Set PRIMASK (Disable interrupts and ALL Fault Handlers)
Funções CMSIS em C
__disable_irq(); __enable_irq()
Funções CMSIS em C
__set_PRIMASK(1) e __get_PRIMASK()
14César Ofuchi – ofuchi@utfpr.edu.br
Registradores Especiais - Interrupções
• BASEPRI define um limiar de prioridade para 
execução de interrupções
Exemplo Assembly
MOV R0, #0x60 //não executa IRQ acima de 0x60
MSR BASEPRI, R0
Funções CMSIS em C
__set_BASEPRI(uint32_t)
uint32_t __get_BASEPRI()
15César Ofuchi – ofuchi@utfpr.edu.br
Registradores Especiais – CONTROL
• CONTROL
– Bit 1: define o ponteiro de pilha (0:MSP ou 1:PSP)
– Bit 0: define o nível de acesso (0: Privilegiado ou 1: Não
Privilegiado)
• O bit 0 possui acesso de escrita apenas em nível privilegiado
– uma vez em nível usuário, a única forma de retornar ao
nível privilegiado é por meio de uma interrupção.
• Acesso pelas instruções MRS e MSR
– Usar instrução ISB após a instrução MSR para garantir uso
imediato da nova pilha
Funções CMSIS em C
void __set_CONTROL(uint32_t) 
uint32_t __get_CONTROL()
__set_PSP/MSP(uint32_t)
uint32_t __get_PSP/MSP()
Ex: __set_CONTROL(0x0);
__ISB();
Valor Bit 1 Bit 0 Status
0x0 0 0 Priv. MSP
0x1 0 1 Não priv. MSP
0x2 1 0 Priv. PSP
0x3 1 1 Não Priv. PSP
16César Ofuchi – ofuchi@utfpr.edu.br
Exercícios (Anotar e apresentar)
Utilizando o kit LPC Xpresso + placa base e o workspace “Código
Exemplo da placa”, recompilar e iniciar a depuração do projeto
“oled_periph”.
• Com o depurador parado no início da função main, verifique:
– Qual stack pointer esta sendo usado?
– No modo disassembly veja como os endereços de instrução
estão espaçados
– Adicione o código asm("MOV R0,PC"); e verifique se o endereço
da instrução PC no depurador é o mesmo de R0. 
• Faça um step into na função SystemCoreClockUpdate()
– Qual o valor de LR na saída da função? 
– Qual o valor do próximo endereço de instrução no programa
main? É o mesmo que o LR apontou anteriormente?
• Coloque um breakpoint no corpo da função SysTick_Handler e 
execute até parar nele:
– Qual Stack Pointer é usado? 
– Qual a situação do Registrador CONTROL?
– Qual o valor de LR ? Há uma instrução válida neste endereço ?
17César Ofuchi – ofuchi@utfpr.edu.br
Modos, Privilégios e Pilhas
Handler
Thread
Exemplos
SysTick_Handler
ADC_IRQHandler
TIMER16_0_IRQHandler
Stack: MSP
Privilégio: Priv.
Stack: MSP ou PSP
Privilégio: Priv. Ou 
Não Priv.
Exceções
Código “Normal”
CONTROL [1] - Stack
CONTROL [0] - Privilégio
18César Ofuchi – ofuchi@utfpr.edu.br
Modos, Privilégios e Pilhas
• Thread Mode / Handler Mode
– Modo Thread: execução normal de aplicações
– Modo Handler: exceções ou interrupções
• Operação privilegiada / não privilegiada
– Modo Thread: pode ser privilegiada ou não
– Modo Handler: sempre privilegiada
• Main Stack / Process Stack
– Ambas as pilhas possuem seu próprio ponteiro
– Exceções sempre utilizam MSP em modo Handler
– Aplicações (modo Thread) utilizam MSP ou PSP
19César Ofuchi – ofuchi@utfpr.edu.br
Privilégios
• No nível Privilegiado o código tem acesso a 
TODOS os recursos.
• No nível Não Privilegiado o código NÃO tem 
acesso a:
– Instruções como CPS que permitiriam alterar FAULTMASK 
e PRIMASK
– A maioria dos registradores do System Control Block, 
SysTick, NVIC
20César Ofuchi – ofuchi@utfpr.edu.br
Exemplo 1
Stack: MSP
Privilégio: Priv.
Stack: MSP 
Privilégio: Priv. 
Ex: __set_CONTROL(0x0);
__ISB();
Valor Bit 1 Bit 0 Status
0x0 0 0 Priv. MSP
0x1 0 1 Não priv. MSP
0x2 1 0 Priv. PSP
0x3 1 1 Não Priv. PSP
Handler
Thread
Exceções
Código “Normal”
μC 
convencional
21César Ofuchi – ofuchi@utfpr.edu.br
Exemplo 2
Stack: MSP
Privilégio: Priv.
Stack: PSP
Privilégio: Priv. 
Ex: __set_CONTROL(0x2);
__ISB();
Valor Bit 1 Bit 0 Status
0x0 0 0 Priv. MSP
0x1 0 1 Não priv. MSP
0x2 1 0 Priv. PSP
0x3 1 1 Não Priv. PSPHandler
Thread
Exceções
Código “Normal”
Ex: Proteção para Stack
do Sistema Operacional
22César Ofuchi – ofuchi@utfpr.edu.br
Exemplo 3
Stack: MSP
Privilégio: Priv.
Stack: PSP
Privilégio: Não Priv.
Ex: __set_CONTROL(0x3);
__ISB();
Valor Bit 1 Bit 0 Status
0x0 0 0 Priv. MSP
0x1 0 1 Não priv. MSP
0x2 1 0 Priv. PSP
0x3 1 1 Não Priv. PSP
Handler
Thread
Exceções
Código “Normal”
Ex: Proteção para Stack
do Sistema Operacional
Thread não tem acesso a 
periféricos diretamente
23César Ofuchi – ofuchi@utfpr.edu.br
Modos, Privilégios e Pilhas
24César Ofuchi – ofuchi@utfpr.edu.br
Modos e Privilégios
33César Ofuchi – ofuchi@utfpr.edu.br
Exceções
34César Ofuchi – ofuchi@utfpr.edu.br
Eventos Causadores
• Exceções podem ser causadas por eventos 
internos ou externos ao processador
35César Ofuchi – ofuchi@utfpr.edu.br
Eventos Causadores->Modos
• Modo Thread após Reset
• Modo Handler após qualquer outro tipo de 
exceção
36César Ofuchi – ofuchi@utfpr.edu.br
Visão Geral Interna – Cortex-M
• NVIC (Nested Vector Interrupt Controller)
– Suporte a múltiplas fontes de interrupção (Interrupções 
externas IRQs, System Exceptions)
– Tratamento eficiente de interrupções aninhadas e
Arquitetura flexível (configuração de prioridades)
– Suporte intrínseco a RTOS (SysTick)
37César Ofuchi – ofuchi@utfpr.edu.br
Visão Geral Interna – Cortex-M
• Arquitetura de interrupções com baixa latência
• Algumas instruções com múltiplos ciclos de execução 
podem ser interrompidas 
– EX: Divisão, LDM, STM
• Entrada/saída de interrupções controlada por 
hardware
– Salvamento e restauração de contexto (STACKING) realizado 
automaticamente
– Tratamento de chegada tardia (late arriving) de interrupções 
com maior prioridade
– Tratamento de interrupções pendentes sem restauração/ 
salvamento completo de contexto (tail-chaining)
38César Ofuchi – ofuchi@utfpr.edu.br
Tipos de Exceções
• Cortex-M suporta até 255 interrupções
System
Exception (Core)
Interrupções
Externas (periféricos)
-16 -1 0 239
1 15 16 255
Exception
Number
IRQ
Number
• Primeiros 16 são System Exceptions
– CMSIS define essas interrupções como negativas
– Definidas pelo ARM Core
• Os 239 restantes são interrupção de periféricos
– Interrupções de periféricos começa em 0
– Definido pelo fabricante do chip (Ex. NXP)
Exception Number = IRQ Number + 16 
39César Ofuchi – ofuchi@utfpr.edu.br
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)
• SysTick – gerado pelo system timer
• IRQ – pedido de interrupção feito por periférico
40César Ofuchi – ofuchi@utfpr.edu.br
Tipos de Exceção por Falta
• MemManageFault: faltas no acesso a memória detectadas 
pela MPU – se desabilitada, escala para HardFault
• BusFault: outros tipos de falta no barramento de memória 
que não as do tipo MemManage
• UsageFault: faltas não relacionadas ao barramento de 
memória (ex. instrução indefinida ou estado inválido)
41César Ofuchi – ofuchi@utfpr.edu.br
Tipos de Exceção e suas propriedades
Joseph Yiu pag. 35
S
y
s
te
m
 E
x
c
e
p
ti
o
n
s
In
te
rr
u
p
ç
ã
o
 
P
o
r 
p
e
ri
fé
ri
c
o
F
ix
a
s
42César Ofuchi – ofuchi@utfpr.edu.br
Exemplo LPC13xx.h
43César Ofuchi – ofuchi@utfpr.edu.br
Estados das Exceções
• Inativo: nem pendente nem ativo
• Pendente: a exceção foi gerada, mas ainda não foi 
processada 
- (ex. pedido de interrupção de periférico)
• Ativo: o processamento da exceção foi iniciado, mas 
ainda não foi completado
- Pode haver mais de uma interrupção em 
atendimento (interrupções aninhadas – NESTED)
• Ativo e Pendente: a exceção está sendo processada 
e existe uma exceção pendente da mesma fonte
44César Ofuchi – ofuchi@utfpr.edu.br
Processo de Interrupção/Exceção
• Stacking:
– Barramento de dados 
– Salva Contexto(8 
Registradores ) na Stack
E
x
e
c
u
ç
ã
o
 e
m
 
P
a
ra
le
lo
• Vector Fetch
– Barramento de 
endereços
– Busca endereço da 
rotina (handler) na tabela 
de vetores de exceção
• Atualização de registradores (SP,LR, PC,xPSR)
– SP atualiza devido ao stacking
– IPSR atualiza para a exceção ocorrida
– PC atualiza para endereço na tabela de vetores
– LR atualiza para um número de retorno “mágico” 
EXC_RETURN
• Execução do Handler
• Unstacking/ Atualização de registradores/retorno
45César Ofuchi – ofuchi@utfpr.edu.br
Stacking
• Ocorre salvamento automático de contexto (stacking)na 
entrada, bem como recuperação automática de 
contexto (unstacking)na saída
• Porque esses registradores???
Padrão de linguagem C para chamada de função ATPCS
46César Ofuchi – ofuchi@utfpr.edu.br
Tabela de Vetores de Exceção
S
y
s
te
m
 E
x
c
e
p
ti
o
n
s
Valor para inicializar Main Stack Pointer (MSP)
Valor para inicializar Program Counter(PC)
Void SysTick_Handler(){
…
}
Void Reset_Handler(){
…
}
47César Ofuchi – ofuchi@utfpr.edu.br
Exception Handlers (Rotina de Tratamento de Excessão)
• ISR (Interrupt Service Routine)
– Rotina de Tratamento de Interrupção
para IRQ 0 até IRQ 57 (LPC13xx.h) usados em periféricos
• Fault Handler
– Rotina de Tratamento de Falta
para HardFault
• System Handler
– Rotina de Tratamento de Exceções do Sistema
para NMI, PendSV, SVC, SysTick
48César Ofuchi – ofuchi@utfpr.edu.br
Retorno de Exceções
• Ocorre quando uma instrução escreve no PC um 
dos valores de EXC_RETURN
• Instruções usadas para retorno de exceção:
– LDR PC, ...
– LDM/POP incluindo PC
– BX LR (preferencial)
49César Ofuchi – ofuchi@utfpr.edu.br
Definições Importantes
• Preempção: uma exceção de maior prioridade 
pode causar preempção de uma rotina de 
tratamento (handler) em execução
• Retorno: ocorre ao término da execução da 
rotina de tratamento (handler), caso:
– Não exista exceção pendente com prioridade suficiente para 
ser atendida
– A rotina que terminou não seja de uma exceção com 
chegada tardia (late arriving)
50César Ofuchi – ofuchi@utfpr.edu.br
Definições Importantes
• Tail-chaining (encadeamento): se ao término de 
uma handler existir uma exceção pendente apta 
a ser tratada então não se executa a sequência 
de restauração/salvamento de contexto 
(POP/PUSH)
51César Ofuchi – ofuchi@utfpr.edu.br
Definições Importantes
• Late arriving (chegada tardia): mecanismo que 
acelera preempção caso uma exceção de maior 
prioridade ocorra durante o salvamento de contexto 
(PUSH) – nesse caso a exceção de maior prioridade é 
atendida primeiro e em seguida, por tail-chaining, a 
de menor prioridade. 
IRQ1 chegou atrasado 
- mas tem maior prioridade
- Arm Cortex não faz 
stacking novamente
52César Ofuchi – ofuchi@utfpr.edu.br
Exercícios (anotar e apresentar)
Utilizando o kit LPC Xpresso + placa base e o arquivo
“example_modos_excecoes.c”, rebuild all em todos os projetos e iniciar
a depuração.
1. Ambientação com o código
-Abra o Terminal I/O (View Terminal I/O) e os Registradores
-Rode o programa e veja as mensagens
-Use o Joystick para gerar interrupções
- Coloque um breakpoint em Systick_Handler e PIOINT2_IRQHandler, 
o que acontece com a stack?? 
2. Descomente o código para registradores especiais e troque os
modos.- O que ocorre em cada modo com relação ao SP e ao LR. 
- Ocorre algum problema? Qual?
- Clique com o botão direito nas funções em C (especiais) e faça um 
comando Go ToDefinition, quais outras funções estão disponíveis?
3. Descomente o código para interrupções.
- Teste os commandos para habilitar/desabilitar interrupções vistos
em aula.

Continue navegando