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 -