Você está na página 1de 34

Arquiteturas de sistemas embarcados

Prof.MSc.Rodrigo Maximiano Antunes de Almeida

Universidade Federal de Itajubá

rodrigomax@unifei.edu.br

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 1/1


Interrupção e Watchdog

Revisão

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 2/1


Interrupção

Acontece a Início Fim da Continua o fluxo


Interrupção da ISR ISR do programa

Programa Rotina de Programa


Principal Interrupção Principal

Latência da Latência da Tempo


Interrupção Interrupção

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 3/1


Interrupção

Quando uma interrupção é gerada, o programa é paralizado e uma


função de interrupção é executada
Conversor AD: quando o resultado da conversão estiver disponı́vel para
leitura.
Porta B: quando algum dos bits configurados como entrada altera seu
valor.
Timer 0: quando acontece overflow em seu contador

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 4/1


Interrupção

Atenção
A função que irá tratar da interrupção não retorna nem recebe nenhum
valor

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 5/1


Interrupção
1 v o i d Interrupcao ( v o i d ) interrupt 1 {
2 i f ( BitTst ( PIR1 , 0 ) ) { /* c o d i g o */ } // o v e r f l o w do TIMER1
3 i f ( BitTst ( PIR1 , 1 ) ) { /* c o d i g o */ } // comparação TIMER2 = PR2
4 i f ( BitTst ( PIR1 , 2 ) ) { /* c o d i g o */ } // comparação do CCP1
5 i f ( BitTst ( PIR1 , 3 ) ) { /* c o d i g o */ } // f i m e n v i o p o r t . p a r a l e l a
6 i f ( BitTst ( PIR1 , 4 ) ) { /* c o d i g o */ } // f i m t r a n s m i s s ã o da S e r i a l
7 i f ( BitTst ( PIR1 , 5 ) ) { /* c o d i g o */ } // r e c e p ç ã o da S e r i a l
8 i f ( BitTst ( PIR1 , 6 ) ) { /* c o d i g o */ } // f i m de c o n v e r s ã o do AD
9 i f ( BitTst ( PIR1 , 7 ) ) { /* c o d i g o */ } // l e i t u r a / e s c r i t a p a r a l e l a
10 i f ( BitTst ( PIR2 , 0 ) ) { /* c o d i g o */ } // comparação do CCP2
11 i f ( BitTst ( PIR2 , 1 ) ) { /* c o d i g o */ } // o v e r f l o w do TIMER3
12 i f ( BitTst ( PIR2 , 2 ) ) { /* c o d i g o */ } // p r o b l e m a na t e n s a o (V)
13 i f ( BitTst ( PIR2 , 3 ) ) { /* c o d i g o */ } // c o l i s ã o no b a r r a m e n t o
14 i f ( BitTst ( PIR2 , 4 ) ) { /* c o d i g o */ } // f i m e s c r i t a na f l a s h
15 i f ( BitTst ( PIR2 , 5 ) ) { /* c o d i g o */ } // i n t e r r u p ç ã o da USB
16 i f ( BitTst ( PIR2 , 6 ) ) { /* c o d i g o */ } // mudança na comparação
17 i f ( BitTst ( PIR2 , 7 ) ) { /* c o d i g o */ } // f a l h a no o s c i l a d o r
18 i f ( BitTst ( INTCON , 0 ) ) { / * c o d i g o * / } // mudança na PORTA B
19 i f ( BitTst ( INTCON , 1 ) ) { / * c o d i g o * / } // i n t e r r u p ç ã o e x t e r n a INT0
20 i f ( BitTst ( INTCON , 2 ) ) { / * c o d i g o * / } // o v e r f l o w no TIMER0
21 i f ( BitTst ( INTCON3 , 0 ) ) { / * c o d i g o * / } // i n t e r r u p ç ã o e x t e r n a INT1
22 i f ( BitTst ( INTCON3 , 1 ) ) { / * c o d i g o * / } // i n t e r r u p ç ã o e x t e r n a INT2
23 }
ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 6/1
Interrupção

1 BitClr ( RCON , 7 ) ; // d e s a b i l i t a IPEN ( modo de c o m p a t i b i l i d a d e )


2 BitSet ( PIE1 , 6 ) ; // l i g a a i n t e r r u p ç ã o p a r a o AD
3 BitSet ( PIE1 , 5 ) ; // l i g a a i n t e r r u p ç ã o p a r a a r e c e p ç ã o na s e r i a l
4 BitSet ( INTCON , 5 ) ; // l i g a a i n t e r r u p ç ã o p a r a o t i m e r 0
5 BitSet ( INTCON , 3 ) ; // l i g a a i n t e r r u p ç ã o p a r a a p o r t a B
6 BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s a s i n t e r r u p ç õ e s g l o b a i s
7 BitSet ( INTCON , 6 ) ; // h a b i l i t a t o d a s a s i n t e r r u p ç õ e s de p e r i f é r i c o s

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 7/1


Interrupção

O watchdog visa aumentar a segurança do projeto.


Funciona como um temporizador
Precisa ter seu contador constantemente reiniciado.
Caso não seja reiniciado no tempo exigido, o watchdog reinicia o
microcontrolador

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 8/1


Interrupção

1 // Watchdog c o n t r o l a d o p o r s o f t w a r e
2 code c h a r at 0 x300003 CONFIG2H = 0 x00 ;
3
4
5 #define CLRWTD ( ) _asm CLRWDT _endasm
6
7 v o i d main ( v o i d )
8 {
9 unsigned i n t i ;
10 u n s i g n e d c h a r temp ;
11 TRISD=0x00 ;
12 PORTD=0x00 ;
13 BitSet ( WDTCON , 0 ) ; // l i g a o s i s t e m a de watchdog
14 for ( ; ; )
15 {
16 PORTD++;
17 f o r ( i = 0 ; i < 1 0 0 0 0 ; i++)
18 {
19 CLRWTD ( ) ;
20 }
21 }
22 }
ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 9/1
Arquiteturas de sistemas embarcados

Arquiteturas de sistemas embarcados

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 10 / 1


Arquiteturas de sistemas embarcados

É sempre interessante definir uma arquitetura para o software


Dependendo dos requisitos do sistema pode-se usar desde uma
programação voltada apenas para a aplicação até um sistema
operacional
Dentre as técnicas mais simples serão apresentadas três alternativas
One single loop
Interrupt control system
Cooperative multitasking

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 11 / 1


One single loop

One single loop


É a estratégia utilizada até agora na disciplina
Consiste em um loop infinito dentro do qual todas as tarefas são
executadas
Apenas as rotinas de inicialização acontecem antes dele
Programação é mais simples
Dificuldade de garantir requisições temporais
Escalabilidade, reuso e manutenção prejudicados

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 12 / 1


One single loop

1 v o i d main ( v o i d )
2 {
3 // d e c l a r a ç ã o d a s v a r i á v e i s
4 int ia , ib , ic ;
5 f l o a t fa , fb , fc ;
6 // i n i c i a l i z a ç ã o d o s p e r i f é r i c o s
7 InicializaTeclado ( ) ;
8 InicializaLCD ( ) ;
9 // ú n i c o l o o p i n f i n i t o
10 for ( ; ; )
11 {
12 // chamada d a s t a r e f a s
13 ia = LerTeclas ( ) ;
14 MudaDigito ( ia , 0 ) ;
15 // tem que s e r e x e c u t a d o p e l o menos a c a d a 1 0 ( ms )
16 A tu al iz a Di sp l ay ( ) ;
17 Debo unceTecl as ( ) ;
18 }
19 }

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 13 / 1


One single loop

1 v o i d main ( v o i d )
2 {
3 // d e c l a r a ç ã o d a s v a r i á v e i s
4 int ia , ib , ic ;
5 f l o a t fa , fb , fc ;
6 // i n i c i a l i z a ç ã o d o s p e r i f é r i c o s
7 InicializaTeclado ( ) ;
8 InicializaLCD ( ) ;
9 // ú n i c o l o o p i n f i n i t o
10 for ( ; ; )
11 {
12 // chamada d a s t a r e f a s
13 ia = LerTeclas ( ) ;
14 EnviaDados ( ia ) ;
15 MudaDigito ( ia , 0 ) ;
16 // tem que s e r e x e c u t a d o p e l o menos a c a d a 1 0 ( ms )
17 A tu al iz a Di sp l ay ( ) ;
18 Debo unceTecl as ( ) ;
19 ic = RecebeSerial ( ) ;
20 // não cumpre r e q u i s i ç ã o t e m p o r a l p o r c a u s a da
21
22 fa = 2 . 0 * ic / 3 . 1 4 ;
23 EnviaSerial
ELT024 ( fa & 0 x00FF ) ; de sistemas embarcados
Arquiteturas rodrigomax@unifei.edu.br 14 / 1
Interrupt control system

Interrupt control system


Visa resolver o problema das restrições temporais
Apenas alguns sub-sistemas podem ser operados via interrupção
Os demais sistemas operam no loop principal
Facilita a expansão do sistema, já que as interrupções não dependem
do loop principal
Ótima alternativa para sistemas que tem como requisito o baixo
consumo de energia

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 15 / 1


Interrupt control system

1 // r o t i n a de tempo v i a i n t e r r u p ç ã o
2 v o i d Interrupcao ( v o i d ) interrupt 1 {
3 i f ( BitTst ( INTCON , 2 ) ) { //TIMER0 : O v e r f l o w
4 BitClr ( INTCON , 2 ) ; // l i m p a a f l a g
5 ResetaTimer ( 5 0 0 0 ) ; // 5ms
6 A tu al iz a Di sp l ay ( ) ; // tem que s e r e x e c u t a d o p e l o menos a ←-
c a d a 8 . 3 ( ms )
7 }
8 }
9 v o i d main ( v o i d ) {
10 i n t ia ;
11 InicializaTeclado ( ) ;
12 InicializaDisplay ( ) ;
13 I ni ci al i za Ti m er ( ) ;
14 // i n i c i a l i z a ç ã o da i n t e r r u p ç ã o
15 BitClr ( RCON , 7 ) ; // d e s a b i l i t a IPEN ( modo de c o m p a t i b i l i d a d e )
16 BitSet ( INTCON , 5 ) ; // l i g a a i n t e r r u p ç ã o p a r a o t i m e r 0
17 BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s a s i n t e r r u p ç õ e s g l o b a i s
18 BitSet ( INTCON , 6 ) ; // h a b i l i t a t o d a s a s i n t e r r u p ç õ e s de ←-
p e r i f é r i c o s
19 for ( ; ; ) {
20 ia = LerTeclas ( ) ;
21 MudaDigito
ELT024 ( ia , 0 ) ; Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 16 / 1
Interrupt control system

Atenção
Usar as interrupções apenas para rotinas SIMPLES.

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 17 / 1


Interrupt control system

Atenção
Usar as interrupções apenas para rotinas simples e RÁPIDAS.

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 18 / 1


Interrupt control system

Atenção
Usar as interrupções apenas para rotinas simples, rápidas e
NECESSÁRIAS.

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 19 / 1


Interrupt control system

Interrupt control system


Pode ser utilizado como controle do loop principal
Auxilia em quesitos de temporização
Permite criação de ”timers”artificiais

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 20 / 1


Interrupt control system

1 // v a r i á v e i s g l o b a l de c o n t r o l e
2 s t a t i c u n s i g n e d i n t tick ;
3 s t a t i c u n s i g n e d c h a r loopControl ;
4
5 // r o t i n a de tempo v i a i n t e r r u p ç ã o
6 v o i d Interrupcao ( v o i d ) interrupt 1 {
7 i f ( BitTst ( INTCON , 2 ) ) { //TIMER0 : O v e r f l o w
8 BitClr ( INTCON , 2 ) ; // l i m p a a f l a g
9 ResetaTimer ( 5 0 0 0 ) ; // 5ms
10 A tu al iz a Di sp l ay ( ) ; // tem que s e r e x e c u t a d o p e l o menos a ←-
c a d a 8 . 3 ( ms )
11 tick++;
12 loopControl = 1 ;
13 }
14 }

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 21 / 1


Interrupt control system

1 v o i d main ( v o i d ) {
2 i n t ia ;
3 InicializaTeclado ( ) ;
4 InicializaDisplay ( ) ;
5 I ni ci al i za Ti me r ( ) ;
6 // i n i c i a l i z a ç ã o da i n t e r r u p ç ã o
7 BitClr ( RCON , 7 ) ; // d e s a b i l i t a IPEN ( modo de c o m p a t i b i l i d a d e )
8 BitSet ( INTCON , 5 ) ; // l i g a a i n t e r r u p ç ã o p a r a o t i m e r 0
9 BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s a s i n t e r r u p ç õ e s g l o b a i s
10 BitSet ( INTCON , 6 ) ; // h a b i l i t a t o d a s a s i n t e r r u p ç õ e s de ←-
p e r i f é r i c o s
11 for ( ; ; ) {
12 loopControl = 0 ;
13 i f ( ( tick % 2 ) == 0 ) {
14 ia = LerTeclas ( ) ;
15 MudaDigito ( ia , 0 ) ;
16 }
17 i f ( ( tick % 3 ) == 0 ) {
18 Debo unceTecl as ( ) ;
19 }
20 w h i l e ( loopControl == 0 ) ; // t i m e d l o o p
21 }
22 } ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 22 / 1
Programando multitasking de modo eficiente

Multitasking
Multitasking é a capacidade de se executar mais de uma tarefa
simultaneamente.
A maioria dos sistemas embarcados (por serem de baixo custo) não
possuem esta caracterı́stica
A alternativa é discretizar o tempo e permitir que as tarefas sejam
executadas em janelas de tempo, de modo sequencial.
Se a alternância entre as tarefas for rápida o suficiente, o sistema
apresentará o comportamento de multitasking
Uma das maneiras de projetar este tipo de código é através de
máquinas de estado

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 23 / 1


Programando multitasking de modo eficiente

Exemplo de máquina de estados

Inicio

Ler Atualiza
Teclado Display

Atualiza Escreve
Display Serial

Atualiza
Ler Serial Display

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 24 / 1


Programando multitasking de modo eficiente

Cada ciclo representa um estado do sistema, a tarefa atualmente em


execução
Apos a fase de inicialização, o sistema entra num ciclo
A transposição da máquina de estados para linguagem C pode ser
feita de modo simples através da estrutura Switch-Case

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 25 / 1


1 v o i d main ( v o i d ) {
2 c h a r slot ;
3 // I n i c i a l i z a . . .
4 f o r ( ; ; ) { // i n i c i o do l o o p i n f i n i t o
5 // ******************** top− s l o t **********************
6 // *********** i nı́ c i o da máquina de e s t a d o ************
7 s w i t c h ( slot ) {
8 case 0:
9 LeTeclado ( ) ; slot = 1 ; b r e a k ;
10 case 1:
11 A tu al iz a Di sp la y ( ) ; slot = 2 ; b r e a k ;
12 case 2:
13 RecebeSerial ( ) ; slot = 3 ; b r e a k ;
14 case 3:
15 A tu al iz a Di sp la y ( ) ; slot = 4 ; b r e a k ;
16 case 4:
17 EnviaSerial ( ) ; slot = 5 ; b r e a k ;
18 case 5:
19 A tu al iz a Di sp la y ( ) ; slot = 0 ; b r e a k ;
20 default :
21 slot = 0 ; b r e a k ;
22 }
23 // ************ f i m da máquina de e s t a d o **************
24 // ****************** bottom− s l o t *********************
25 } // f i m l o o p i n f i n i t o ( ! ? )
26 } ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 26 / 1
Programando multitasking de modo eficiente

Deve-se notar que foram criadas três áreas dentro de cada ciclo
A máquina de estado
O top-slot
O bottom-slot
O aumento de tarefas se torna mais simples, basta adicionar outro
slot com a função desejada
O bottom e top slots podem ser usados para tarefas que deveriam ser
realizadas em todos os ciclos como a AtualizaDisplay() por exemplo

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 27 / 1


1 v o i d main ( v o i d ) interrupt 0{
2 c h a r slot ;
3 // I n i c i a l i z a . . .
4 f o r ( ; ; ) { // i n i c i o do l o o p i n f i n i t o
5 // ******************** top− s l o t **********************
6 A tu al iz a Di sp l ay ( ) ;
7 // *********** i nı́ c i o da máquina de e s t a d o ************
8 s w i t c h ( slot ) {
9 case 0:
10 LeTeclado ( ) ; slot = 1 ; b r e a k ;
11 case 1:
12 RecebeSerial ( ) ; slot = 2 ; b r e a k ;
13 case 2:
14 EnviaSerial ( ) ; slot = 0 ; b r e a k ;
15 default :
16 slot = 0 ; b r e a k ;
17 }
18 // ************ f i m da máquina de e s t a d o **************
19 // ****************** bottom− s l o t *********************
20 } // f i m l o o p i n f i n i t o ( ! ? )
21 }

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 28 / 1


Programando multitasking de modo eficiente

Uma boa prática é temporizar os slots


Deste modo cada ciclo tem o mesmo tempo para executar
Isto gera previsibilidade no funcionamento do sistema

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 29 / 1


1 v o i d main ( v o i d ) {
2 c h a r slot ;
3 // I n i c i a l i z a . . .
4 f o r ( ; ; ) { // i n i c i o do l o o p i n f i n i t o
5 // ******************** top− s l o t **********************
6 ResetaTimer ( 5 0 0 0 ) ; // 5 ms p a r a c a d a s l o t
7 A tu al iz a Di sp l ay ( ) ;
8 // *********** i nı́ c i o da máquina de e s t a d o ************
9 s w i t c h ( slot ) {
10 case 0:
11 LeTeclado ( ) ; slot = 1 ; b r e a k ;
12 case 1:
13 RecebeSerial ( ) ; slot = 2 ; b r e a k ;
14 case 2:
15 EnviaSerial ( ) ; slot = 0 ; b r e a k ;
16 default :
17 slot = 0 ; b r e a k ;
18 }
19 // ************ f i m da máquina de e s t a d o **************
20 // ****************** bottom− s l o t *********************
21 AguardaTimer ( ) ;
22 } // f i m l o o p i n f i n i t o ( ! ? )
23 }

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 30 / 1


Interrupt control system

1 // v a r i á v e i s g l o b a l de c o n t r o l e
2 s t a t i c u n s i g n e d c h a r loopControl ;
3
4 // r o t i n a de tempo v i a i n t e r r u p ç ã o
5 v o i d Interrupcao ( v o i d ) interrupt 1 {
6 i f ( BitTst ( INTCON , 2 ) ) { //TIMER0 : O v e r f l o w
7 BitClr ( INTCON , 2 ) ; // l i m p a a f l a g
8 ResetaTimer ( 5 0 0 0 ) ; // 5ms
9 loopControl = 1 ;
10 }
11 }

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 31 / 1


1 v o i d main ( v o i d ) {
2 c h a r slot ;
3 // I n i c i a l i z a . . .
4 f o r ( ; ; ) { // i n i c i o do l o o p i n f i n i t o
5 // ******************** top− s l o t **********************
6 loopControl == 0 ;
7 A tu al iz a Di sp l ay ( ) ;
8 // *********** i nı́ c i o da máquina de e s t a d o ************
9 s w i t c h ( slot ) {
10 case 0:
11 LeTeclado ( ) ; slot = 1 ; b r e a k ;
12 case 1:
13 RecebeSerial ( ) ; slot = 2 ; b r e a k ;
14 case 2:
15 EnviaSerial ( ) ; slot = 0 ; b r e a k ;
16 default :
17 slot = 0 ; b r e a k ;
18 }
19 // ************ f i m da máquina de e s t a d o **************
20 // ****************** bottom− s l o t *********************
21 w h i l e ( loopControl == 0 ) ; // t i m e d l o o p
22 } // f i m l o o p i n f i n i t o ( ! ? )
23 }

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 32 / 1


Programando multitasking de modo eficiente

Exemplo da mudança de slots no tempo


Top
S.1
S.2
S.3
Bottom
"vago"
0 5 10 15 20 25 30

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 33 / 1


Programando multitasking de modo eficiente

Uso do tempo vago para as interrupções


Top 1 1 1
S.1 3 3 3
Bottom 1 1 1
"vago" 3 3 3

Top 1 1
S.1 1 2 3 3
Bottom 1 1 1
"vago" 2 2 2
Interr. 1 1 1

ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 34 / 1