Multitarea

Hola buenas,

Estoy haciendo un proyecto de arduino de arduio en el que, entre otras cosas, se debe conectar a la red GPS. El problema es que a veces tarda bastante y por tanto retrasa la ejecución del resto del código.

Mi pregunta es si es posible realizar algún tipo de multitarea para que el resto del código se ejecute mientras el GPS busca la localización.

Gracias anticipadas,

No existe la multitarea en Arduino. Lo que debes hacer es esperar a que el GPS envíe datos. No se porque demoras esperando los datos del GPS si para hacerlo debes consultar si el puerto envió datos. Eso y solo eso habilita la lectura y procesamiento de los datos del GPS. Si no lo haces asi, lo estas haciendo mal.

El gps que yo uso tarda bastante en conectar, para hallar la posición del GPS dependo de los satélites ajenos a mí control, por lo que hasta que no me den el dato no podré leerlo. Si la cobertura no es buena se puede demorar hasta 10 minutos, aunque lo normal son 3-4 minutos.

Por eso preguntaba lo de la multitarea. De todas formas además de para este proyecto, para futuros veo muy interesante y con mucho potencial conocer una forma de hacer varias tareas a la vez con Arduino.

¿Que GPS es? Lo normal es que el GPS envíe sentencias NMEA, haya hecho el fix o no. En cualquiera de los dos casos, aparece el estado en las sentencias NMEA.

Claro, el estado lo capturo, pero hasta que el estado es válido tarda el tiempo que he comentado antes.

De todas formas como digo no me interesa el GPS, me interesa la multitarea para futuros proyectos también.

NO EXISTE LA MULTITAREA en arduino. Puedes hacer una máquina de estados o un sistema timeslice controlado por un timer, pero ahi tienes que usar stack, poner y sacar variables, hay algunas cosas bien hechas al respecto.

De todos modos no existe nada que quieras hacer que no se pueda hacer como esta. Aprende a trabajar con máquina de estados y verás que sencillamente puedes resolver tu problema

Como lo veo yo, toda sentencia que envié el GPS será por puerto serie, si pones simplemente un if (gps.available()>0) y procesas la información cuando llega puedes seguir haciendo otras cosas. No es multitarea pero es lo mejor que se puede hacer.

CUanto demoras ? Exagerado 1 mseg. Bueno supongamos que por cada ciclo de loop demoraras eso.. te queda el resto del tiempo para atender lo demás.

Si pones tu código igual te podemos dar alguna idea. ¿Qué se supone que debería realizar arduino mientras espera el fix?

No tiene código serafín, pregunta en lineas generales pensando a futuro con el problema actual.

Exacto tienes que hacer la estructura de tu programa con un bucle principal que no se detiene esperando “algo”, simplemente consulta si tal o cual cosa esta preparada y la hace, de lo contrario sigue su curso comprobando la siguiente cosa…

Como se hace esto pues olvidate del “delay”, del “while” y en general de pararte a esperar algo, lo controlas todo con “if”, variables, timers y/o contadores…

La idea es que el procesador nunca se detenga a esperar algo, que siempre este circulando y que cuando algun proceso este preparado lo ejecute, con esto consigues algo “parecido” a la multitarea y que a mi modo de ver es la mejor manera de programar.

Por ejemplo yo utilizo variables que llamo Flag (bandera), por ejemplo FlagGps, FlagTemperatura, FlagTeclado…
Leo con una instruccion “if” si esta preparado el gps para ser leido y entonces pongo a 1 la variable FlagGps, cuando llega al trozo de codigo encargado de leer el gps si FlagGps=1 entra y lo lee, si no sigue adelante.

Máquina de estados Uargo.

Mmm vale gracias

Mi código tarda como uno o 2 minutos en ejecutarse entero (mando tramas GSM, cálculo datos de sensores,...) De ahí que quisiera multitarea... lo de esperar al bucle no me convence, aunque es lo que estaba haciendo hasta ahora.

De todas formas gracias, intentaré aplicar lo de las máquinas de estado, si no es para este proyecto para futuros!

Eso Surbyte era por explicarlo de forma sencilla.

Si tu codigo tarda 2 min en recorrer el bucle esta muy mal hecho, el bucle deberia recorrerse al menos 10 veces por segundo si quieres tener una respuesta decente a los eventos

Te recomiendo subdividir la rutina del GPS y la del GSM en eventos mas sencillos en 8 o 10 trozos si es necesario, trozos de rapida ejecucion, en cuanto haya que esperar un estado para seguir lo montas en otro trozo aparte... se volvera mucho mas complejo pero infinitamente mas rapido

ejemplo si divides la rutina GSM en 10 trozos podras controlar en que punto te encuentras usando una variable "MenuGsm" cuando valga 0 estaras aun sin empezar cuando vayas por el 3º trozo le asignas =3 y asi llevas el control

La clave es no esperar nunca a un estado para poder seguir, el codigo gsm de ejemplos es todo lo contrario lo ejecuta todo seguido esperando al estado adecuado en cada paso, se pierde mucho tiempo

Ningun código mío (bien hecho) demora 2 min en recorrer nada usando Maquina de estados. ACLARO: si el código esta mal demorará 2, 10 o 30 min.

Eso que estas explicando Uargo es una máquina de estados.