none
Programar un controlador o evento timer de microsegundos

    Question

  • Hola,

     

    Necesitaria programar un controlador o evento timer de unos pocos microsegundos. El controlador de visualbasic Timer es de 1 milisegundo, pero no es suficiente. Navegando por las Apis de windows, también he comprobado que los timer disponibles, son también de 1 milisegundo como muy poco. ¿alquien sabe como hacerlo?

    Estoy intentando programar una clase que acceda al reloj del sistema mediante la API QueryPerformanceCounter, pero no parece ser lo suficientemente rapido.

    Alguien me puede ayudar? Gracias

     

    crobgon@hotmai.com

    Wednesday, September 12, 2007 6:21 AM

Answers

  • Hola,

     

    Por si alguien le interesa, en el foro de VB en ingles me han constestado que windows no es un sistema en tiempo real, y la minima precision en tiempo es milisegundos. Microsegundos seria imposible.

     

    Saludos,

     

    crobgon

     

     

     

     

    Friday, September 14, 2007 5:47 AM

All replies

  • Hola Crobgon,

    Cualquier componente que puedas utilizar en Visual Studio esta diseñado pensando en aplicaciones de escritorio, web o moviles. Es dificil pensar en una aplicacion que esta procesando funciones en un cadencia de menos de 1ms. Ese tipo de procesos estan a menudo asociados a un Microcontrolador o Procesadores de señal. Si te parece concretar mas podemos ver si se nos ocurre algo que pueda ayudarte.

     

    Saludos,

    Pep Lluis,

     

     

    Wednesday, September 12, 2007 8:06 AM
  • Hola,

     

    Es una aplicacion que necesita mayor resolucion de 1 ms, como 100 us, es decir 10 veces más rápida que el controlador timer que ofrece visual basic. Cada vez que el evento se produzca, ha de hacer una tarea especifica. Como el timer que ofrece visual studio es de 1 ms, habia pensado en programar cualquier tipo de ocx o controlador con lenguaje de alto nivel y poder usarlo con visual basic, que es en lo que se esta programando la aplicacion final. El problema es que no se por donde empezar. Quizá me puedas aportar alguna idea al respecto.

     

    Quizá con ningun lenguaje de alto nivel se pueda provocar una interrupcion tan rapida y haya que usar ensamblador? o quizá un dispositivo externo? quiza exista alguna aplicacion en tiempo real para visual basic que la use? algun equipo de adquisicion de datos?

     

    Muchas gracias por contestar.

     

    crobgon

     

     

     

     

     

    Wednesday, September 12, 2007 8:27 AM
  • De hecho no creo ni que puedas hacerlo con un procesador normal, ya que el timeslice suele estar entre los 14 y 45 ms dependiendo del procesador y de la versión de Windows.

    De hecho, haz esta prueba:

                TimeSpan stop;
                TimeSpan start;
                Int64 ticks1,ticks2;
                List<Double> lista = new List<double>();
                Double t;
                System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;
                for (int i = 0; i < 1000; i++)
                {
                    ticks1 = DateTime.Now.Ticks;
                    System.Threading.Thread.Sleep(4);
                    ticks2 = DateTime.Now.Ticks;

                    start = new TimeSpan(ticks1);
                    stop = new TimeSpan(ticks2);
                    t = stop.Subtract(start).TotalMilliseconds;

                    if (!lista.Contains(t)) lista.Add(t);
                }
                Console.WriteLine("Valores:");
                foreach (Double d in lista)
                {
                    Console.WriteLine(d);
                }

                Console.ReadKey();


    Ese código, sobre mi máquina PIV HT con win2k unas veces da 0 y otras 10.0147 clavado en 1000 iteraciones, dependiendo del timeslice, donde lo pilles y el tiempo que pongas bailas en una banda u otra. El caso es que pones 1ms y el resultado es el mismo, ahora,  parece que 10.0147 seria mi timeslice, ahora si pongo 11ms ya nunca es 0 Stick out tongue

    Por lo menos hasta donde yo se sobre este tema, que no es mucho, pero cualqueir aclaración al respecto es bien venida pues me interesa mucho !!!

    Un saludo.


    Wednesday, September 12, 2007 9:37 AM
  • Hola,

     

    Yo he probado con visual basic y las apis de windows a leer cuanto tiempo tardaría entre instruccion e instruccion en un bucle, y tarda alrededor de 0.8 microsegungos en ejecutar 2 instrucciones seguidas de peticion de lectura  (con QueryPerformanceCounter, que accede a los ciclos que cuenta el micro). 

    El siguiente codigo lo he realizado para intentar crear un evento o algo que salte a los 100 microsegundos. El bucle while lo hace 200 veces hasta alcanzar los 100 microsegundos.

     

    mIInterval = 100 ' microsegungos

    i = 0


                QueryPerformanceFrequency Freq
                QueryPerformanceCounter Ctr1
                QueryPerformanceCounter Ctr2
                valor = (Ctr2 - Ctr1) * 1000000 / Freq
                While valor < mlInterval
                    QueryPerformanceCounter Ctr2
                    valor = (Ctr2 - Ctr1) * 1000000 / Freq
                    i = i + 1
                    Wend
                Debug.Print "("; Ctr1; "-"; Ctr2; ")-"; valor; " microsegundos"; "ciclos"; i

     

     

    El caso es que mientras realiza este bucle, el sistema está ocupado en esto solo y no dejaria realizar las otras aplicaciones con lo que sobrecargaría el sistema. Si introduzco la palabra Doevents en el codigo para permitir que el sistema realice mas operaciones, entonces ya no lo consigue y se queda en 600 microsegundos o más, dependiento de cuántos eventos o tareas tenga que atender.

     

    No tengo ni idea de como hacerlo. Seguro que hay otras maneras en lugar de acceder al reloj del sistema, supongo que librerias de manejo de datos en tiempo real. ¿Se pueden programar el timer del micro directamente con visual basic? que resolucion tiene el timer del micro para provocar interrupciones?

     

    Quizá la solucion sea provocar un evento en un puerto y sincronizar otro dispositivo externo con esta señal para que te de una entrada de 100 microsegundos (o sea, un divisor de frecuencia en toda regla, pero externo), pero ignoro si esto se puede hacer.

     

    Me estoy empezando a mosquear con este asunto.

     

    Saludos,

     

    crobgon

     

     

     

    Wednesday, September 12, 2007 10:09 AM
  • Humm claro, veo que estas midiendo lo que tarda cada instrucción pero lo que quieres es poder ejecutar una instrucción cada X microsegundos, y eso es lo que no se si se puede hacer, es decir, que no se si el sistema es capaz de parar unos microsegundos únicamente y no un timeslice completo, pues un timer dispara, espera, dispara, espera, ..etc.. y no se si esa espera puede ser tan pequeña.

    Es un tema francamente interesante pero no se si .NET se ideo para esa precisión Stick out tongue

    Pregunta en los foros internacionales del MSDN en el de CLR, hay gente bastante puesta en esas cosas, por ejemplo Peter Ritchie ó nobugz.

    Un saludo.
    Wednesday, September 12, 2007 11:13 AM
  • me puedes indicar donde exactamente? gracias

     

    Wednesday, September 12, 2007 11:57 AM

  • http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=44&SiteID=1

    Aunque igual ves más oportuno ponerlo en alguno de .NET Development

    http://forums.microsoft.com/MSDN/default.aspx?ForumGroupID=12&SiteID=1


    Yo ya me has hecho dudar lo del timeslice y lo esty preguntando también Big Smile

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2129360&SiteID=1


    Un saludo.


    Wednesday, September 12, 2007 12:52 PM
  • muchas gracias!!!

    Wednesday, September 12, 2007 12:55 PM
  • De nada ;D
    Wednesday, September 12, 2007 2:01 PM
  • El caso es que nadie me ha contestado aun. Alguien sabe algo de esto???

     

    Existe alguna libreria para menjo de datos en tiempo real???

     

    Gracias

     

     

    Thursday, September 13, 2007 10:59 AM
  • Hola,

     

    Por si alguien le interesa, en el foro de VB en ingles me han constestado que windows no es un sistema en tiempo real, y la minima precision en tiempo es milisegundos. Microsegundos seria imposible.

     

    Saludos,

     

    crobgon

     

     

     

     

    Friday, September 14, 2007 5:47 AM
  • Hola Crobgon...leiste esto?

     

    'Cualquier componente que puedas utilizar en Visual Studio esta diseñado pensando en aplicaciones de escritorio, web o moviles. Es dificil pensar en una aplicacion que esta procesando funciones en un cadencia de menos de 1ms. Ese tipo de procesos estan a menudo asociados a un Microcontrolador o Procesadores de señal. Si te parece concretar mas podemos ver si se nos ocurre algo que pueda ayudarte'

     

    Supongo que la solucion continua siendo usar un Microcontrolador.

     

    Friday, September 14, 2007 9:29 AM
  •  

    Yo lo que tengo entendido es que es posible que siendo el ciclo de reloj en una amplitud demasiado pequeña es posible que la señal le pase por lo alto al procesador.

     

    Pero tenemos espectro de solucion, la cosa es si alguno acopla.

     

    Hemos visto que tenemos al menos la simplificación a 2 soluciones

    Hemos visto que windows no es a tiempo real.

     

    Sabemos que tiempo real significa que si la respuesta no es al momento la respuesta

    no es valida

    Lo que pasa que tiempo real y tiempo normal hablando en terminos de ciclo de reloj

    contra o entre mediante o como sea tiempo normal del reloj de mano o segundos de sodio

    como querais mientras me entendais y yo no me lio.

    Concluyo antes de liaros con una cuestion.

     

    Os valdria con solamente en el caso de que la respuesta no sea la que buscamos: 0 o 1

    en ese caso esperar a otro ciclo que sí que responda oportunamente....

    Weno, es un poco una xapuza que se me ocurre pero de eso se trata y sistema a tiempo

    real si  no tenemos este hilo va al fondo.

     

    Quizás estoy yendome por las ramas porque yo solo quiero un timer de 3 segundos en aspx

    y entre aquí despistado ....

    Por dejar mi opinion.

     

    Un saludo.

     

    weno el codigo es bien sencillo

     

    un if o un bucle infinito... realmente no se

    antes que poner tonterias no pongo nada

    serio pero lo apunto:

     

    while a= true or false

    if a = true

    a= false

    ...' --exit si procede

    else

    a= true

    ...' --exit si procede

    end fi

    end while

     

    Wednesday, February 13, 2008 9:51 PM