One quick quenstion about PXA sched_clock resolution?
Nicolas Pitre
nicolas.pitre at linaro.org
Mon Nov 8 21:07:50 EST 2010
On Tue, 9 Nov 2010, rocky wrote:
>
>
>
>
> At 2010-11-08 22:42:56,"Nicolas Pitre" <nicolas.pitre at linaro.org> wrote:
>
> >On Mon, 8 Nov 2010, Uwe Kleine-König wrote:
> >
> >> [added Nico to Cc:]
> >>
> >> On Mon, Nov 08, 2010 at 04:56:37PM +0800, rocky wrote:
> >> > Hi
> >> >
> >> > I'am working on an ARM linux porting project, which need to implement sched_clock of our own.
> >> > have a glance at PXA sched_clock timplementation, puzzled about the following notes.
> >> >
> >> >
> >> > /*
> >> > * This is PXA's sched_clock implementation. This has a resolution
> >> > * of at least 308 ns and a maximum value of 208 days.
> >> > *
> >> > * The return value is guaranteed to be monotonic in that range as
> >> > * long as there is always less than 582 seconds between successive
> >> > * calls to sched_clock() which should always be the case in practice.
> >> > */
> >> >
> >> >
> >> >
> >> >
> >> > PXA series chips have system clock in 3250000/3249600/3686400 HZ.
> >> > I do the math like this:
> >> >
> >> > ####Where does 308 ns come from?
> >> >
> >> >
> >> > ns of one clcok cycle:
> >> > 307.69 (10^9/3250000);
> >> > 307.73 (10^9/3249600);
> >> > 271.26 (10^9/3686400 )
> >> > this is the highest resolution mentioned in above notes;
> >> Seems correct. I think "at least" above means 308 ns or better (i.e.
> >> shorter).
> >> >
> >> >
> >> > ####Where does 582 seconds come from?
> >> >
> >> > 660.76(0x80000000/3250000);
> >> > 660.84(0x80000000/3249600);
> >> > 582.54(0x80000000/3686400 );
> >> Seems correct, too.
> >>
> >> > Question is how does 208 days pop out?
> >> > Can anyone give me some hints?
> >> > thanks
> >> I didn't check it, but I guess after 208 days sched_clock overflows.
> >
> >Yes. And the maximum range is bounded by OSCR2NS_SCALE_FACTOR limiting
> >the returned ns value to 64 - OSCR2NS_SCALE_FACTOR = 54 bits. Hence:
> >
> > 2^54 / 10^9 / 60 / 60 / 24 = 208 days
> >
> >This means that, once every 208 days, you may experience a slight hickup
> >in process scheduling which no one is likely to notice.
> >
> >
> >Nicolas
>
> Hi, nicolas
> Thanks for your kindly replay :)
> #############################################################
> unsigned long long sched_clock(void)
> {
> unsigned long long v = cnt32_to_63(OSCR);
> return (v * oscr2ns_scale) >> OSCR2NS_SCALE_FACTOR;
> }
> #############################################################
> v * oscr2ns_scale is unsigned long long type,
> but BIT63 can never be set, because oscr2ns_scale whill round it up.
No, you misunderstood the code.
By definition, cnt32_to_63() returns 63 valid bits. The 64th bit (the
top bit) should be discarded. So to discard that bit automatically, we
make sure that the value in oscr2ns_scale is even.
But once you compute v * oscr2ns_scale then you have a full 64 bit range
value, not a 63-bit one.. And then the bottom 10 bits are discarded.
Therefore 54 bits remain.
Nicolas
More information about the linux-arm-kernel
mailing list