TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hortoedro en 17 de Abril de 2015, 04:14:43

Título: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 04:14:43
Hola compañeros, muy buenas a ver si alguien puede ayudarme. En mi código tengo una función que enciende o apaga una luz dependiendo de los ciclos que le de, que pueden ser de hasta 10 días. Mi idea es salir de esa función una vez empiecen los ciclos a contar, para no encontrarme recorriendo esa función durante 10 días y no poder hacer nada más ¿Alguien sabe como salir de esa función mientras se esta ejecutando?, es decir, poder salir por ejemplo al bucle while(1) una vez entramos en la función mientras se está ejecutando en un "segundo plano".

Un saludo y muchas gracias

Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: KILLERJC en 17 de Abril de 2015, 04:19:33
menos mal que le pusiste las comillas a "segundo plano" por que no hay segundo plano con un solo nucleo.

No se como es exactamente tu funcion asi que no puedo especificar mucho, pero:

Si hay formas de romper ese flujo de programa.

una interrupcion, o con una condicion o si estas en un loop con un
break;
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 04:27:58
menos mal que le pusiste las comillas a "segundo plano" por que no hay segundo plano con un solo nucleo. Y si hay formas de romper el loop.

con un

break;

Hola KILLERJC, si por eso mismo puse las comillas no quería confundir a nadie. En cuanto al break, si lo pongo antes de la función no me entra y si lo pongo después de la función estamos en las mismas ya que solo saldría cuando acabara. ¿En que lugar debería de poner el break? ¿Una vez llamada a la función en teoría, no?¿Pero una vez entramos dentro de la función ya hasta que no terminara no saldrá no?

Un saludo y gracias
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: KILLERJC en 17 de Abril de 2015, 04:40:18
Podrias poner el codigo o aunque sea un ejemplo de como es?
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 04:42:53
Podrias poner el codigo o aunque sea un ejemplo de como es?

Hola KILLERJC, si aquí te lo posteo. Gracias por la velocidad de contestación.

Este es el código de la función que apaga y enciende la luz.

Código: [Seleccionar]
void arranque(void){

       if(ok==0){
       ok=1;
       flag_ciclo_duracion=1;
       do{
             flag_ciclo_marcha=1;
             do{
                output_high(LUZ);
               }
               while(flag_timer_seg_fin_marcha==0);
                
                 flag_timer_seg_fin_marcha=0;
                 logtimer_seg_marcha=0;
                 flag_ciclo_paro=1;
                  do{
                  output_low(LUZ);
                  }
                  while(flag_timer_seg_fin_paro==0);
                  
                  flag_timer_seg_fin_paro=0;
                  logtimer_seg_paro=0;
                  flag_ciclo_marcha=1;
          }
       while(flag_timer_seg_fin_duracion==0);
          
          flag_timer_seg_fin_duracion=0;
          logtimer_seg_duracion=0;
          flag_ciclo_duracion=0;
                }
          }
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: KILLERJC en 17 de Abril de 2015, 04:50:09
Me queda unas cosas que preguntarte, donde es que se queda el programa y que condiciones lo van a sacar de su ritmo ?

Esa funcion las llamas desde tu main() ? si la llamas desde tu main, podrias poner un if con la condicion y un return; asi salir de esa funcion

if (xxx > 0 ) return;

No me queda muy claro lo que hace el programa, si lo queres sacar de su ritmo es por que hiciste algo, tocaste algo o alo por el estilo, por lo cual podrias hacerlo y activar un flag para que termine esa ejecucion.
No llego a entender por que tantas banderas xD
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 04:54:07
Me queda unas cosas que preguntarte, donde es que se queda el programa y que condiciones lo van a sacar de su ritmo ?

Esa funcion las llamas desde tu main() ? si la llamas desde tu main, podrias poner un if con la condicion y un return; asi salir de esa funcion

La luz se apaga y se enciende durante ciertas horas. Entonces va alternandose, se apaga y se enciende, se apaga y se enciende así hasta que se acaba el tiempo de duración de esos ciclos. Ahí es cuando sale de la función y acaba. ¿Te refieres a esas condiciones?

La función la llamo desde una opción de un menú. Dentro de un case/break;

Las banderas están para cuando tenga que encenderse la luz, se baje la bandera de apagado y se suba la bandera de encendido (así sucesivamente) , todo eso mientas la bandera de duración este subida jeje.

El problema es que una vez entras en la función, no sé como salir de la función sin dejar que se termine su ejecución  :( :(

U saludo y gracias
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: KILLERJC en 17 de Abril de 2015, 05:02:14
La función la llamo desde una opción de un menú. Dentro de un case/break;

Entonces podes usar el if ( condicion ) return;, eso te va a llevar nuevamente al switch case, y va a continuar con el break; de ese switch case, y su funcionamiento fuera de esa funcion

A las condiciones me refiero a que:
Estando tu programa funcionando, (si no tocas nada no se sale, sigue funcionando normalmente), pero si quisieras pararlo deberias poder tocar algo, como un boton y asi sacarlo. Debe existir una condicion que pueda sacarlo de ese lugar.
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 05:16:26
La función la llamo desde una opción de un menú. Dentro de un case/break;

Entonces podes usar el if ( condicion ) return;, eso te va a llevar nuevamente al switch case, y va a continuar con el break; de ese switch case, y su funcionamiento fuera de esa funcion

A las condiciones me refiero a que:
Estando tu programa funcionando, (si no tocas nada no se sale, sigue funcionando normalmente), pero si quisieras pararlo deberias poder tocar algo, como un boton y asi sacarlo. Debe existir una condicion que pueda sacarlo de ese lugar.

Aquí es donde llamo a la función, pero no me queda claro lo del if, porque la condición es para que entre en la función, ¿no? La idea es que entre si o si, pero una vez dentro salir y que se siga ejecutando  :? :?

Código: [Seleccionar]

case A:   //Arranque
      flag_escape_pulsado=0;
      do
      {
      ok=0;
      arranque();
      }
      while(!Escape);
      break;


Saludos
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: KILLERJC en 17 de Abril de 2015, 05:26:25
mejor me explico con un ejemplo:

Código: C
  1. case 1:  
  2.        funcion_siempre_on();
  3.        break;
  4.  
  5.  
  6. .
  7. .
  8. .
  9. .
  10.  
  11. void funcion_siempre_on()
  12. {
  13.    do {
  14.           instruccion1;
  15.           instruccion2;
  16.           if (salir==1) return;
  17.    } while ( condicion que lo mantenga dentro );
  18. }

Cuando salir se ponga en 1, se ejecuta el return; y vuelve al programa donde tenia el witch case.
Creo que lo que vos queres hacer es eso pero con lo que llamas Escape.
Ahora entendes a lo que me refiero que tenes que tener una condicion que al cumplirse haga que se salga?

Y la otra es ... por que tantos do .. while :/ me parecen demasiado
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 05:39:38
mejor me explico con un ejemplo:

Código: C
  1. case 1:  
  2.        funcion_siempre_on();
  3.        break;
  4.  
  5.  
  6. .
  7. .
  8. .
  9. .
  10.  
  11. void funcion_siempre_on()
  12. {
  13.    do {
  14.           instruccion1;
  15.           instruccion2;
  16.           if (salir==1) return;
  17.    } while ( condicion que lo mantenga dentro );
  18. }

Cuando salir se ponga en 1, se ejecuta el return; y vuelve al programa donde tenia el witch case.
Creo que lo que vos queres hacer es eso pero con lo que llamas Escape.
Ahora entendes a lo que me refiero que tenes que tener una condicion que al cumplirse haga que se salga?

Y la otra es ... por que tantos do .. while :/ me parecen demasiado


Si KILLERJC, yo hago do{ } while(); para que ejecute el do{} mientras no pulse Escape, que es un botón del menú para salir a la opción anterior. Por eso los do{ } while(); . Nose, aprendí a hacerlo así jeje :? :?

En cuanto a lo otro, de salir de la función mientras se esta ejecutando, no sé muy bien como conseguirlo  :( :( . Un saludo y gracias
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: juaperser1 en 17 de Abril de 2015, 05:40:04
Como bien te dice KILLER tu error esta el usar tantos while, usa las condiciones en if o switch case.

En un programa ideal basado en un solo nucleo, solo debería exitir 1 while, el while(1) principal del sistema, y todo lo demás si toca hacerlo se hace, si no, a otra cosa.
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: KILLERJC en 17 de Abril de 2015, 05:41:10
if (Escape) return; dentro de todos los do.. while que tengas en la funcion arranque
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 06:58:22
Ok, gracias compañeros. ¿ Entonces al utilizar tantos while() ,me es imposible salir de una función sin dejar de ejecutarla no?

KILLERJC he probado lo que me comentas de los if() en los do{} while() pero no me funciona.

Gracias, seguire probando. Un saludo
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: juaperser1 en 17 de Abril de 2015, 07:18:01
No es que no te funcione, es que por ejemplo mientras tu micro esta en un bucle while, no esta haciendo otra cosa.

un ejemplo: Si creas una temporización en tu sistema, solo una, por ejemplo un timer que de una interrupcion cada 1 ms, y en ese timer vas incrementando flag., y en tu bucle while:

while1(1)

{
     if(flag1=="tiempo que quieres que se ejecute la funcion1")
     {
            funcion1();
     }
     if(flag2=="tiempo que quieres que se ejecute la funcion2")
     {
            funcion2();
     }
}

De esta manera solo ejecutara las funciones si tienen que ejecutarse, si no, pasara a la siguiente.

por ejemplo si la funcion1 incrementa segundos entrara 1 vez cada 1000 veces del timer.

si la funcion2 incrementa minutos entrara 1 vez cada 60000 veces del timer.

así tu micro estará "ejecutando varias tareas" al mismo tiempo y nunca se quedara parado en una función, no tendrás que salir de una función a mano, para ejecutar otra, cada una se ejecuta cuando le toca.
pero no pongas while dentro de las funciones por que si no estarías en las mismas. y no te preocupes por el tiempo el micro es muy muy rápido
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 07:39:09
No es que no te funcione, es que por ejemplo mientras tu micro esta en un bucle while, no esta haciendo otra cosa.

un ejemplo: Si creas una temporización en tu sistema, solo una, por ejemplo un timer que de una interrupcion cada 1 ms, y en ese timer vas incrementando flag., y en tu bucle while:

while1(1)

{
     if(flag1=="tiempo que quieres que se ejecute la funcion1")
     {
            funcion1();
     }
     if(flag2=="tiempo que quieres que se ejecute la funcion2")
     {
            funcion2();
     }
}

De esta manera solo ejecutara las funciones si tienen que ejecutarse, si no, pasara a la siguiente.

por ejemplo si la funcion1 incrementa segundos entrara 1 vez cada 1000 veces del timer.

si la funcion2 incrementa minutos entrara 1 vez cada 60000 veces del timer.

así tu micro estará "ejecutando varias tareas" al mismo tiempo y nunca se quedara parado en una función, no tendrás que salir de una función a mano, para ejecutar otra, cada una se ejecuta cuando le toca.
pero no pongas while dentro de las funciones por que si no estarías en las mismas. y no te preocupes por el tiempo el micro es muy muy rápido

OK compañero, gracias. Creo que no me he explicado bien, si que tengo posibilidad de salir de la función pero para de ejecutarse, lo que yo quiero es "salir" y que siga ejecutándose. Es decir, entrar en la función y que mientras se vaya ejecutando poder navegar por el menú principal buscando otros datos,por ejemplo.

Un saludo
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: juaperser1 en 17 de Abril de 2015, 07:53:16
Si implementas el programa como te he puesto, no tienes que preocuparte por eso, es decir, tu micro estará constantemente cambiado de la función 1 a la 2, por ejemplo.

imagina que la función que quieres que este todo el rato funcionando sea una que esta pendiente a si un pin se pone en alto, y mientras quieres leer un teclado y que se actualice el display.

pues de esta forma primero mirara el pin, despues el teclado y despues el display, pero al no tener while ni delay ni retardos ni nada de eso, lo hará tan rápido que puedes considerar que se esta haciendo todo al mismo tiempo.

no te preocupes por eso, el micro, en el tiempo que tu pulsas un teclado por ejemplo, ha entrado  y salido de la otra función miles de veces.

ten en cuenta que un microcontrolador de un nucleo nunca podrá llevar 2 tareas al mismo tiempo, pero de esta forma se puede considerar que si por su alta velocidad. tiene algunos perifericos que trabajan por si solos pero es por que no dependen del nucleo principal.
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: KILLERJC en 17 de Abril de 2015, 07:56:28
Para hortoedro:
Entonces deberias de re pensar las cosas. Por que estas "encerrando" a tu programa en esa funcion.

Si fuera mi programa  realmente necesitas de una base de tiempos ( por ejemplo segundos ) entonces en la interrupcion pregunto si esta entre los valores que deben ser y ahi enciendo u apago la salida. Y salgo de la interrupcion.
Si quisiera desabilitarlo entonces lo encierro en un if. Y dejo ejecutando para siempre el menu como mi programa principal.
Título: Re: Salir de una función que se este ejecutando en "segundo plano".
Publicado por: hortoedro en 17 de Abril de 2015, 08:40:19
OK compañeros, muchas gracias. Voy a probar lo que me comentáis. Un saludo