Baixe o app para aproveitar ainda mais
Prévia do material em texto
Arquiteturas de sistemas embarcados Prof.MSc.Rodrigo Maximiano Antunes de Almeida Universidade Federal de Itajuba´ rodrigomax@unifei.edu.br ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 1 / 1 Interrupc¸a˜o e Watchdog Revisa˜o ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 2 / 1 Interrupc¸a˜o Programa Principal Rotina de Interrupção Programa Principal Latência da Interrupção Acontece a Interrupção Início da ISR Continua o fluxo do programa TempoLatência da Interrupção Fim da ISR ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 3 / 1 Interrupc¸a˜o Quando uma interrupc¸a˜o e´ gerada, o programa e´ paralizado e uma func¸a˜o de interrupc¸a˜o e´ executada Conversor AD: quando o resultado da conversa˜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 Interrupc¸a˜o Atenc¸a˜o A func¸a˜o que ira´ tratar da interrupc¸a˜o na˜o retorna nem recebe nenhum valor ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 5 / 1 Interrupc¸a˜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 */ } // comparac¸ a˜o TIMER2 = PR2 4 i f ( BitTst ( PIR1 , 2 ) ) { /* c o d i g o */ } // comparac¸ a˜o do CCP1 5 i f ( BitTst ( PIR1 , 3 ) ) { /* c o d i g o */ } // f im 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 im t r a n s m i s s a˜ 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 c¸ a˜ o da S e r i a l 8 i f ( BitTst ( PIR1 , 6 ) ) { /* c o d i g o */ } // f im de c o n v e r s a˜ 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 */ } // comparac¸ a˜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 */ } // problema 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 a˜ o no barramento 14 i f ( BitTst ( PIR2 , 4 ) ) { /* c o d i g o */ } // f im 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 c¸ a˜ o da USB 16 i f ( BitTst ( PIR2 , 6 ) ) { /* c o d i g o */ } // mudanc¸a na comparac¸ a˜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 */ } // mudanc¸a na PORTA B 19 i f ( BitTst ( INTCON , 1 ) ) { /* c o d i g o */ } // i n t e r r u p c¸ a˜ 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 c¸ a˜ 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 c¸ a˜ o e x t e r n a INT2 23 } ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 6 / 1 Interrupc¸a˜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 c¸ a˜ o para o AD 3 BitSet ( PIE1 , 5 ) ; // l i g a a i n t e r r u p c¸ a˜ o para a r e c e p c¸ a˜ 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 c¸ a˜ o para o t i m e r 0 5 BitSet ( INTCON , 3 ) ; // l i g a a i n t e r r u p c¸ a˜ o para a p o r t a B 6 BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s as i n t e r r u p c¸ o˜ 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 as i n t e r r u p c¸ o˜ e s de p e r i f e´ r i c o s ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 7 / 1 Interrupc¸a˜o O watchdog visa aumentar a seguranc¸a do projeto. Funciona como um temporizador Precisa ter seu contador constantemente reiniciado. Caso na˜o seja reiniciado no tempo exigido, o watchdog reinicia o microcontrolador ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 8 / 1 Interrupc¸a˜o 1 // Watchdog c o n t r o l a d o por s o f t w a r e 2 code char at 0x300003 CONFIG2H = 0x00 ; 3 4 5 #define CLRWTD ( ) _asm CLRWDT _endasm 6 7 v o i d main ( v o i d ) 8 { 9 uns igned i n t i ; 10 uns igned char 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 f o r ( ; ; ) 15 { 16 PORTD++; 17 f o r ( i = 0 ; i < 10000 ; 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 E´ sempre interessante definir uma arquitetura para o software Dependendo dos requisitos do sistema pode-se usar desde uma programac¸a˜o voltada apenas para a aplicac¸a˜o ate´ um sistema operacional Dentre as te´cnicas mais simples sera˜o apresentadas treˆ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 E´ a estrate´gia utilizada ate´ agora na disciplina Consiste em um loop infinito dentro do qual todas as tarefas sa˜o executadas Apenas as rotinas de inicializac¸a˜o acontecem antes dele Programac¸a˜o e´ mais simples Dificuldade de garantir requisic¸o˜es temporais Escalabilidade, reuso e manutenc¸a˜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 c¸ a˜ o das v a r i a´ v e i s 4 i n t ia , ib , ic ; 5 f l o a t fa , fb , fc ; 6 // i n i c i a l i z a c¸ a˜ o dos p e r i f e´ r i c o s 7 InicializaTeclado ( ) ; 8 InicializaLCD ( ) ; 9 // u´ n i c o l o o p i n f i n i t o 10 f o r ( ; ; ) 11 { 12 // chamada das 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 cada 10(ms) 16 AtualizaDisplay ( ) ; 17 DebounceTeclas ( ) ; 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 c¸ a˜ o das v a r i a´ v e i s 4 i n t ia , ib , ic ; 5 f l o a t fa , fb , fc ; 6 // i n i c i a l i z a c¸ a˜ o dos p e r i f e´ r i c o s 7 InicializaTeclado ( ) ; 8 InicializaLCD ( ) ; 9 // u´ n i c o l o o p i n f i n i t o 10 f o r ( ; ; ) 11 { 12 // chamada das 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 cada 10(ms) 17 AtualizaDisplay ( ) ; 18 DebounceTeclas ( ) ; 19 ic = RecebeSerial ( ) ; 20 // na˜o cumpre r e q u i s i c¸ a˜ o t e m p o r a l por causa da 21 22 fa = 2 . 0 * ic / 3 . 1 4 ; 23 EnviaSerial ( fa & 0x00FF ) ; 24 EnviaSerial ( fa >> 8) ; 25 } 26 } ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 14 / 1 Interrupt control system Interrupt control system Visa resolver o problema das restric¸o˜es temporais Apenas alguns sub-sistemas podem ser operados via interrupc¸a˜o Os demais sistemas operam no loop principal Facilita a expansa˜o do sistema, ja´ que as interrupc¸o˜es na˜o dependem do loop principal O´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 system1 // r o t i n a de tempo v i a i n t e r r u p c¸ a˜ 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 (5000) ; //5ms 6 AtualizaDisplay ( ) ; //tem que s e r e x e c u t a d o p e l o menos a ←↩ cada 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 InicializaTimer ( ) ; 14 // i n i c i a l i z a c¸ a˜ o da i n t e r r u p c¸ a˜ 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 c¸ a˜ o para o t i m e r 0 17 BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s as i n t e r r u p c¸ o˜ 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 as i n t e r r u p c¸ o˜ e s de ←↩ p e r i f e´ r i c o s 19 f o r ( ; ; ) { 20 ia = LerTeclas ( ) ; 21 MudaDigito ( ia , 0 ) ; 22 } 23 } ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 16 / 1 Interrupt control system Atenc¸a˜o Usar as interrupc¸o˜es apenas para rotinas SIMPLES. ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 17 / 1 Interrupt control system Atenc¸a˜o Usar as interrupc¸o˜es apenas para rotinas simples e RA´PIDAS. ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 18 / 1 Interrupt control system Atenc¸a˜o Usar as interrupc¸o˜es apenas para rotinas simples, ra´pidas e NECESSA´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 temporizac¸a˜o Permite criac¸a˜o de ”timers”artificiais ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 20 / 1 Interrupt control system 1 // v a r i a´ 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 uns igned i n t tick ; 3 s t a t i c uns igned char loopControl ; 4 5 // r o t i n a de tempo v i a i n t e r r u p c¸ a˜ 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 (5000) ; //5ms 10 AtualizaDisplay ( ) ; //tem que s e r e x e c u t a d o p e l o menos a ←↩ cada 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 InicializaTimer ( ) ; 6 // i n i c i a l i z a c¸ a˜ o da i n t e r r u p c¸ a˜ 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 c¸ a˜ o para o t i m e r 0 9 BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s as i n t e r r u p c¸ o˜ 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 as i n t e r r u p c¸ o˜ e s de ←↩ p e r i f e´ r i c o s 11 f o r ( ; ; ) { 12 loopControl = 0 ; 13 i f ( ( tick % 2) == 0) { 14 ia = LerTeclas ( ) ; 15 MudaDigito ( ia , 0 ) ; 16 } 17 i f ( ( tick % 3) == 0) { 18 DebounceTeclas ( ) ; 19 } 20 w h i l e ( loopControl == 0) ; // t imed l o o p 21 } 22 } ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 22 / 1 Programando multitasking de modo eficiente Multitasking Multitasking e´ a capacidade de se executar mais de uma tarefa simultaneamente. A maioria dos sistemas embarcados (por serem de baixo custo) na˜o possuem esta caracter´ıstica A alternativa e´ discretizar o tempo e permitir que as tarefas sejam executadas em janelas de tempo, de modo sequencial. Se a alternaˆncia entre as tarefas for ra´pida o suficiente, o sistema apresentara´ o comportamento de multitasking Uma das maneiras de projetar este tipo de co´digo e´ atrave´s de ma´quinas de estado ELT024 Arquiteturas de sistemas embarcados rodrigomax@unifei.edu.br 23 / 1 Programando multitasking de modo eficiente Exemplo de ma´quina de estados Inicio Ler Teclado Atualiza Display Escreve Serial Atualiza DisplayLer Serial Atualiza 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 execuc¸a˜o Apos a fase de inicializac¸a˜o, o sistema entra num ciclo A transposic¸a˜o da ma´quina de estados para linguagem C pode ser feita de modo simples atrave´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 char 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 ma´quina de e s t a d o ************ 7 s w i t c h ( slot ) { 8 case 0 : 9 LeTeclado ( ) ; slot = 1 ; break ; 10 case 1 : 11 AtualizaDisplay ( ) ; slot = 2 ; break ; 12 case 2 : 13 RecebeSerial ( ) ; slot = 3 ; break ; 14 case 3 : 15 AtualizaDisplay ( ) ; slot = 4 ; break ; 16 case 4 : 17 EnviaSerial ( ) ; slot = 5 ; break ; 18 case 5 : 19 AtualizaDisplay ( ) ; slot = 0 ; break ; 20 d e f a u l t : 21 slot = 0 ; break ; 22 } 23 // ************ f im da ma´quina de e s t a d o ************** 24 // ****************** bottom−s l o t ********************* 25 } // f im 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 treˆs a´reas dentro de cada ciclo A ma´quina de estado O top-slot O bottom-slot O aumento de tarefas se torna mais simples, basta adicionar outro slot com a func¸a˜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 char 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 AtualizaDisplay ( ) ; 7 // *********** i n ı´ c i o da ma´quina de e s t a d o ************ 8 s w i t c h ( slot ) { 9 case 0 : 10 LeTeclado ( ) ; slot = 1 ; break ; 11 case 1 : 12 RecebeSerial ( ) ; slot = 2 ; break ; 13 case 2 : 14 EnviaSerial ( ) ; slot = 0 ; break ; 15 d e f a u l t : 16 slot = 0 ; break ; 17 } 18 // ************ f im da ma´quina de e s t a d o ************** 19 // ****************** bottom−s l o t ********************* 20 } // f im 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 pra´tica e´ 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 char 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 (5000) ; //5 ms para cada s l o t 7 AtualizaDisplay ( ) ; 8 // *********** i n ı´ c i o da ma´quina de e s t a d o ************ 9 s w i t c h ( slot ) { 10 case 0 : 11 LeTeclado ( ) ; slot = 1 ; break ; 12 case 1 : 13 RecebeSerial ( ) ; slot = 2 ; break ; 14 case 2 : 15 EnviaSerial ( ) ; slot = 0 ; break ; 16 d e f a u l t : 17 slot = 0 ; break ; 18 } 19 // ************ f im dama´quina de e s t a d o ************** 20 // ****************** bottom−s l o t ********************* 21 AguardaTimer ( ) ; 22 } // f im 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 a´ 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 uns igned char loopControl ; 3 4 // r o t i n a de tempo v i a i n t e r r u p c¸ a˜ 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 (5000) ; //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 char 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 AtualizaDisplay ( ) ; 8 // *********** i n ı´ c i o da ma´quina de e s t a d o ************ 9 s w i t c h ( slot ) { 10 case 0 : 11 LeTeclado ( ) ; slot = 1 ; break ; 12 case 1 : 13 RecebeSerial ( ) ; slot = 2 ; break ; 14 case 2 : 15 EnviaSerial ( ) ; slot = 0 ; break ; 16 d e f a u l t : 17 slot = 0 ; break ; 18 } 19 // ************ f im da ma´quina de e s t a d o ************** 20 // ****************** bottom−s l o t ********************* 21 w h i l e ( loopControl == 0) ; // t imed l o o p 22 } // f im 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 mudanc¸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 interrupc¸o˜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
Compartilhar