static int frequency_count(volatile unsigned long addr, unsigned int mask )
{
int t, nt, et;
int v, lv, cnt;
t = Gettick();
while ( 1 )
{
nt = Gettick();
if ( nt != t )
break;
}
et = nt + GetsysClkRate ();
cnt = 0;
lv = v = (*(int*)addr) & mask;
while ( 1 )
{
nt = Gettick();
if ( nt >= et )
break;
v = (*(int*)addr) & mask;
if ( v != lv )
{
lv = v;
cnt++;
}
}
return cnt/2;
}
上面程序的计算值是近似的――当系统cpu频率约快时,准确性约搞――其中机理留给大家去领会。
函数的用法很简单。当检测某个时钟输出,即特定地址线上的某个针(软件角度就一个位)是否产生何时的频率时,只需要给frequency_count 传入地址地址和输出针的掩码,如地址0xfdf90d50的第0位,则传入0xfdf90d50,0x00000001。 函数输出就时频率值。
要注意其中有两个辅助函数。一个是Gettick ,它用于获取系统当前节拍值;一个是GetsysClkRate用于获得系统节拍频率。在Linux系统中上述函数可如下实现:
代码:
static int Gettick()
{
return (int)jiffies;
}
static int GetsysClkRate ()
{
return (int)HZ;
}
对vxWorks系统上述函数可实现如下
static int Gettick()
{
return tickGet();
}
static int GetsysClkRate ()
{
return sysClkRateGet();
}