Autor Tema: EJECUCIÓN SIMULTÁNEA DE RUTINAS  (Leído 5938 veces)

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

Desconectado er_clemen

  • PIC10
  • *
  • Mensajes: 42
EJECUCIÓN SIMULTÁNEA DE RUTINAS
« en: 13 de Enero de 2004, 18:41:00 »
Hola amigos del foro:

La verdad es que uno no deja de ser un novato, pero gracias a todos vosotros, voy avanzando. Una pregunta:

¿Como puedo proceder con PicBasic Pro, para poder ejecutar 2 rutinas simultáneamente, cuando la activación de una entrada asi lo requiera?

En concreto: Si una rutina tarda en ejecutarse 5seg. y en esos 5 seg. otra entrada se activa, debo poder atender esa entrada sin esperar a que el programa retorne a la rutina principal "ESPERA" y sin dejar que esa primera rutina se detenga.

MUCHAS GRACIAS.  

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #1 en: 14 de Enero de 2004, 04:15:00 »
Hola hola,

Se me ocurre que configures esa entrada como interrupción. Si esa entrada se activa saltará la interrupción y tendrás que atenderla, esté donde esté la ejecución del programa en ese momento. Cuando termines de atender a la interrupción, inmediatamente después regresarás al punto del programa donde lo dejaste.
Lo que está claro es que el PIC no puede ejecutar dos instruccíones al mismo tiempo... o sea que por narices la rutina inicial, antes de saltar la interrupción, se detiene... mejor, se queda "congelada" en espera de que acabe la rutina que atiende a la interrupción.

Espero que te ayude algo... a ver si mientras a alguien se le ocurre otra cosa.

Saludos!
Elena

Desconectado felipito1

  • PIC16
  • ***
  • Mensajes: 118
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #2 en: 14 de Enero de 2004, 04:58:00 »
Dentro de esa rutina de 5 seg puede estar preguntando si se presenta alguna novedad en las entradas y definir que hacer, si ejecutar alguna acciòn especial y/o volver a la rutina de los 5seg, teniendo en cuenta el tiempo que gastò en realizar la subrutina y no descuadrar los 5 seg.......la interrupciòn tambièn es buena opciòn.

Desconectado er_clemen

  • PIC10
  • *
  • Mensajes: 42
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #3 en: 14 de Enero de 2004, 22:01:00 »
Gracias a todos:

La verdad es que ya habia pensado en las interrupciones, lo malo es que, como decis, deja de ejecutarse la rutina anterior al salto.

Supongo, que la solucion óptima es definir un "timpo maximo" superado el cual, merezca la pena interrumpir, en vez de esperar a que concluya el proceso...

Si se os ocurre otra, espero vuestras respuestas.

Saludos!

Desconectado pikman

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 679
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #4 en: 14 de Enero de 2004, 22:31:00 »
Bueno, ceo que lo que pretendes el el sueño del pibe, se llama ejecucion paralela, je je, pero ni el mismo pentium 4 todavia puede hacer esto pero a travez de la interrupciones muchos sistemas operativos no hacen creer que mastican chicle y caminan a la vez, y se valen de este importante recurso que es desperdiciado por muchos que utilizan microntroladores, y asi se complican haciendo pollings sobre entradas gastando memoria y haciendo mas lerdo el proceso que manejan teniendo que migrar a microcontroladores mas grandes, por lo que veo  tu problema puede solucionarse utilizando  la interrupcion generada por los timers y la del pin RB0 presente en casi todos los dispositivos 16C/FXX de Microchip o si tienes muchos perifericos los 4 pines del puerto B (RB4:RB7) , entones lo que haces es dentro de un loop realizar la rutina que tarda 5 segundos y cuando se habilita un pin determinado habiltas la interrupcion del timer y dentro de ella ejecutas tu otra rutina, claro que tendras que ver de que manera lo ordenas para que cuando entres en la interrupcion del timer para corregir el tiempo que esta tarde si es que los  tiempos  de tu proceso son criticos,  si la rutina que ejecutas dentro de la interrupcion del timer no es grande por ahi no tiene importancia, pero si no deberas restar los ciclos que consuma mientras este activa la interrupcion para corregir el tiempo de la rutina principal, bueno si me explicas un poco mas de tu proyecto puedo seguro ayudarte, lo que si no programo en picbasic estoy estudiandolo, trabajo en ASM y C de CCS.

un saludo

ARIEL / PIKMAN
saludos
PikMan

Desconectado Neptune45

  • PIC10
  • *
  • Mensajes: 7
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #5 en: 17 de Enero de 2004, 04:52:00 »
Hola,

Se me ocurre una idea parecida a como se gestiona el teclado en un PC, no se como de util te sera:

- 1. Te declaras un buffer, que registrara los eventos que se van producuciendo, sin perder cuenta de ninguno. Sera una pila LIFO.
- 2. Este buffer lo alimentas desde tu rutina de servicio a interrupcion, en el grabaras la informacion necesaria para luego procesar los eventos fuera de la rutina de servicio (Como por ejemplo el tiempo en el que ocurrio).
- 3. En el programa principal (fuera de la rutina de servicio de interrupcion) tendrias un bucle que estaria constantemente consultando el buffer para ver si nuevos eventos se han registrado y procesarlos.

Como veras, este metodo no asegura que se pueda dar una respuesta simultanea a los eventos que quieres controlar, pero te aseguras de que no se te escapa ninguno.

No se si esto te vale, explicanos mas.

Un saludo.
Diego

Desconectado Tec_Claudio_Perez

  • PIC12
  • **
  • Mensajes: 62
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #6 en: 20 de Enero de 2004, 22:23:00 »
Hola a todos,
Hace un tiempo hice la catedra Sistemas Operativos en mi Facultad, pero todo era muy teórico, por lo que para comprender mejor las cosas hice un microkernel de un sistema operativo en tiempo real para un 16F84.
La idea era justamente obtener multitarea (ejecutar dos rutinas a la vez) en un PIC. En mi caso queria recibir y enviar por RS-232 al mismo tiempo (una UART Full-Duplex por soft).
Como se logra el truco: si bien es imposible que el Pic ejecute dos instrucciones al mismo tiempo, ejecutando una instruccion por vez de cada rutina, se logra el efecto de ejecutar las dos al mismo tiempo.
Para hacer esto lo primero que hay que hacer es dividir las rutinas en sus partes minimas. A estas partes minimas se las llama estados. Estos estados forman una maquina de estado finito. En cualquier libro de circuitos digitales secuenciales encontraran info sobre esto. Por lo general se las representa mediante un grafo dirigido.
Las rutinas asi divididas son ejecutadas en forma secuencial por una rutina principal que se llama el Planificador. En el caso de un PIC se simplifican mucho las cosas.
Por ejemplo supongamos que queremos ejecutar dos rutinas en multitarea donde cada rutina lee el estado de un pulsador en RA0 y otro en RA1. Cada pulsador tiene un pullup de 10K,  o sea que normalmente se lee un 1 y al presionarlo se lee un 0.
Con esta configuracion se tienen los siguientes estados.
 
Estado 1: "Esperar que se presione el pulsador"
                SI se presiono,
                    pasar al estado siguiente,
                SINO,
                    volver.

Estado 2: "Se incrementa un contador (antirebote)"
                SI el contador llega a una determinada cuenta,
                        se pasa al estado siguiente,
                        se vuelve el contador a 0,
                        volver,
                SINO,
                        volver.

Estado 3: "Se ha presionado el pulsador y termino el tiempo de rebote
                hacer algo util, por ejemplo encender un led"
                encender un led,
                pasar al estado siguiente,
                volver.

Estado 4: "Esperar que se suelte el pulsador"
                SI se solto,
                           pasar al esto siguiente,
                           volver,
                SINO
                           volver.

Estado 5: "Se incrementa el contador anterior (antirebote)"
                SI el contador llega a una determinada cuenta,
                    se vuelve el contador a 0,
                    se vuelve al estado 1,
                    volver,
                SINO
                    volver.

En la practica el estado de cada rutina se guarda en un registro y en otro el contador de rebote. Por lo que cada rutina utiliza dos registros: Estado y Contador.

La rutina del planificador llama de forma continua a las dos rutinas de forma secuencial :

INICIO:
    Llamar a la subrutina del pulsador 1.
    Llamar a la subrutina del pulsador 2.
    IR A Inicio

Hay que notar que a las rutinas se entra, si hay algo que hacer se hace y se sale, de esta forma se esta entrando y saliendo de cada rutina en forma continua. Cuando mas corto sea lo que haya que hacer mejor, ya que se logra mayor velocidad de respuesta del sistema.

En la practica para ejecutar cada estado se utiliza una tabla de saltos controlada por la variable Estado:

MOVF   Estado, W
ADDWF PCL
NOP
GOTO  Puls1_Estado1
GOTO  Puls1_Estado2
GOTO  Puls1_Estado3

Puls1_Estado1:
.......
           RETURN

Puls1_Estado2:
.......
           RETURN

Y asi sucesivamente... Al trabajar con tablas hay que tener en cuenta si no se traspasa el limite de cada pagina de la memoria de programa, y antes es mejor setear los bits de mayor peso del Contador de Programa, pero lo simplifiqué para mostrar el concepto.

Bueno con esta tecnica logré excelentes resultados, no solo para leer pulsadores, sino tambien teclados matriciales, recepcion y transmision serial y otras cosas mas.

Una cosa interesante es agregar un bit como bandera que permita habilitar o deshabilitar la subrutina. De esta forma se entra a la rutina, pero si el bit esta en 1, significa que no se debe ejecutar o que esta deshabilitada, por lo que se sale inmediatamente.
De esta forma se puede controlar la ejecucion simultanea de cualquier numero de rutinas y cualquier subrutina puede habilitar o deshabilitar a las otras desactivando o activando la bandera.

Bueno, espero que les hay resultado interesante.
Pronto voy a poner el fuente completo en assembler para que lo vean mejor, pero desde ya les digo que ademas de ayudarme a aprobar Sistemas Operativos me hizo ver que los Pic programados de la forma tradicional gastan mucho tiempo esperando algún evento, pero de esta forma ese tiempo se puede aprovechar para hacer otras cosas, por lo que se potencia el pic y pareciera que puede hacer todo al mismo tiempo !
En realidad SI SE PUEDE LOGRAR MULTITAREA EN UN PIC16F84!

Con respecto al sueño del pibe, la forma anterior sirve para cualquier micro, tenga o no tenga interrupciones. En realidad si tiene interrupciones se pueden hacer mas cosas o mejores, en especial si hay tareas criticas. Por ejemplo con la interrupcion del timer se puede asegurar que una rutina se ejecute exactamente cada cierto intervalo, o con la interrupcion externa que alguna otra se ejecute de inmediato en respuesta a un evento externo.

De todas formas el principio es similar. Por ejemplo la interrupcion externa puede cambiar de estado de una subrutina, o la del timer se puede utilizar para determinar intervalos de tiempo y saber cuando se debe enviar o recibir el siguiente bit de una comunicacion RS-232, por ejemplo.

Para apreciar mejor las diferencias de un Sistema Operativo en Tiempo Real (RTOS) con interrupciones y sin ellas les aconsejo la Nota de Aplicacion 585:

http://www.microchip.com/1010/suppdoc/appnote/all/an585/index.htm

Es un poco densa al principio pero fijense en las cosas, o subrutinas que se pueden ejecutar al mismo tiempo en un pic con interrupciones y en otro sin ellas.

Espero que les sirva.

        Téc. Claudio J. Pérez
Ciberar-Sistemas & Desarrollos
            Jujuy-Argentina

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #7 en: 21 de Enero de 2004, 03:54:00 »
Bueno, Claudio tiene toda la razon del mundo. estoy haciendo algo muy parecido a un sistema multitarea con un 877. para ello me sirvo del uso de interrupciones y de un sistema parecido al que comenta Claudio. cuando lo tenga mas avanzado cuelgo el programa en C. Los primeros resultados son muy satisfactorios.

saludos

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #8 en: 21 de Enero de 2004, 10:53:00 »
Hola Amigos, Claudio, muy didactica tu explicacion, y si quieren ir mirando algo de un amigo, el Colo, aqui esta su pequeño sistema operativo para pic
http://www.todopic.com.ar/asm/sistema_operativo/ospic104.txt


Suerte!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado pikman

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 679
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #9 en: 21 de Enero de 2004, 19:52:00 »
Hola, bueno, Claudio mis felicitaciones como dice Norberto muy dicactico lo tuyo, podrias dejar aqui en el foro el codigo del trabajo que realizaste para tomar ejemplo, como digo siempre me he basado en las interrupciones para lograr esto y me parece muy interesante tu trabajo, tambien estuve mirando la pagina de SALVO que no entiendo bien ¿ ellos desarrollan algun RTOS ? o aplicaciones de tiempo real.

Un saludo

Ariel
saludos
PikMan

Desconectado carlyvalente

  • PIC16
  • ***
  • Mensajes: 108
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #10 en: 31 de Enero de 2004, 18:14:00 »
No seria mas facil utilizar dos pics?
Con el mismo reloj supongo que ejecutarian tareas simultaneas con resultados diferentes ante el mismo estimulo.

Desconectado Tec_Claudio_Perez

  • PIC12
  • **
  • Mensajes: 62
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #11 en: 06 de Febrero de 2004, 11:13:00 »
Hola,
En realidad los conceptos antes mencionados sirven para convertir cualquier rutina en multitarea, sin embargo, si usas un Sistema Operativo, de todo esto se encarga él, siendo para el usuario muy simple de utilizar. Esto hace que ciertas rutinas sean del sistema operativo (servicios) y otras sean las rutinas de usuario.

Por ejemplo en el Sistema Operativo que estuve haciendo, agregé rutinas multitarea para:

-Encender y apagar leds.
-Leer el estado de pulsadores, con antirebote por soft.
-Leer un teclado matricial de 4x4.
-Enviar y recibir por RS-232.
-Usar un Display de 7-segmentos de 4 digitos.

El usuario lo único que debe hacer es agregar sus propias rutinas y utilizar los servicios del Sistema Operativo, sin importarle cómo las implementa. Recordemos que el principal objetivo de un Sistema Operativo es facilitar el uso del sistema de computo al usuario!

Luego voy a poner el codigo de la implementación y la primer versión de mi S.O. (antes tengo que agregarle la documentación, ya que por el momento lo entiendo solo yo ).

       Téc. Claudio J. Pérez
interrupt_request@hotmail.com
Ciberar-Sistemas & Desarrollos
          Jujuy-Argentina

Desconectado Nichita

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 86
RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #12 en: 05 de Octubre de 2005, 10:13:00 »
Hola, Claudio tienes más información sobre multitarea en PIC?? alguna parte de tu código que comentabas que puedas compartirlo para poder entenderlo mejor?

Desconectado ElectroVolt

  • PIC10
  • *
  • Mensajes: 22
Re: RE: EJECUCIÓN SIMULTÁNEA DE RUTINAS
« Respuesta #13 en: 07 de Junio de 2013, 21:09:35 »
Hola,
En realidad los conceptos antes mencionados sirven para convertir cualquier rutina en multitarea, sin embargo, si usas un Sistema Operativo, de todo esto se encarga él, siendo para el usuario muy simple de utilizar. Esto hace que ciertas rutinas sean del sistema operativo (servicios) y otras sean las rutinas de usuario.

Por ejemplo en el Sistema Operativo que estuve haciendo, agregé rutinas multitarea para:

-Encender y apagar leds.
-Leer el estado de pulsadores, con antirebote por soft.
-Leer un teclado matricial de 4x4.
-Enviar y recibir por RS-232.
-Usar un Display de 7-segmentos de 4 digitos.

El usuario lo único que debe hacer es agregar sus propias rutinas y utilizar los servicios del Sistema Operativo, sin importarle cómo las implementa. Recordemos que el principal objetivo de un Sistema Operativo es facilitar el uso del sistema de computo al usuario!

Luego voy a poner el codigo de la implementación y la primer versión de mi S.O. (antes tengo que agregarle la documentación, ya que por el momento lo entiendo solo yo <img border="0"  width="15" height="15" src="http://pics.miarroba.com/caretos/frown.gif"> ).

       Téc. Claudio J. Pérez
interrupt_request@hotmail.com
Ciberar-Sistemas & Desarrollos
          Jujuy-Argentina