Autor Tema: Tarea dentro de otra tarea  (Leído 1880 veces)

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

Desconectado ALFREDOSKY

  • PIC12
  • **
  • Mensajes: 95
Tarea dentro de otra tarea
« en: 30 de Julio de 2014, 12:47:18 »
Hola a todos, estoy algo confundido con como funciona el rtos  :? , hasta donde sé, cuando se ejecuta una tarea, ésta ocupa recursos y debe liberarlos al finalizar su ejecución. Lo que pretendo realizar es llamar a ejecución una tarea(la visualización de pantallas y gráficos en una pantalla touch), y en alguna de esas pantallas, al presionar un botón (es decir, un botón diseñado en esa pantalla con la función de 'Iniciar' algo) llame a realizar otra tarea(Iniciar comunicación por sockets con TCPIP). Esto seria como ejecutar una tarea dentro de otra tarea, algo que, creo no es posible, al menos, teóricamente. Espero alguien me pueda ayudar a aclarar esta duda y en todo caso cual seria la manera correcta de hacerlo, con semaforos, colas si es necesario, o simplemente creando la función dentro del código de este botón. Uso pic32mx795f512l, pantalla touch, MPLABX v2.00, librerias de Microchip TCPIP y GUI, compilador c32   ;-)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1339
Re: Tarea dentro de otra tarea
« Respuesta #1 en: 30 de Julio de 2014, 18:24:42 »
Que RTOS usas?

Desconectado ALFREDOSKY

  • PIC12
  • **
  • Mensajes: 95
Re: Tarea dentro de otra tarea
« Respuesta #2 en: 30 de Julio de 2014, 19:20:51 »
Hola  jeremylf, uso FreeRTOS  :lol:

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1339
Re: Tarea dentro de otra tarea
« Respuesta #3 en: 30 de Julio de 2014, 20:22:01 »
Talves pueda usar banderas o en este caso los semaforos pero para integrar todo primero puedes hacerlo sin usar rtos y crear tus propias bases de tiempo con un timer. ¿No has visto esa posibilidad para hacer funcionar correctamente tu comunicacion tcp/ip y tu glcd?

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1688
Re: Tarea dentro de otra tarea
« Respuesta #4 en: 31 de Julio de 2014, 13:02:54 »
hola, poco o nada se de RTOS , pero tengo entendido que puedes tener una tarea que puede ser activada y desactivada desde otra tarea, lo que no se puede hacer es que ella misma se active y se desactive.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado ALFREDOSKY

  • PIC12
  • **
  • Mensajes: 95
Re: Tarea dentro de otra tarea
« Respuesta #5 en: 31 de Julio de 2014, 18:31:58 »
Muy valiosa información jhozate y jeremylf, siempre es bienvenida toda sugerencia, observación y/o idea, les agradezco; jeremylf, estas aplicaciones las tenia en mente haciendo uso de las librerías de microchip, las lleve a cabo sin rtos, pero al hacerlos correr, todo colapsa, por eso migre al rtos.

jhozate, muy interesante lo que me comentas, en realidad necesito ahondar mas en el estudio de cómo funciona rtos, esto que dices no lo sabia, usare tu info como punto de partida  :-/

Desconectado ALFREDOSKY

  • PIC12
  • **
  • Mensajes: 95
Re: Tarea dentro de otra tarea
« Respuesta #6 en: 14 de Agosto de 2014, 17:09:54 »
Bueno, me he leído todo el libro Sistemas Empotrados en Tiempo Real de José Daniel Muñoz Frías, tengo las cosas algo mas claras pero sigo teniendo muchísimas dudas de como realizar lo que plantee inicialmente para mi app, por una lado veo que se podria hacer usando interrupciones(asociando la intervención del usuario en la pantalla con una interrupción, que supongo puede ser una interrupción de E/S o I/O), otra solución podría ser bloqueando la tarea encargada de la comunicación TCPIP pero colocandolo en cola y dejar libre ejecuación a la tarea encargada de la interfaz gráfica, y solo cuando presiono el botón diseñado en la interfaz para este propósito, cambiar la prioridad de ejecución, de tal manera que se ejecute la tarea TCPIP y bloquee la tarea gráfica; una vez que se termine la tarea TCPIP, volver a cambiar el contexto(invertir el orden de ejecución) y volver a bloquear la tarea TCPIP. Esto suena de maravillas pero llevarlo a lo real no me parece sencillo, en ninguno de los casos; si alguien mas tiene alguna sugerencia de cómo realizar estas labores siéntanse libre de escribir en este hilo...mientras tanto seguiré documentandome e intentando algunas soluciones alternativas :shock:

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Tarea dentro de otra tarea
« Respuesta #7 en: 30 de Septiembre de 2014, 10:27:07 »
Mi primera recomendación al respecto es que estudies el libro de FreeRTOS o que en su defecto leas la página web. El libro es muy bueno porque tiene una serie de ejemplos que si los sigues te harás una idea muy clara de como funciona un RTOS y que cosas puedes hacer realmente con él.

Respecto de tus dudas:

Ejecutar una tarea dentro de otra: Es un poco raro ponerlo de ese modo. Lo normal es que las tareas estén creadas y operativas mientras el sistema está operativo. En sistemas empotrados es poco frecuente tener que crear y destruir tareas de forma dinámica. Así que una tarea en principio se ejecutaría para siempre (mira el prototipo típico de una tarea en FreeRTOS). Ahora bie, si una tarea se ejecuta en un ciclo infinito ¿Cómo se hace para que se detenga y arranque cuando hace falta?. Lo normal es utilizar las funciones de la API y los objetos (no confundir con el concepto de objeto de la POO como en C++) del RTOS  para IPC (Inter Process Communication). Así FreeRTOS dispone de semáforos, colas y funciones de demora.

En tu caso podrías declarar una tarea que actuaría como "Servidor Gráfico" Esta tarea simplemente está esperando mensajes que le envían a una cola que es su interfaz de entrada. Si no hay mensajes la tarea estará bloqueada en la cola hasta que un mensaje llegue a ella. La llegada del mensaje libera a la tarea que lo procesa (cambia lo que se muestra en pantalla) y luego vuelve a preguntar por un mensaje, mientras haya mensajes los procesa, cuando no haya el RTOS la bloquea.

Luego tendrías un driver para atender la interacción del usuario con la pantalla. Supongo que funciona mediante algún tipo de servicio de interrupción. Aquí puedes tomar dos estrategias (1) si el procesamiento es básico bastará con enviar un mensaje desde la ISR hacia el servidor de pantalla u otra tarea encargada de procesar la acción. Este tipo de procesamiento es poco común porque es usual que el procesamiento de la acción requiera bastante tiempo de procesamiento. Así que (2) envias un mensaje hacia otra tarea encargada de procesar la acción del usuario y ésta sará en última instancia quién envíe un mensaje al servidor de ventanas.

Así de simple es la cosa, al menos en los aspectos básicos, así que ahora a dominar el uso de semáforos y colas.

Dudas por aquí
Saludos
Reinier



 

anything