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;
Podrias poner el codigo o aunque sea un ejemplo de como es?
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;
}
}
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 función la llamo desde una opción de un menú. Dentro de un case/break;
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.
case A: //Arranque
flag_escape_pulsado=0;
do
{
ok=0;
arranque();
}
while(!Escape);
break;
mejor me explico con un ejemplo:Código: C
case 1: funcion_siempre_on(); break; . . . . void funcion_siempre_on() { do { instruccion1; instruccion2; if (salir==1) return; } while ( condicion que lo mantenga dentro ); }
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
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