Subject: HZ manipulation

From: Wojciech Kromer <[email-masked]>
Date: Tue, 13 Dec 2005 09:31:24 +0100

I have 2.4.25 kernel from denx.de and latest uClibc running on mpc8248.
I'm trying to change HZ value, but still have strange results with 
simple test
Recompiling whole uClibc does not change the results.

What could be wrong?

with HZ==1000:
# 
alarm_test                                                                    

alarm fired after 
0.099092s                                                    
slept 0.999769s

with HZ==500:
# 
alarm_test                                                                    

alarm fired after 
0.199622s                                                    
slept 0.999761s

with HZ==100:
# alarm_test
alarm fired after 0.999693s
slept 0.999760s

- here is procesor id :

... by kernel:
# cat /proc/cpuinfo
processor       : 0
cpu             : 8280
core clock      : 400 MHz
CPM  clock      : 200 MHz
bus  clock      : 100 MHz
revision        : 32.20 (pvr 8082 2014)
bogomips        : 266.24

... and by u-boot:
MPC8248 Reset Status: External Soft, External 
Hard                             

MPC8248 Clock 
Configuration                                                    
 - Bus-to-Core Mult 4x, VCO Div 2, 60x Bus Freq  25-75 , Core Freq 
100-300     
 - dfbrg 1, corecnf 0x1a, busdf 3, cpmdf 1, plldf 0, pllmf 
3                   
 - vco_out  400000000, scc_clk  100000000, brg_clk   
25000000                  
 - cpu_clk  400000000, cpm_clk  200000000, bus_clk  
100000000                  
 - pci_clk   
66666666                                                          

CPU:   MPC8248 (HiP7 Rev 14, Mask 1.0 1K50M) at 400 MHz

- test code included

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>

static void sighand(int sig)
{
}

int main()
{
 struct timeval tv1, tv2;
 sigset_t set;
    
 sigfillset(&set);
 sigdelset(&set, SIGALRM);
 sigdelset(&set, SIGINT);
          
 signal(SIGALRM, sighand);
 gettimeofday(&tv1, NULL);
 
 alarm(1);
 sigsuspend(&set);
 gettimeofday(&tv2, NULL);
 
 tv1.tv_sec = tv2.tv_sec - tv1.tv_sec - (tv2.tv_usec < tv1.tv_usec);
 tv1.tv_usec = tv2.tv_usec - tv1.tv_usec + (tv2.tv_usec < tv1.tv_usec) * 1000000;
 
 printf("alarm fired after %ld.%06lds\n",tv1.tv_sec, tv1.tv_usec);

 //--------------------
 gettimeofday(&tv1, NULL);
 sleep(1);
 gettimeofday(&tv2, NULL);
 
 tv1.tv_sec = tv2.tv_sec - tv1.tv_sec - (tv2.tv_usec < tv1.tv_usec);
 tv1.tv_usec = tv2.tv_usec - tv1.tv_usec + (tv2.tv_usec < tv1.tv_usec) * 1000000;
 
 printf("slept %ld.%06lds\n",tv1.tv_sec, tv1.tv_usec);
 
 return 0;
}