Messages in this thread |  | | Date | Mon, 17 Sep 2001 15:11:26 -0400 | From | John Weber <> | Subject | Re: how to get cpu_khz? |
| |
David Fries wrote: > > I'm using the TSC of the Pentium processors to get some precise timing > delays for writing to a eeprom (bit banging bus operations), and it > works just fine, but the cpu_khz variable isn't exported to a kernel > module, so I hardcoded in my module. It works fine for that one > system, but obviously I don't want to hard code it for the general > case. I guess I could write my own routine to figure out what the > cpu_khz is, but it is already done, so how do I get access to it?
I don't know of any official way of doing this, but here's some code (written by aa) that accomplishes this./* * $Id: MHz.c,v 1.4 2001/05/21 18:58:01 davej Exp $ * This file is part of x86info. * (C) 2001 Dave Jones. * * Licensed under the terms of the GNU GPL License version 2. * * Estimate CPU MHz routine by Andrea Arcangeli <andrea@suse.de> * Small changes by David Sterba <sterd9am@ss1000.ms.mff.cuni.cz> * */
#include <stdio.h> #include <sys/time.h> #include <string.h> #include <unistd.h>
__inline__ unsigned long long int rdtsc() { unsigned long long int x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; }
void estimate_MHz() { struct timezone tz; struct timeval tvstart, tvstop; unsigned long long int cycles[2]; /* gotta be 64 bit */ unsigned int microseconds; /* total time taken */ memset(&tz, 0, sizeof(tz));
/* get this function in cached memory */ gettimeofday(&tvstart, &tz); cycles[0] = rdtsc(); gettimeofday(&tvstart, &tz);
/* we don't trust that this is any specific length of time */ usleep(1000000); cycles[1] = rdtsc(); gettimeofday(&tvstop, &tz); microseconds = ((tvstop.tv_sec-tvstart.tv_sec)*1000000) + (tvstop.tv_usec-tvstart.tv_usec);
printf("%lldMHz processor (estimate).\n", (cycles[1]-cycles[0])/microseconds); }
int main(void) { while (1) { estimate_MHz(); } return (0); }
|  |