ze escreveu:andre, concordo discordando. pra um pic com pouca memória, creia-me: if´s ocupam menos espaço. Passei por isso quando num projeto um mc de 1k ocupou 1022 bytes
Entendo, mas é que achei pela descrição do problema no 1º tópico, que a principal questão aí fosse a velocidade.
Não sei bem como o compilador trata os IF e os SWITCH, mas no primeiro caso teria de avaliar todos os IFs anteriores para somente então chegar no último, enquanto que no SWITCH, em princípio cada CASE já poderia ser acionada diretamente sem necessidade de avaliação dos CASE anteriores, praticamente como se usando um comando JUMP em assembly - creio. Tá certo que na velocidade de Clock de uns 20MHz, essa discussão pode parecer tola, mas ainda assim acho que isso pode ser mais um fator para limitar a taxa máxima de Baud Rate da serial do uC, em casos como esse, onde o frame do pacote possui muitos bytes para serem avaliados.
Segue abaixo um trexo de uma função de tratamento da recepção da serial que fiz para o PIC16F:
- Código: Selecionar todos
#int_RDA
void RDA_isr( void )
{
output_bit ( PIN_A1 , HIGH ) ;
if ( kbhit() )
{
DadoRecebido = getc() ;
if ( PodeAvaliar == NAO )
{
switch ( ContBytesRec )
{
case 0 :
if( DadoRecebido == 'S') ContBytesRec = 1 ;
else ContBytesRec = 0 ;
break ;
case 1 :
if( DadoRecebido == 'T') ContBytesRec = 2 ;
else ContBytesRec = 0 ;
break ;
case 2 :
if( DadoRecebido == 'X') ContBytesRec = 3 ;
else ContBytesRec = 0 ;
break ;
case 3 :
ContBytesRec = 4 ;
VerificaSeEhNumeroASCII() ;
TamanhoString_RX = ( DadoRecebido-'0' )*10 ;
break ;
case 4 :
TamanhoString_RX += DadoRecebido-'0' ;
if ( TamanhoString_RX == 0 ) ContBytesRec = 0 ;
else ContBytesRec = 5 ;
VerificaSeEhNumeroASCII() ;
if ( TamanhoString_RX > TAMANHO_MAXIMO_TEXTO )
TamanhoString_RX = TAMANHO_MAXIMO_TEXTO ;
break ;
case 5 :
switch ( DadoRecebido )
{
case '0' : TemEfeito = NAO ; ContBytesRec = 6 ; break ;
case '1' : TemEfeito = SIM ; ContBytesRec = 6 ; break ;
case '2' : ContBytesRec = 100 ; break ;
default : TemEfeito = NAO ; ContBytesRec = 0 ; break ;
}
break ;
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 11 :
case 12 :
case 13 :
case 14 :
case 15 :
case 16 :
case 17 :
case 18 :
case 19 :
case 20 :
case 21 :
case 22 :
case 23 :
case 24 :
case 25 :
case 26 :
case 27 :
case 28 :
case 29 :
case 30 :
case 31 :
case 32 :
case 33 :
case 34 :
case 35 :
case 36 :
case 37 :
case 38 :
case 39 :
case 40 :
case 41 :
case 42 :
case 43 :
case 44 :
case 45 :
case 46 :
case 47 :
case 48 :
case 49 :
case 50 :
case 51 :
case 52 :
case 53 :
case 54 :
case 55 :
case 56 :
case 57 :
case 58 :
case 59 :
case 60 :
case 61 :
case 62 :
case 63 :
case 64 :
case 65 :
case 66 :
case 67 :
case 68 :
case 69 :
case 70 :
case 71 :
case 72 :
case 73 :
case 74 :
case 75 :
case 76 :
case 77 :
case 78 :
ContBytesRec = 79 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_0 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_0 ;
else ContBytesRec = 0 ;
break ;
case 79 :
ContBytesRec = 80 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_1 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_1 ;
else ContBytesRec = 0 ;
break ;
case 80 :
ContBytesRec = 81 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_2 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_2 ;
else ContBytesRec = 0 ;
break ;
case 81 :
ContBytesRec = 82 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_3 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_3 ;
else ContBytesRec = 0 ;
break ;
case 82 :
ContBytesRec = 83 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_4 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_4 ;
else ContBytesRec = 0 ;
break ;
case 83 :
ContBytesRec = 84 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_5 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_5 ;
else ContBytesRec = 0 ;
break ;
default : ContBytesRec = 0 ;
}
}
}
}
Ok, tem coisas que fiz aí que não são uma boa-pratica ao se colocar dentro do vetor de interrupçao, mas o foco é mostrar a estrutura como um todo pro tratamento da recepção usando o SWITCH ao invez dos IFs aninhados.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."