Mail Archives: djgpp/1997/05/11/05:17:33
On 6 May 1997 sams AT nbisrv DOT nbi DOT dk wrote:
> For a long time I've been using the timer function timer16 below to read
> the 1193180 Hz timer. It has worked flawlessly, and the test routine main
> below has always given uncertainty in timing (dtmax) less than 20 micro-
> seconds.
> However, having bought a new Pentium Pro, I experience problems:
> I get dtmax of order 27000 microseconds.
[snip]
> unsigned short timer16() /* Usage: cli(); timer16(); sti(); */
> {
> unsigned short sts, lsb, msb, result;
> do{
> outportb(0x43,0xc2);
> sts = inportb(0x40);
> lsb = inportb(0x40);
> msb = inportb(0x40);
> result = (msb<<7) | (lsb>>1);
> }while(!result);
> result |= ((sts<<8) & (1<<15)) ;
> return ~result; /* return 16bit timer */
> }
One possible reason is that you don't wait between outport and inport
calls, and between inport calls themselves. Pentium (or even i486, for
that matter) can run circles around the devices that are referenced
through the bus. Chances are that the timer chip cannot cope with two
instructions without some minimal delay between them. Try adding a few
NOPs, or a loop that kills some time and see if that helps.
- Raw text -