Você está na página 1de 62

Interrupções e modos

de baixo consumo
Agenda
• Funções & Interrupções
• Modos de baixo consumo
Funções e sub-rotinas
• Quebrar o código em funções?
• Código repetitivo  função
• Abstrai detalhes [ ex. print_info(device) ]
• Facilita a leitura do código

• Boas práticas levam a


• Testabilidade
• Confiabilidade
• Fácil manutenção
Funções e sub-rotinas
• O que acontece quando chamamos uma função?

Prólogo

subrotina

Epílogo

Retorno
Funções e sub-rotinas
• O que acontece quando chamamos uma função?
• Troca de contexto
• Passagem de parâmetros (R12-R15)
• PC é salvo na pilha Prólogo

• R4-R11 (usados) salvos na pilha


subrotina

Epílogo

Retorno
Funções e sub-rotinas
• O que acontece quando chamamos uma função?
• Troca de contexto
• Passagem de parâmetros (R12-R15)
• PC é salvo na pilha Prólogo

• R4-R11 (usados) salvos na pilha


• Função executa subrotina

Epílogo

Retorno
Funções e sub-rotinas
• O que acontece quando chamamos uma função?
• Troca de contexto
• Passagem de parâmetros (R12-R15)
• PC é salvo na pilha Prólogo

• R4-R11 (usados) salvos na pilha


• Função executa subrotina

• Restaura valores
R4-R11 (usados) Epílogo

Retorno
Funções e sub-rotinas
• O que acontece quando chamamos uma função?
• Troca de contexto
• Passagem de parâmetros (R12-R15)
• PC é salvo na pilha Prólogo

• R4-R11 (usados) salvos na pilha


• Função executa subrotina

• Restaura valores
R4-R11 (usados) Epílogo
• Retorna (R12 ou pilha)
Retorno
Flash Programa 4 x 02.43.FF
(código) 32KB 00.44.00
RAM Variáveis 4 x 00.43.FF
2KB 00.24.00
RAM USB 1 x 00.23.FF
2KB 00.1C.00
Espaço vazio/TLV tag-length-value 1 x 00.1B.FF
(TLV) structure* 512B 00.1A.00
Flash: Information 4 x 00.19.FF
Memory 128B 00.18.00
Flash: Bootstrap Loader 4 x 00.17.FF
(BSL) 512B 00.10.00
Hardware Periféricos 1 x 00.0F.FF
4KB 00.00.00
0x10000 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6
0x043F8 Memória Flash
0x043FA 0x10000 mov #0x4400,SP
0x043FC 0x10002 mov #vetor,R6
0x043FE 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x10004 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6
0x043F8 Memória Flash
0x043FA 0x10000 mov #0x4400,SP
0x043FC 0x10002 mov #vetor,R6
0x043FE 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x10004 R0 : PC (20-bits)

0x043FC R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6
0x043F8 Memória Flash
0x043FA 0x10000 mov #0x4400,SP
0x043FC 0006 (PC_L+2) 0x10002 mov #vetor,R6
0x043FE 0001 (PC_H) 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x12044 R0 : PC (20-bits)

0x043FC R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6
0x043F8 Memória Flash
0x043FA 0x10000 mov #0x4400,SP
0x043FC 0006 (PC_L+2) 0x10002 mov #vetor,R6
0x043FE 0001 (PC_H) 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x120xx R0 : PC (20-bits)

0x043FC R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6
0x043F8 Memória Flash
0x043FA 0x10000 mov #0x4400,SP
0x043FC 0006 (PC_L+2) 0x10002 mov #vetor,R6
0x043FE 0001 (PC_H) 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x120xx R0 : PC (20-bits)

0x043F6 R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6 Espaço
0x043F8 usado pela Memória Flash
0x043FA subrotina 0x10000 mov #0x4400,SP
0x043FC 0006 (PC_L+2) 0x10002 mov #vetor,R6
0x043FE 0001 (PC_H) 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x120xx R0 : PC (20-bits)

0x043FC R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6 Espaço
0x043F8 usado pela Memória Flash
0x043FA subrotina 0x10000 mov #0x4400,SP
0x043FC 0006 (PC_L+2) 0x10002 mov #vetor,R6
0x043FE 0001 (PC_H) 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x12056 R0 : PC (20-bits)

0x043FC R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6 Espaço
0x043F8 usado pela Memória Flash
0x043FA subrotina 0x10000 mov #0x4400,SP
0x043FC 0006 (PC_L+2) 0x10002 mov #vetor,R6
0x043FE 0001 (PC_H) 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
0x10006 R0 : PC (20-bits)

0x043FC R1 : SP (20-bits)
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|NZC R2 : SR (16-bits)

0x043F6 Espaço
0x043F8 usado pela Memória Flash
0x043FA subrotina 0x10000 mov #0x4400,SP
0x043FC 0006 (PC_L+2) 0x10002 mov #vetor,R6
0x043FE 0001 (PC_H) 0x10004 call #sumb
0x04400 xxxx 0x10006 jmp $
Pilha ...
0x12044 Rotina sumb
...
0x12056 ret
Interrupções
vs Funções
Interrupções
• Acontecem em momentos imprevisíveis
• Funções urgentes chamadas por um evento de
hardware
• Prioridade de execução > rotina main
• Chamadas não tão frequentes
Interrupções
• Flags são bits de registros específicos que indicam
que um evento ocorreu.
• Já vimos algumas flags ...

Overflow Flag
Interrupções
• Flags são bits de registros específicos que indicam
que um evento ocorreu.
• Já vimos algumas flags ...

Capture/
Compare Flag
Interrupções
• Máscaras
• GIE flag no registro de status (R2)
• ‘1’ – Ativo
• ‘0’ – Ignorado
• IE específico
Interrupções - Vetores
Interrupções - Vetores
Interrupções - Vetores
Interrupções
• Durante uma interrupção o MSP430
• Termina de executar a instrução atual
• Salva o valor do PC e SR
• Flags de interrupções não compartilhadas são limpas
automaticamente
• Flags de interrupções compartilhadas são deixadas em
‘1’ para serem tratadas por software
• SR é zerado
• Saída do modo de baixo consumo.
• Impede que outras interrupções sejam geradas (GIE = 0)
• O vetor da interrupção é carregado no PC.
Interrupções
Rotina de
0x10000 R0 : PC (20-bits)
tratamento da
interrupção
0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA Tabela de 0x0FFFF
endereços de
0x043FC 0x0FFFE RST
interrução
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
main()
0x10006 jmp $
0x10000 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10000 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10000 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU Termina o ciclo pendente
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA TIMERA0_CCR_ISR
Pilha ...
0x10000 mov #0x4400,SP
CPU Depois trata a interrupção
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
CPU Depois trata a interrupção
0x10002 add #54,R5
FCH DEC EXE 0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x04400 R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0FFFE RST
0x043FE ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x043FC R1 : SP (20-bits)
Memória Flash
V|SCG1|SCG0|OSCOFF
CPUOFF|GIE|N|Z|C R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x10002 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0000 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x04416 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0000 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x04416 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0000 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x044xx R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0000 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x04430 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0000 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x04430 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0008 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x04430 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0008 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x10004 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0008 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
0x10004 rrl R5,R6
0x10006 jmp $
0x10004 R0 : PC (20-bits)

0x043FA R1 : SP (20-bits)
Memória Flash
0x0008 R2 : SR (16-bits) 0x04416 xor #BIT1,&P1OUT
... ..
0x043F6 0x04430 reti
0x043F8 ... ...
0x043FA 0x0008 (SR) 0x0FFFF
0x043FC 0x0004 (PC_L+2) 0x0FFFE RST
0x043FE 0x0001 (PC_H) ...
0x04400 xxxx 0x0FFEA 0x04416
Pilha ...
0x10000 mov #0x4400,SP
0x10002 add #54,R5
Continua a execução de
0x10004 rrl R5,R6
onde parou
0x10006 jmp $
Interrupções
• O loop principal pode ficar ativo
ou botar a CPU em modo de
baixo consumo.
• Funcionalidades pontuais são
codificadas nas interrupções
• A rotina de interrupção deve
ser curta. Somente o essencial.
Interrupções

Copia o endereço do início


desta função para a tabela de
endereços de interrupções
(0xFFFF-0xFFD2)
Interrupções

Indica que para esta


função o compilador
deve salvar o contexto
da CPU por completo
Indica para o compilador
que “cases” não usados
podem ser ignorados
Interrupções (pragmas)

#pragma pack(push, 1) Sistemas embarcados


struct PackedStructure
{
char a;
int b; #define __attribute__(x)
short c;
};
#pragma pack(pop) // sizeof(PackedStructure) == 7

struct PackedStructure __attribute__((__packed__))


{
char a;
int b;
short c;
}; // sizeof(PackedStructure == 7) GNU way
Interrupções
provenientes do pinos
Vetores de interrupção (P1 e P2)
• Nem todos os pinos podem gerar interrupções
• Interrupções são geradas por variações nos pinos GPIO
Vetores de interrupção (P1 e P2)
• Nem todos os pinos podem gerar interrupções
• Interrupções são geradas por variações nos pinos GPIO
Vetores de interrupção (P1 e P2)
• Registros :
• PxIFG – Interrupt Flag (r/w  swi)
• PxIE – Interruption Enable
• PxIES – Interrupt Edge Select (0  rising, 1  falling)
• PxIV – Interrupt Vector
• 00h = No interrupt pending
• 02h = P1IFG.0 (Priority: Highest)
• 04h = P1IFG.1
• 06h = P1IFG.2
• 08h = P1IFG.3
• 0Ah = P1IFG.4
• 0Ch = P1IFG.5
• 0Eh = P1IFG.6
• 10h = P1IFG.7 (Priority: Lowest)

Você também pode gostar