| delorie.com/archives/browse.cgi | search |
| X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f |
| From: | RayeR <glaux AT centrum DOT cz> |
| Newsgroups: | comp.os.msdos.djgpp |
| Subject: | Re: timing problems using uclock() |
| Date: | Sun, 30 Mar 2008 08:36:22 -0700 (PDT) |
| Organization: | http://groups.google.com |
| Lines: | 34 |
| Message-ID: | <13387b91-554d-4e43-8389-2388f03ba2e4@x41g2000hsb.googlegroups.com> |
| References: | <532aac2f-c863-49f4-8d4b-43b22350f9d8 AT e23g2000prf DOT googlegroups DOT com> |
| NNTP-Posting-Host: | 89.176.208.108 |
| Mime-Version: | 1.0 |
| X-Trace: | posting.google.com 1206891383 13372 127.0.0.1 (30 Mar 2008 15:36:23 GMT) |
| X-Complaints-To: | groups-abuse AT google DOT com |
| NNTP-Posting-Date: | Sun, 30 Mar 2008 15:36:23 +0000 (UTC) |
| Complaints-To: | groups-abuse AT google DOT com |
| Injection-Info: | x41g2000hsb.googlegroups.com; posting-host=89.176.208.108; |
| posting-account=Q0wMHAoAAADjYrghh94FTf6YnbpTqZgp | |
| User-Agent: | G2/1.0 |
| X-HTTP-UserAgent: | Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.12) |
| Gecko/20080201 SeaMonkey/1.1.8,gzip(gfe),gzip(gfe) | |
| To: | djgpp AT delorie DOT com |
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp |
| Reply-To: | djgpp AT delorie DOT com |
I have also found some weird behavior of uclock()
I made udelay() function based on some other function using clock()
I use it for I2C and SPI communication under pure DOS. I don't know
what
exactly goes wrong but when using udelay() it sometimes trashes
communication
with SMBus host and it gets locked. If I replace say udelay(1000) by
delay(1) it doesn't
never happed. I tried udelay in a loops and measure run time but it
seems to be OK.
Maybe there's some random jitter. Any Idea how to make a precise
timer?
//***************** wait for delay us
***************************************
void udelay(DWord usec) // based on precise 1us timer
uclock(), usable for 10us resolution
{ // works under DOS/Win9X/NT but
not Win3.x
volatile uclock_t cl_time;
volatile uclock_t start_time=uclock();
if (usec==0) // pokud je prodleva nulova
return; // tak hned skonci
cl_time=(usec*UCLOCKS_PER_SEC)/977000;
while (1) // cekaci smycka
{
clock_t elapsed=uclock()-start_time;
if (elapsed>=cl_time) // pokud citac dosel k cilove
hodnote
break; // tak skonci
__dpmi_yield(); // vzdej se zbytku slice time
ve prospech jinych procsu
}
}
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |