Is there any possibility that something in the crontab is running at the
same time as your observed "glitches"?

I know that it shouldn't make a difference to RT tasks, but ...

        Norm

> -----Original Message-----
> From: [EMAIL PROTECTED] [SMTP:[EMAIL PROTECTED]]
> Sent: Friday, September 08, 2000 10:23 AM
> To:   rtlinux mailing list
> Subject:      [rtl] Simple thread, massive glitch
> 
> I posted this same problem a couple days ago, and would like to thank
> those of you who helped out, but my glitch still exists. Every now and
> again, my system hangs for ~1ms. Running a periodic thread of any period,
> the glitch is always the same duration: 1.1 to 1.3 ms on one machine or
> .5 to .6 ms on another. I think it's safe to say that the glitch is
> prohibiting me from doing hard realtime processing.
> 
> The code below is very short and simple. It compiles with the standard
> options available as variables in rtl.mk, and the module depends on
> rtl_sched and rtl_time. All you have to do is compile, insert, wait(for me
> 30 seconds is enough), and dmesg.
> 
> Typical dmesg output
> 
> > Delay of     192ns near       0ms
> > Delay of     288ns near      95ms
> > Delay of     352ns near    1609ms
> > Delay of     384ns near    1648ms
> > Delay of     448ns near   23322ms
> > Delay of 1141792ns near  937517ms
> > Delay of 1224000ns near 1530446ms
> 
> You see the two vastly different scales. The first 5 maximum delays are
> fractions of a microsecond, no problem. The later 2 delays are >100
> periods of the periodic task!
> 
> Any advice would be greatly appreciated.
> Thanks in advance - Chuck
> 
> 
> // Stipped down DAQ code - Chuck
>  
> // ***** System headers ***** //
> #include <rtl.h>
> #include <rtl_sync.h>
> #include <time.h>
> #include <pthread.h>
>  
> // ***** System Definitions ***** //
> #define FREQUENCY 100000                    // Thread frequency [=] Hz
>  
> // ***** Function Declarations ***** //
> void *daq_code(void*);                      // DAQ Periodic function
>  
> // ***** Global Variables ***** //
> pthread_t daq_thread;                       // main rtlinux thread
>  
>  
> // Simple thread measures clock 
> void *daq_code(void *param)
> {
>    rtl_irqstate_t irqstate;
>  
>    hrtime_t zero_time,  tick_time, tock_time;
>    long     delay_time, delay,     max_delay=0;
>  
>    zero_time = clock_gethrtime(CLOCK_REALTIME);  // module insert time
>  
>    while (1)      // periodic task, must loop
>      {
>  
>        // Begin DANGER
>        rtl_no_interrupts(irqstate);           // disable all interrupts
>  
>        tick_time = clock_gethrtime(CLOCK_REALTIME);   //check time
>        tock_time = clock_gethrtime(CLOCK_REALTIME);   //check time
>        delay     = (long)(tock_time - tick_time);     //find difference
>  
>        rtl_restore_interrupts(irqstate);      // reenable interrupts
>        // End DANGER
>  
>  
>        if (delay > max_delay)         //is this the biggest delay yet?
>       {
>         // reset delay max
>         max_delay  = delay;           //record new maximum delay
>  
>         // reset time of max, >>20 is ~equal to /1e6
>         delay_time = (long)((tock_time - zero_time)>>20);
>  
>         printk( "Delay of %7ldns near %7ldms\n", max_delay, delay_time);
>       }
>  
>        pthread_wait_np( );            //wait for next period
>      }    
> }
>  
>  
> // ***** Module Standard Functions ***** ///
>  
> int init_module(void)
> {
>    pthread_attr_t attr;
>    struct sched_param sched_param;
>    hrtime_t period, soon;
>  
>    // initialize pthread attributes
>    if( pthread_attr_init(&attr) ) 
>      printk( "Cannot initialize pthread attributes\n" );
>  
>    // modify pthread priority
>    sched_param.sched_priority = 1;
>    if ( pthread_attr_setschedparam (&attr, &sched_param) )
>      printk( "Cannot set pthread priority: 0\n" );
>    
>    // initialize the main thread
>    if( pthread_create (&daq_thread, &attr, daq_code,(void *)1) )
>      printk( "Cannot create pthread\n" );
>  
>    // make the thread run off the CPU clock
>    period = HRTICKS_PER_SEC / FREQUENCY;
>    soon   = clock_gethrtime(CLOCK_REALTIME) + (100 * period);
>    if( pthread_make_periodic_np (daq_thread, soon, period) )
>      printk( "Cannot make pthread periodic\n" );
>  
>    return 0;
> }
>  
> void cleanup_module(void)
> {
>    // destroy periodic thread
>    if( pthread_delete_np(daq_thread) )
>      printk( "Cannot destroy phread\n" );
> }
> 
> 
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> ---
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/rtlinux/
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/

Reply via email to