endianness : Re: timer.c and ckinit.c Re: Timer resolution et al : Read_timer()

sashti srinivasan svasn_rtems at yahoo.com
Sat Mar 13 09:36:07 UTC 2004


--- Adrian Bocaniciu <a.bocaniciu at computer.org> wrote:
> 
>          Hi,
> 
> today I have looked at the sources of RTEMS 4.6.0 so
> now I know what you 
> were asking about.
> 
> The file
>
"rtems-4.6.0/c/src/lib/libbsp/i386/pc386/clock/ckinit.c"
> 
> contains the RTEMS clock driver, that initializes
> correctly the 8254 PIT 
> to generate an interrupt that will call
> "rtems_clock_tick()" every 
> BSP_Configuration.microseconds_per_tick.
> 
> As you can see in the code, the frequency of 8254
> interrupts can be 
> "Clock_isrs_per_tick" times higher than the
> frequency of the ticks, but 
> that variable is initialized to "1", so normally the
> two frequencies 
> will be the same.
> 
>     8254 is initialized in mode 2 (TIMER_RATEGEN),
> in this mode if you 
> initially load the timer with N, it will count in
> the sequence N, N-1, 
> N-2, ... 3, 2, 1, N, N-1 ... which has the period N
> and generates 
> interrupts at the transition from 1 to N, so the
> count of clock periods 
> from last interrupt is N-(value read from timer 0). 
> In my last message 
> I wrote a mistake, timer 0 is indeed the one that
> generates the 
> interrupts, so the code is correct.
> 
> In conclusion, if you just want to measure precisely
> some time interval, 
> it is enough to get the number of RTEMS ticks and to
> also read timer 0  
> before and after whatever you want to measure. 
> However the following 
> precautions must be observed: you must first get the
> ticks, then read 
> 8254, then get again the ticks and check if the
> ticks have been 
> incremented, otherwise you may obtain inconsistent
> values.  Also, when 
> reading 8254, you must write first to it the timer
> latch command, to 
> freeze the value that will be read.  See the 8254
> datasheet at 
>
"ftp://download.intel.com/design/archives/periphrl/docs/23124406.pdf".
> 
> 
> The file
>
"rtems-4.6.0/c/src/lib/libbsp/i386/pc386/timer/timer.c",
> has 
> two sections, only one of each is compiled
> conditionally, depending if 
> "pentium" is defined or not.  The function "rdtsc"
> that you previously 
> asked about is in the "pentium" section, so it is
> not used on older CPU's.
> 
> When using 8254, for 386/486, Ttimer_val is
> incremented by each 
> interrupt in the assembler file 
>
"rtems-4.6.0/c/src/lib/libbsp/i386/pc386/timer/timerisr.S".
> 
> 
> Because for non-Pentium CPU's the file "timer.c"
> reinitializes 8254 
> differently than "ckinit.c" and with a different
> ISR, these two modules 
> cannot be used simultaneously.  I suggest that
> instead of using 
> "timer.c" you should copy the procedure "Read_timer"
> from line 260 in 
> file timer.c (the non-Pentium version) in a source
> file of your own, 
> that you should link with your tests.  Then you
> should replace in it 
> "US_PER_ISR" with
> "BSP_Configuration.microseconds_per_tick" and 
> "Ttimer_val" with  "_Watchdog_Ticks_since_boot".
> 
> Pay attention to the fact that "Read_timer", as
> written in "timer.c" 
> works right ONLY if it is called with the interrupts
> disabled.  
> Otherwise you should do as I have written above and
> read 
> _Watchdog_Ticks_since_boot both before and after
> reading 8254 and 
> compare the values for equality and correct the
> values, if necessary 
> (usually it is easier to read the time once more
> than to figure how to 
> correct the values).
> 
>                    Best regards !
>    
> 
> 
> 
> 


__________________________________
Do you Yahoo!?
Yahoo! Mail - More reliable, more storage, less spam
http://mail.yahoo.com



More information about the users mailing list