logger
Colapsar columna

Menu Usuario -

Hola, Visitante
avatar


Mas Activos -

nocturno
Mensajes: 1685
djfreeman
Mensajes: 269
Meta
Mensajes: 254
spiderman
Mensajes: 201
residente
Mensajes: 164

Autor Tema: Programación en paralelo(threads) para Pics  (Leído 1057 veces)

Desconectado Jordaker

  • Nuevo fichaje
  • *
  • Mensajes: 2
Programación en paralelo(threads) para Pics
« en: Abril 08, 2010, 21:53 »
Hola a todos. Llevo poco más de 1 año siendo usuario de vuestra magnífica comunidad, pero nunca me había decidido a añadir algo interesante o no (puesto que hay profesionales aquí que a mi lado yo parezco una hojita en pleno suelo).

Pero hoy os voy a traer algo interesante. Antes de nada, se trata de programación en C.

¿De qué se tratará? Pues de la programación mediante threads o hilos de programación en paralelo.

Todos los que alguna vez hayamos dado diseño digital sabemos que eso es imposible, una unidad aritmética sólo podría hacer un cálculo cada vez, pero es posible "entrelazar" procesos para que, de forma más o menos compleja, puedan hacer dos tareas en paralelo, e incluso establecer una serie de preferencias entre hilos para que se ejecuten algunos hilos más frecuentemente que otros (un símil a como se hacía con los procesadores mononúcleo en ordenadores multitarea)

Rebuscando cosas interesantes por internet, encontré esto:

http://www.romanblack.com/PICthread.htm

Un tipo que pretendía lo que os comento, pero en inglés, y como aquí la lengua anglosajona no la practicamos, os traduzco por encima más o menos lo que comenta.

Resulta que si pretendemos hacer paralelismos en pic, pero poseemos funciones que consumen gran cantidad de tiempo y otras que no consumen tanto pero que son más importantes o más necesarias que las primeras, pues habrá que inventar alguna manera posible de poder intercalar ambas de forma lo más sencilla para el programador, que no implique ni un gasto de memoria excesivo, ni tampoco un tiempo de selección de hilo y/o proceso.

Pues al señor roman black este se le ocurrió que, mediante una tontería muy grande de #defines, podríamos.

Se inserta el siguiente código al principio de nuestro pic y luego pongo un ejemplo de cómo funciona:
Código: [Seleccionar]
unsigned char secuencia[NUMERO_DE_HILOS];
unsigned char secuencia_hilo;
unsigned char temporizador_secuencia_hilo;
#define COMIENZA_HILO(_valor_) secuencia_hilo = secuencia[_valor_]; temporizador_secuencia_hilo = 0; if(secuencia_hilo == temporizador_secuencia_hilo) {
#define PAUSA_HILO } temporizador_secuencia_hilo++; if(secuencia_hilo == temporizador_secuencia_hilo) {
#define TERMINA_HILO(_valor_) } secuencia[_valor_]++; if(secuencia[_valor_] > temporizador_secuencia_hilo) secuencia[_valor_] = 0;
NUMERO_DE_HILOS habría que sustituir por la cantidad deseada, generalmente suelen ser 2 o 3 hilos generalmente.

La pregunta del momento: ¿Y esto para qué?

Pues para lo siguiente:

Tenemos un pic que necesita hacer varios cálculos intensos (como una conversión analógico digital, por ejemplo) que requieren varios cientos de ciclos de reloj y varios cálculos más livianos (ligeros) que muestren en pantalla los resultados, por ejemplo.

El código sería algo tal que así:

Código: [Seleccionar]
int main(void)
{
while(1)
{
ConversionA_D1();
ConversionA_D2();
calculo_ligero1();
calculo_ligero2();
MostrarEnPantalla();
}
return 0;
}

Se tendría que en cada iteración siempre hace 2 conversiones analógico-digital (como se había especificado en el ejemplo) y muestra en pantalla 3 cálculos ligeros (no estaba inspirado para poner un nombre). Esto es un problema cuando se requiere mostrar en pantalla, como se había especificado en el ejemplo, de forma muy frecuente, mediante esta forma no se podría hacer eficiente y siempre se obtendrían "parones" en la visualización, no siendo una programación eficiente y por tanto, si cobráis por un diseño, no siendo pagados como es debido.

¿Cómo solucionar este entuerto? Pues dividiendo, de forma más o menos inteligente, los procesos para que se produzcan, bajo hilos de programación en paralelo.

Código: [Seleccionar]
int main(void)
{
while(1)
{
// Hilo 1: la conversión analógico digital
COMIENZA_HILO(1);
ConversionA_D1(); // Cálculo extenso
PAUSA_HILO
ConversionA_D2(); // Más cálculo extenso
TERMINA_HILO(1);
// Hilo 2: las sumas
COMIENZA_HILO(2);
calculo_ligero1();
PAUSA_HILO
calculo_ligero2();
/*PAUSA_HILO
calculo_ligero3();
PAUSA_HILO
calculo_ligero4();*/ // Podría seguir añadiéndose más PAUSA_HILO sin problemas
TERMINA_HILO(2);
MostrarEnPantalla(); // Prioridad máxima
}
return 0;
}

Aquí se muestra una implementación mediante los #defines antes mencionados. Se ha dado prioridad máxima a MostrarEnPantalla() por que podría decirse que ha sido el requisito que se nos ha pedido.

Forma de funcionar: MostrarEnPantalla() se ejecuta cada iteración, cada 2 iteraciones se ejecuta 1 de las 2 ConversionA_D y lo mismo con los cálculos ligeros, que como se muestra no hay limitaciones en cuanto a añadir pausas se tratase.

Consumo de tiempo:
  • COMIENZA_HILO(n) = 7-8 Instrucciones PIC
  • PAUSA_HILO = 5-6 Instrucciones PIC
  • TERMINA_HILO(n) = 6 Instrucciones PIC

Espero que os sirva de utilidad.

Un saludo.

Desconectado Meta

  • MicroPICadicto
  • ****
  • Mensajes: 254
  • http://electronica-pic.blogspot.com
    • Electrónica PIC
Re: Programación en paralelo(threads) para Pics
« Respuesta #1 en: Abril 09, 2010, 00:07 »
Muy bueno.

Juraría que esta idea salió con los PIC32.

www.mypic32.com

saludo.

Desconectado nocturno

  • Administrator
  • MicroPIC Gurú
  • *****
  • Mensajes: 1685
    • MicroPIC
Re: Programación en paralelo(threads) para Pics
« Respuesta #2 en: Abril 09, 2010, 07:03 »
Muchas gracias por el hilo y por la información que nos aportas, Jordaker.

Eso que has explicado se llama RTOS (Real Time Operating System) y hay muchas implementaciones para PIC y para otros micros.

Algunas de ellas son Free y muy famosas, como FreeRTOS o OSA, y por cierto muy potentes.

Sin ir más lejos, mira lo que alguien ha conseguido sacar de un simple PIC16F88 gracias al OSA:
http://www.youtube.com/watch?v=Ii7-orwG8F0

Y esto más impresionante aún con un sencillo 18F2550:
http://www.youtube.com/watch?v=PZjuyCuH7Ac

En estos momentos estoy a punto de meterme de lleno con RTOS, así que espero poder ir publicando cosas en breve.

Nuevamente agradezco que hayas abierto el hilo
Un saludo desde Sevilla, España

Desconectado Meta

  • MicroPICadicto
  • ****
  • Mensajes: 254
  • http://electronica-pic.blogspot.com
    • Electrónica PIC
Re: Programación en paralelo(threads) para Pics
« Respuesta #3 en: Abril 09, 2010, 18:27 »
Buenas:

Se están poniendo de moda el 16F88 y cada vez estoy convencido que es el sutituto del 16F84A.

Mira en la página 71 sobre cual es el sustituto del 16F84A, del 16F876A/77A, etc.

Ver manual.

Descargar PDF.

Saludo.

Desconectado Jordaker

  • Nuevo fichaje
  • *
  • Mensajes: 2
Re: Programación en paralelo(threads) para Pics
« Respuesta #4 en: Abril 11, 2010, 01:07 »
Muchas gracias por el hilo y por la información que nos aportas, Jordaker.

Eso que has explicado se llama RTOS (Real Time Operating System) y hay muchas implementaciones para PIC y para otros micros.

Algunas de ellas son Free y muy famosas, como FreeRTOS o OSA, y por cierto muy potentes.

Sin ir más lejos, mira lo que alguien ha conseguido sacar de un simple PIC16F88 gracias al OSA:
http://www.youtube.com/watch?v=Ii7-orwG8F0

Y esto más impresionante aún con un sencillo 18F2550:
http://www.youtube.com/watch?v=PZjuyCuH7Ac

En estos momentos estoy a punto de meterme de lleno con RTOS, así que espero poder ir publicando cosas en breve.

Nuevamente agradezco que hayas abierto el hilo


Rtos es otra filosofía diferente, creo que se basan más en timing y en ajustar lo más que se puedan los hilos a un tiempo determinado de ejecución, tanto si lo han conseguido, como si no.

Con la ligera pincelada que he puesto aquí sobre lo que el señor Roman Black hizo solo quería enseñar a los programadores de pic en C que existen sutiles maneras de poder hacer implementación en paralelo sin tener que aprenderse toda una nueva librería. De todas formas estoy al tanto de eso que mencinoaste, Nocturno, y si vas a ponerte con Rtos me encantaría ver tus tutoriales.

Creo haber dicho que la implementación está pensada para hilos pequeños y algún que otro grande (si se sabe poner bien), pero no para hilos muy grandes (con más de 255 pausas, por haber definido todos los valores con char).

También como ha dicho el usuario Pin está mejor pensado para pics de cuanto más ancho de palabra mejor (con pic12 funciona a las mil maravillas y no retrasa en absoluto la ejecución del programa, esas mediciones de tiempos que especifiqué están tomadas con pic12), pero con pics mayores irá, ciertamente, mejor.

Un saludo y gracias por haber acogido con tan buenas expectativas mi aportación.