On 14 Apr 1999, Kenneth Jacker wrote:

> Say rt_task_make_periodic requests a RT task to run every 100ms, but
> the task (unknowingly) requires 125ms to run.  Or another scenario: a
> RT task is scheduled at a rate faster than the RTL scheduler is able
> to repeatedly invoke it.
> 
> Can these situations be detected at runtime?  If so, how?
> 

Use the rdtsc() instruction, for i586-class machines and above,
which provides a counter tied to the CPU cycle clock. You can make a
couple calls to this instruction on each side of your task, or some
sub-part of your task, take the difference and calculate back to a
meaningful time unit by knowing the CPU speed (200 MHz PPro = 5ns/rdtsc()
unit, for example).

You can find the rdtsc() instruction in
/usr/include/linux/include/adm-i386/system.h

If you need to estimate the CPU clock, you can use something like

/* Code lifted from the joy-analog driver of Vojtech Pavlik 1999 */ 
#define GET_TIME(x)     __asm__ __volatile__ ("rdtsc" : "=a" (x) :: "dx" )
int cpu_speed_kHz(void)
{
        unsigned int t1, t2, t3;
        unsigned long flags;

        save_flags(flags);
        cli();
        GET_TIME(t1); /* GET_TIME is your rdtsc() macro */
        udelay(1000);
        GET_TIME(t2);
        GET_TIME(t3);
        restore_flags(flags);

        return CPU_clock_kHz = (t2-t1) - (t3-t2);
}

*** NOTE *** : For RTL modules, this should be called in the init_module()
function only!!!! (Just store the speed away in a global).

-Don

--- [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