[LUGOS-PROG] Milisekundni stevec

Metod Kozelj metod.kozelj at lugos.si
Wed Nov 6 09:37:43 CET 2002


Howdy!

davorin.robba at ensico.si wrote:

 > Zal morajo biti vsaj milisekunde. Na majhnem kontrolerju (PC baziran 
na 486) smo razvili aplikacijo (napisana v C/C++), ki tece na linuxu. V 
aplikaciji rabimo milisekundni cas za sinhronizacijo in racunanje 
timeout-ov.
 >

Se bojim, da bos tezko prisel skozi z milisekundami. Sicer je odvisno od
HW platforme, ampak za ix86 je resolucija sistemske ure 100HZ
(asm/param.h; pri alfah je bodisi 1024 ali pa 1200 Hz). Najbrz obstaja
kaksna sistemska funkcija, ki ti vrne vrednost uptime, v skrajni sili pa
jo preberes iz /proc/uptime. Spodaj je en primerek takega programa ...
za odpiranje /proc/uptime, branje in zapiranje je poraba med 200 (P4-1.7G)
in 2000 (P-100M) mikrosekund. Rezultate mi vraca v desetinkah milisekunde,
ampak mocno dvomim, da je taka natancnost relevantna.

Druga moznost je branje casa iz CMOS ure. Sicer se jo da tudi
spreminjati, ampak je to malo manj verjetno ... Poglej si
*/mc146818rtc.h za opis funkcij ... se mi pa zdi, da v tem primeru
(zaradi outb, inb) potrebujes sistemske privilegije.

-- 
Peace!
Mkx

---- perl -e 'print 
$i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'



******** ura.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

int main (int argc, char *argv[])
{
FILE *procf;
float uptime, foo;
struct timeval start, end;
long timediff;

gettimeofday (&start, NULL);
procf=fopen("/proc/uptime", "r");
if (procf==NULL) {
exit (1);
}

if (fscanf(procf, "%f %f", &uptime, &foo)!=2) {
exit (2);
}
fclose (procf);

gettimeofday (&end, NULL);
timediff=(end.tv_sec-start.tv_sec)*1000000+end.tv_usec-start.tv_usec;
fprintf (stdout, "Uptime: %f\n", uptime);
fprintf (stdout, "Porabljen c(as: %ld sekund, %ld usek\n",
timediff / 1000000, timediff % 1000000);
return (0);
}





More information about the lugos-prog mailing list