#define NSEC_PER_SEC 1000000000 //#define CLOCK_TICK_RATE /*100000000 */ 1193180 #define LATCH(CLOCK_TICK_RATE,HZ) ((CLOCK_TICK_RATE + HZ/2) / HZ) #define SH_DIV(NOM,DEN,LSH) ( ((NOM / DEN) << LSH) \ + (((NOM % DEN) << LSH) + DEN / 2) / DEN) #define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH(CLOCK_TICK_RATE,HZ), 8)) #define TICK_NSEC (SH_DIV (1000000UL * 1000, ACTHZ, 8)) struct { int hz; int clocktickrate; } vals[] = {{100, 1193180}, {200, 1193180}, {250, 1193180}, {500, 1193180}, {1000, 1193180},{0,0}}; void do_it(int hz,int tickrate) { int HZ = hz; int CLOCK_TICK_RATE = tickrate; int tick_nsec = TICK_NSEC; int ticks_per_sec = NSEC_PER_SEC/tick_nsec; int sec_size = ticks_per_sec * tick_nsec; int one_sec_p; int err; if (sec_size < NSEC_PER_SEC) sec_size += tick_nsec; one_sec_p = sec_size; err = one_sec_p - NSEC_PER_SEC; printf( "%4d\t%8d\t%8d\t%10d\t%8d\n",hz, tickrate, tick_nsec, one_sec_p, err); } void bail(void) { printf("run as: as [hz [clock_tick_rate]]\n"); exit(1); } main(int argc, char** argv) { int i = 0; int phz = 0; int pcr = vals[0].clocktickrate; if (argc > 1) { phz = atoi(argv[1]); if (!phz) bail(); } if (argc > 2) { pcr = atoi(argv[2]); if (!pcr) bail(); } printf("HZ \tTICK RATE\tjiffie(ns)\tsecond(ns)\t error (ppbillion)\n"); while(vals[i].hz) { do_it(vals[i].hz, vals[i].clocktickrate); i++; } if (phz) do_it(phz, pcr); }