Mail Archives: djgpp/1999/02/22/10:42:23
| From: | Engard Ferenc <fery AT pons DOT sote DOT hu> | 
| Newsgroups: | comp.os.msdos.djgpp | 
| Subject: | Re: timing with empty loops -- small green ufo-s? | 
| Date: | Mon, 22 Feb 1999 16:21:34 +0100 | 
| Organization: | IIF | 
| Lines: | 53 | 
| Message-ID: | <Pine.LNX.3.96.990222161156.20786B-100000@Pons.sote.hu> | 
| NNTP-Posting-Host: | pons.sote.hu | 
| Mime-Version: | 1.0 | 
| In-Reply-To: | <8D53104ECD0CD211AF4000A0C9D60AE3579368@probe-2.acclaim-euro.net> | 
| To: | djgpp AT delorie DOT com | 
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp | 
| Reply-To: | djgpp AT delorie DOT com | 
On Mon, 22 Feb 1999, Shawn Hargreaves wrote:
>Engard Ferenc writes:
>> My program does it's timing with empty loop:
>> 
>> void do_delay (unsigned long i)
>> { while(i--) ; }
>
>I don't think that is a very good way to do a timing delay. This is
>incredibly prone to compiler optimisation, and will be affected by 
>things like the code alignment, processor cache, and if you inline 
>it within a larger function, the surrounding code will change how gcc 
>deals with it.
Your point is absolutely good; I have arrived at the same idea. My
solution was that I made it static in memory (so far I used it as
inline function), and now it works quite well.
>
>I wouldn't use a delay loop for anything at all critical, which it
>sounds like your situation is. If you really insist upon using this
>method, though, at the very least you should:
>
>- write it in asm.
>- put it a separate .s file, not inlined within C a source.
>- use .align directives to make sure the routine cannot move around.
>- only have a single copy, used for both calibration and actual delays.
Now it has only a single copy in RAM, and as far as I know, at -O1
optimization level the gcc won't inline it if I don't ask it
explicitely. I didn't disabled the interrupts, assuming it doesn't
make too big deviation. Anyway, it is a good idea as I noticed that
the control is going nuts if I press a key meanwhile the actual
timings... :))  So, it looks I don't need to write it in asm.
>If you do that, it will probably be pretty reliable, as long as you
>can guarantee no external interference (eg. interrupts are disabled).
>If this needs to be really accurate, though, it would be much better 
>to use a proper timing chip. The pentium has some hardware registers
>specifically for this purpose, but I'm afraid I don't have any
>references to hand on exactly how you would access them...
It would be the best, just I have never programmed in asm... :-(
Thanks for the tips:
Circum
 __  @
/  \    _   _                                           Engard Ferenc
l    | ( \ /  | | (\/)                      mailto:s-fery AT kkt DOT sote DOT hu
\__/ | |   \_ \_/ I  I                    http://pons.sote.hu/~s-fery
- Raw text -