Autor Tema: como medir los tiempos de las instrucciones en C#  (Leído 8666 veces)

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
como medir los tiempos de las instrucciones en C#
« en: 01 de Agosto de 2011, 13:15:36 »
Hola a todos, quisiera saber si se puede(y si se puede como hacerlo) medir cuanto dura una instruccion en C#, estoy haciendo una interfaz para graficar datos que vienen desde el pic por rs232, pero me da problemas si los datos que envio son muy rapidos. lo que hace mi programa es lo siguiente.

en cuanto mi programa recibe los datos por RS232 envia a una funcion que hace unas operaciones matematicas y luego dibuja una linea.

el problema que tengo es que desde el pic envio una cadena cada 5ms, en teoria espero que mi programa reciba esa cadena, haga sus operaciones, dibuje y luego espere la siguiente cadena, pero cuando reviso lo que recibe la PC recibe como 6 o 7 cadenas juntas desde el pic.

si aumento el tiempo de envio desde el pic 10 veces, es decir, envio datos cada 50ms lo realiza correctamente.

alguna sugerencia de porque pasa esto??

Saludos


"Nada es imposible, no si puedes imaginarlo"

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #1 en: 01 de Agosto de 2011, 13:22:58 »
Hola, mas que medir el tiempo de las "instrucciones" de C# podrías implementar los siguiente:

  • Bufferear la entrada de info del RS232, es decir por un lado metes la data que viene del PIC y por otro lado la procesas y graficas
  • Podrías implementar algún protocolo de comunicaciones ( Xon-Xoff o por hardware de manera tal de avisarle al PIC que no estas listo para recibir datos

De las dos, la mejor sería la primera porque nunca detendrías el flujo de datos del PC hacia el PC.

Saludos !

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #2 en: 01 de Agosto de 2011, 13:28:47 »
como haria lo primero, entiendo que te refieres a realizar las acciones por separado no?.
tengo un evento que esta atento a la recepcion de datos, y en ese momento llamo a mi funcion para graficar
"Nada es imposible, no si puedes imaginarlo"

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #3 en: 01 de Agosto de 2011, 14:01:09 »
Hola amigo, yo trabajo CCS en Mplab, y para medir los tiempos de las funciones utilizo el reloj del Mplab (StopWatch), es muy preciso

Saludos.



Creí que era, programa para PIC.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #4 en: 01 de Agosto de 2011, 14:05:32 »
jeje, no lo que quiero es hacer algo parecido pero en C#, quiero saber si a la pc le da tiempo de realizar las operaciones antes de que le llegue la siguiente cadena de datos
"Nada es imposible, no si puedes imaginarlo"

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #5 en: 01 de Agosto de 2011, 14:27:55 »
Hola, disculpa la demora en responder, no programo en C# con lo cual no puedo darte la forma exacta de como hacerlo, pero este tipo de problemas se resuelven con colas o Queues. Te pego algunos links

http://es.wikipedia.org/wiki/Cola_(inform%C3%A1tica)

http://es.wikipedia.org/wiki/Teor%C3%ADa_de_colas

http://msdn.microsoft.com/es-es/library/system.collections.queue(v=vs.80).aspx

Saludos !
 

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #6 en: 01 de Agosto de 2011, 14:31:20 »
te refieres a usar listas?, asi el programa lo va guardando todo y lo va graficando conforme lo vaya leyendo no del buffer directamente, si no de la lista asignada, entendi??
"Nada es imposible, no si puedes imaginarlo"

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #7 en: 01 de Agosto de 2011, 14:34:42 »
Exactamente como lo dices, aunque se podría realizar con listas lo mejor sería usar colas.

Saludos !

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #8 en: 01 de Agosto de 2011, 14:36:49 »
ook, muchas gracias. voy a probar.

tambien encontre un error en mi programa, estaba leyendo el buffer con "ReadExisting()"

con lo cual no se donde termina mi cadena, lo cambie por ReadLine(), asi me deberia leer hasta donde encuentre un salto de linea, espero funcione
"Nada es imposible, no si puedes imaginarlo"

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #9 en: 01 de Agosto de 2011, 14:42:55 »
Good luck !

Saludos !

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #10 en: 01 de Agosto de 2011, 15:01:39 »
pues ya probe, y si me ayudo el poner el comando para leer la linea, asi desde el pic envio un \n para indicar que termino el envio.

estoy enviando los datos cada 10 ms, a una velocidad de 115200.

aunque aun sigo con la duda de si es posible saber cuanto tarda la PC en ejecutar algunas intrucciones. acepto sugerencias   :mrgreen: :mrgreen:

muchas gracias por la ayuda.
"Nada es imposible, no si puedes imaginarlo"

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #11 en: 15 de Agosto de 2011, 09:27:24 »
Saber cuanto demora una instrucción completa de un lenguaje e alto nivel como C#  será difícil porque es muy probable que el código generado sea no lineal (tenga saltos, lazos y condicionales) lo que hace difícil determinar cuantas instrucciones en lenguaje máquina hay. Las técnicas que existen se dedican a buscar el caso peor que puede seguir la secuencia de programa, pero mientras más abstracción incorpora el lenguaje, más difícil se vuelve el análisis.

Luego tienes los problemas de los pipelines, las memorias cache y las optimizaciones de los procesadores actuales (ejecución fuera de orden, ejecución especulativa, varios núcleos, etc). Suma a ello el Sistema Operativo, los de propósito general son no determinísticos así que no se puede saber por análisis cuando realmente se ejecuta tu código y cuanto tiempo tardará en completarse.

En mi opinión, no te molestes con ello y sigue trabajando en lo que han comentado aquí. Si fuese tu, separaría la interfaz de usuario de la comunicación con dos hilos de ejecución en la aplicación. Esta es una forma excelente de separar dos funciones bien diferentes, es lo que en ingeniería de software se llama separar el negocio de la interfaz. Trata de hacer eso, más lo que ya tienes de usar estructuras de datos como buffers y verás que el programa irá casi siempre bien.

Saludos
Reinier

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #12 en: 15 de Agosto de 2011, 10:05:02 »
muchas gracias por la explicacion reiniertl, ya le hice algunos cambion al programa y funciona mejor, asi como dces tiene un buffer, lo que hago es graficar datos de un acelerometro que envio desde el pic, la idea era que fuera en tiempo real. y funciona bien si mi tiempo de muestreo no es muy rapido.

en el peor de los casos mi graficacion es algo lenta, pero ya no pierdo datos. aun no esta terminado, pero por ahora me funciona asi.

"Nada es imposible, no si puedes imaginarlo"

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #13 en: 15 de Agosto de 2011, 10:29:57 »
En mis tiempos de estudiante tuve una tarea parecida, aunque era una tarea para poner en práctica la programación multihilos. Tenía que tomar muestras desde un módulo software productor y luego graficarlos y almacenarlos. Lo que hice fue implementar unas clases de C++ que hacian las tareas. Cada cosa en hilos separados (1 productor, un muestreador un graficador y un almacenador).

De todos el más interesante era el muestreador, se creaba un hilo y este comenzaba a llenar un buffer, cuando el éste se llenaba el hilo se detenía, se registraba en la cola del graficador-almacenador. Además se creaba otro objeto de su mismo tipo que era registrado con el driver de toma de datos, para que nunca estuviese sin un buffer donde poner datos. Cuando el graficador terminaba de vaciar el buffer de un objeto muestreador lo destruia. El productior simulaba algo como tu PIC conectado por el puerto serie.

El objetivo era tener cada módulo trabajando a su ritmo. Lo inetersante es que al hacerlo multihilos, le puedes cambiar las prioridades a los hilos y en la misma aplicación tener cosas que van más ráìdo y cosas que van más lento, eso sin contar que divides los flujos de programas. Es cierto que gestionar este modelo es más complejo porque te hará falta saber utilizar mecanismos de sincronización, aunque con un poco de cuidado se pueden evitar los semáforos y esas cosas. La verdad es que mi trabajo quedó muy bueno, al profesor le gustó mucho sobre todo notar lo confiable que era el trabajo del sistema y la estructura de clases, me gané un excelente esa vez y me ha quedado como una experiencia muy útil. Divide y vencerás, reparte la carga y tendrás aplicaciones confiables, es lo que aprendí de eso.

Te comento que las interfaces de usuario son muy problemáticas porque tienen el inconveniente del usuario interactuando con ellas. Si por ejemplo el usuario decide mover la ventana, tendrás el hilo de ventana bloqueado por el SO hasta que el usuario suelte la ventana en la nueva posición y sea necesario volver a redibujarla. Lo mismo ocurre con los procesos que cambian la ventana, el SO es quién la redibuja, lo que te pone en manos del gestror de ventanas. Lo mejor cuando hay datos que entran por una interfaz como el puerto serie es separar la toma o transmisión de datos de las interfaces gráficas. Además puedes hacer actualizaciones de la ventana en ráfagas, es decir si sabes que tienes un conjunto de puentos que mostrar cada cierto tiempo, puedes decirdir bloquear la ventana y volcar todo el buffer en el gráfico, luego le dices al SO que dibuje la ventana nuevamente (usualmente basta con desbloquear la ventana o el objeto gráfico) y de esa forma disminuyes la acción de refrescamiento.

Saludos
Reinier

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como medir los tiempos de las instrucciones en C#
« Respuesta #14 en: 15 de Agosto de 2011, 20:25:49 »
me parece muy interezante lo que planteas, pero no entiendo muy bien como es eso de "multihilos", me podrias dar algo mas de informacion, o alguna bibliografia para aplicar esto a mi programa

De nuevo muchas gracias por tu aportacion
"Nada es imposible, no si puedes imaginarlo"


 

anything