Escolar Documentos
Profissional Documentos
Cultura Documentos
rodrigomax@unifei.edu.br
Revisão
Atenção
A função que irá tratar da interrupção não retorna nem recebe nenhum
valor
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
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 }
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
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.
Atenção
Usar as interrupções apenas para rotinas simples e RÁPIDAS.
Atenção
Usar as interrupções apenas para rotinas simples, rápidas e
NECESSÁRIAS.
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 }
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
Inicio
Ler Atualiza
Teclado Display
Atualiza Escreve
Display Serial
Atualiza
Ler Serial Display
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
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 }
Top 1 1
S.1 1 2 3 3
Bottom 1 1 1
"vago" 2 2 2
Interr. 1 1 1