UInt32 CalibrateDelayLoop() {

 UInt32 low = 1;
 UInt32 high = 10000; // This should be high enough so that at least ONE
tick occurs during this many iterations of the loop
 UInt32 x,y,s,t,d;
 Char buffer[16];

 while (high > low) {
     x = ( high + low ) / 2;
  y = x;

     s = TimGetTicks();

     do {
         t = TimGetTicks();
     } while (t == s);

     // A tick *just* occurred. Now we count until the next.

     while (x) {x--} // The delay loop

     s = TimGetTicks();

     if (s == t) {
         low = y + 1; // Less than a tick occurred during delay, so try
again, but wait longer.
     }
     else {
         high = y - 1;// A tick occurred, so we're over. Try again, but wait
less time.
     }
 }

 return (y * SysTicksPerSecond()) / 1000;
}

I couldn't help myself.  Here's a working version of my idea.  It's still
untested, (as far a accuracy is concerned) but I think it's pretty accurate.

Regards,

Alan Ingleby
Systems Developer
ProfitLink Consulting Pty Ltd
309 Burwood Road
Hawthorn
Victoria 3122
Australia
"Alan Ingleby" <[EMAIL PROTECTED]> wrote in message
news:42276@palm-dev-forum...
>
> I have an idea for a different solution.. (I just came up with this on my
> afternoon break, so give me credit here 8-) ) I can't be bothered writing
> actual code, so this is just a rough idea of the actual code... It's
> basically a binary search for the loop value which causes a delay of one
> "Tick"
>
> /*BEGIN CODE*/
> low = 1;
> high = 1000000; // This should be high enough so that at least ONE tick
> occurs during this many iterations of the loop
>
> while (high > low) {
>     x = ( high + low ) / 2;
>
>     s = TimGetTicks();
>
>     do {
>         t = TimGetTicks();
>     } while (t == s);
>
>     // A tick *just* occurred. Now we count until the next.
>
>     while (x) x--; // The delay loop
>
>     if (t == TimGetTicks()) {
>         low = x+1; // Less than a tick occurred during delay, so try
again,
> but wait longer.
>     }
>     else {
>         high = x-1;// A tick occurred, so we're over. Try again, but wait
> less time.
>     }
> }
>
> d = ( x * SysTicksPerSecond() ) / 1000;
> /*END CODE*/
>
> NOTE: This code is *guaranteed* to be bug-ridden, it's just intended to
> convey the rough idea I just had.
>
> The result *should* be a value for d which causes the delay loop to wait
one
> milisecond.
>
> Let me know what you think, or if I'm just a barfing idiot.. (Which is
more
> than likely).. 8-)
>
> Regards,
>
> Alan Ingleby
> Systems Developer
> ProfitLink Consulting Pty Ltd
> 309 Burwood Road
> Hawthorn
> Victoria 3122
> Australia
> "Bill Shaw" <[EMAIL PROTECTED]> wrote in message
news:42184@palm-dev-forum...
> >
> > Needing a millisecond delay routine for my smart card application,  I
> > searched the archives and found others asking for a similar routine.
> > The reply was always negative;  doesn't exist,  can't do it.  Not being
> > one to take no for an answer ;-) I thought about it for a few minutes
> > and came up with this solution. The timing is not perfect,  and shorter
> > delays will be less accurate due to interrupts,  but it's close enough
> > for my needs.
> >
> > Enjoy.
> >
> > bs
> >
> >
> >
>
/***************************************************************************
> **
> > *
> > * File Name:  delay.c
> > *             Millisecond delay routines.
> > *
> > * Author:     Bill Shaw
> > *             [EMAIL PROTECTED]
> > *             Westbrook Systems:
> > *                Windows,  Mac OS,  Palm, PIC, and smart card
development
> > *
> > * Date:       2/23/01
> > *
> >
>
****************************************************************************
> ***
> > *
> > *   This code is emailware.  If you find if useful,  send me an email
> > *   and tell me about your app!
> > *
> > *   Also,  please leave my headers intact.  This is one form of
> advertising
> > *   I like to take advantage of when I can!
> > *
> >
>
****************************************************************************
> ***
> > */
> > #include <PalmOS.h>
> >
> > UInt32 startTicks;            // the time we started
> > UInt32 loopsPerMs;            // # loops per millisecond
> > UInt32 endTicks;              // the time we ended
> >
> >
>
/***************************************************************************
> ****
> > *
> > *  calcDelay - Calculates the delay value (loopsPerMs) for this Palm.
> > *              Call once during app initialization.
> > *              returns - nothing
> > *
> >
>
****************************************************************************
> ***
> > */
> > void calcDelay(void)
> > {
> >   UInt32 ticksPerSec;
> >   UInt32 loopCount;
> >
> >   ticksPerSec = SysTicksPerSecond();     // get # ticks per second
> >   startTicks = TimGetTicks();            // get start time
> >
> >   endTicks = startTicks + ticksPerSec;   // calc end time
> >
> >   // run the timing loop...
> >   for (loopCount=0;  TimGetTicks() < endTicks; loopCount++) {
> >      ticksPerSec++;
> >   }
> >
> >   endTicks = TimGetTicks();              // get end time (for debug)
> >   loopsPerMs = loopCount / 1000;         // calc # loops/ms
> >
> > }                                        // end of calcDelay()
> >
> >
>
/***************************************************************************
> ****
> > *
> > *  msDelay - millisecond delay
> > *            UInt32 ms = # milliseconds to delay
> > *            returns - nothing
> > *
> >
>
****************************************************************************
> ***
> > */
> > void msDelay(UInt32 ms)
> > {
> >   UInt32 loopCount, i;
> >
> >   loopCount = loopsPerMs * ms;              // calc # loops
> >
> >   startTicks = TimGetTicks();               // get start time (for
debug)
> >
> >   // run the delay loop...
> >   for (i=0; i<loopCount; i++) {
> >      endTicks = TimGetTicks();
> >   }
> >
> >   i = 0;                                    // just to break on
> >
> > }
> >
> > // end of file delay.c
> >
> >
> >
> >
>
>
>
>



-- 
For information on using the Palm Developer Forums, or to unsubscribe, please see 
http://www.palmos.com/dev/tech/support/forums/

Reply via email to