Autor Tema: Teoria de porque deshabilita las interrupciones con depende que código  (Leído 5078 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado antoniopa

  • PIC12
  • **
  • Mensajes: 72
Hola, tengo la siguiente interrup`ción programada en un PIC16F877A con el compilador PCW de CCS:
Código: [Seleccionar]
#INT_TIMER1
void reloj()
{
   set_timer1(15536);
   ++contador;
   if (contador==10)
   {
      estado=actualizacion;
      aux_dist=(aux_dist+27*speed);
      dist=aux_dist/100000;  //calculo de la variable dist para presentación de la distancia en km.
      contador=0;
      ++seg;
      if (seg==60)
      {
         seg=0;
         ++min;
         if (min==60)
         {
            min=0;
           
         }
      }
   }
}

Y me da los siguiente warning:

>>> Warning 216 "monitor.c" Line 372(0,1): Interrupts disabled during call to prevent re-entrancy:  (@DIV3232)
>>> Warning 216 "monitor.c" Line 372(0,1): Interrupts disabled during call to prevent re-entrancy:  (@MUL3232)

Si popngo alguna función como delay_ms o las funciónes para controlar un lcd (lcd.c) tambien me los da, allguien sabe la teoria de lo que significa y si se puede evitar?

Gracias.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #1 en: 02 de Enero de 2012, 12:16:39 »
Hola.

Lo que hace el compilador es des-habilitar las interrupciones mientras realiza esas operaciones, las cuales pueden tomar mucho tiempo. Esto se hace con el fin de que mientras esta haciendo la operación respectiva, no vuelva a entrar a la misma interrupción o a otra del mismo nivel.

Se puede evitar el warning evitando hacer esas operaciones (en tu caso, multiplicación y división) fuera de la rutina de interrupción, y haciéndolas en el programa principal usando algún flag o bandera de aviso para procesarlas.

Saludos
El papel lo aguanta todo

Desconectado antoniopa

  • PIC12
  • **
  • Mensajes: 72
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #2 en: 02 de Enero de 2012, 13:45:19 »
Hola.

Lo que hace el compilador es des-habilitar las interrupciones mientras realiza esas operaciones, las cuales pueden tomar mucho tiempo. Esto se hace con el fin de que mientras esta haciendo la operación respectiva, no vuelva a entrar a la misma interrupción o a otra del mismo nivel.

Se puede evitar el warning evitando hacer esas operaciones (en tu caso, multiplicación y división) fuera de la rutina de interrupción, y haciéndolas en el programa principal usando algún flag o bandera de aviso para procesarlas.

Saludos

Con algun flag o bandera te refieres a alguna variable, por ejemplo, boolean , que se vuelva true, y que al volver al código principal , este la lea y pase ha realizar las operaciones? si es eso pasa una cosa, ¿como sabes en que linea de código va a volver? perdona mi ignorancia, pero no llevo mucho en programación y no se si te refieres a eso con flag o bandera.

No quiero poner todo el código porque si no voy a liar mucho la cosa, pero a esa interrupción se puede entrar desde distintas funciones, y supongo que tendria que implementar esa bandera en cualquier función en la que sea susceptible de que entrara la interrupción.

Saludos.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #3 en: 02 de Enero de 2012, 14:13:56 »
Hola.

Si, sería una variable del tipo boolean.

Se supone que después de atender la interrupción, se retorna a la parte del código en donde estaba el contador de programa antes de entrar a la interrupción.

Para saber donde se pone el código de la interrupción, pues depende de como organices tu código general.

Saludos
El papel lo aguanta todo

Desconectado antoniopa

  • PIC12
  • **
  • Mensajes: 72
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #4 en: 02 de Enero de 2012, 14:46:44 »
Ok, como yo pensaba, pues entonces, si desabilita la interrupción solo por ese tiempo de ejecución de esas funciones, no tengo problema, pues tarda 100 ms en volver a entrar y le da tiempo de sobra a ejecuatar lo que quiera. Asi se va a quedar.

Gracais por tu respuesta.
Saludos.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #5 en: 02 de Enero de 2012, 14:51:32 »
Lo que te explican los compañeros del foro, es que debes solamente marcar que entraste en la interrupcion, incrementar algun contador, hacer alguna comparacion y nada mas dentro de la interrupcion.
Cuando digo marcar se refiere a activar un flag o bandera (lease un bit) que diga que debe hacer el programa principal cuando ese bit sea positivo.

Por ejemplo si tu programa necesita escribir en el LCD cada 100 mili segundos, cuando entras a la interrupción que ocurre cada 1 mili segundo, haces lo siguiente:

Código: C
  1. ms++;  //incrementa variable ms
  2. if (ms >=100)
  3.  {
  4.    ms=0;
  5.    flag_LCD=1;  //pones el flag del LCD en 1
  6.  }
  7. //si no hay otra cosa sales de la interrupcion aquí.


Luego en el programa principal, haces lo siguiente:

Código: C
  1. ....... //otras instrucciones dentro del bucle while
  2. if (flag_LCD)
  3.  {
  4.     flag_LCD=0;   //desactivas el flag    
  5.     printf(lcd_putc,"entro en interrupcion"); //o lo que necesitas mostrar..
  6.  }
  7. ...... // sigue tu programa...
« Última modificación: 02 de Enero de 2012, 14:54:41 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #6 en: 02 de Enero de 2012, 15:01:31 »
Hola.

Es correcto MGLSOFT. Esa es la mejor forma.

En algunos proyectos esos warning me han dado problemas, por lo que yo evito de sobre-manera que aparezcan, y creo que muchos acá hacen lo mismo  :)

Saludos.
El papel lo aguanta todo

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #7 en: 02 de Enero de 2012, 15:47:54 »
en las interrupciones no se deberia hacer ninguna operacion larga tipo llamar funcion, como puede ser una multiplicacion/division o llamar a otra funcion. Sobretodo en el CCS que las interrupciones las controla el solo y te puede causar cualquier problema que te vuelva loco, darle vueltas y ser por esa tonteria...

Lo mejor es como mlgsoft dice, entras a la interrupcion, colocas alguna variable a true, y en tu while principal el tipico if(variable) ...

Tambien, no se como va el CCS pero si en tu codigo principal estas haciendo una division y dentro de la interrupcion haces otra division se corrompen los datos, todo esto ocurre si no se salvan bien las variables o si se comparte la memoria en la interrupcion, supongo que el CCS gestionara esto bien y lo evitara.

Desconectado JuanEZWon

  • PIC10
  • *
  • Mensajes: 21
Re: Teoria de porque deshabilita las interrupciones con depende que código
« Respuesta #8 en: 07 de Enero de 2012, 16:50:24 »
Eso sucede porque puede ocurrir una reentrada a la misma función. por ejemplo si tu estas en la función Lcd_Putc desde el main, y ocurre una interrupción, y dentro de la rutina de interrupción, llamas la función Lcd_Putc, ocurriría una reentrada a la misma función y se corromperían los datos. El CCS lo que hace es desactivar las interrupciones antes de entrar a dicha función. pero hay otras soluciones. Una es hacer que la función sea #Inline, osea que cuando se llame la funcion, no tenga necesidad de usar una instrucción de llamada, lo que implicaría un consumo mayor de memoria ROM y RAM. Pero puede ocurrir que en el caso de un Lcd que cuando ocurra una interrupción se este escribiendo en este y que la rutina de interrupción escriba en el lcd, lo que provocaría que se envíen datos corruptos a este. la solución a esto seria usar un semáforo que se gestione desde el main.  El que una función se demore mucho dentro de la rutina de interrupción, no tiene nada que ver y no provocarían reentrada siempre y cuando la interrupción se haya borrado a si misma y sea una función que solo sea llamada desde esa misma rutina de interrupción.


 

anything