我想,調試過驅動的朋友多多少少都接觸過時鐘。因為時鐘對設備來說,就如同心髒對人體供血一樣,是不可或缺的。有些設備自己有時鐘,有些接收系統外部時鐘,總之時鐘源是設備工作的基石。
因此檢測時鐘是否正工作是調試設備的關鍵之一,本文我將給出大家一個有效的時鐘調試手段——不需要用試波器,而用軟件方法。
我先說說我碰到的時鐘問題,再來看如何調試時鐘。
問題發生在開發mcc(多通道控制器)驅動時——在我們測試驅動時,發現無論如何配置mcc參數和觸發設備,設備都自巋然不動,好似僵死一般。因此估計時鐘為接收到。 經過調查,mcc所使用的時鐘源mt9045沒有設置對。 這個時鐘源將給mcc輸入傳輸、接收時鐘,同時還有同步時鐘。
由於當時我們缺乏足夠的資料配置時鐘,而且這個時鐘的確比較復雜,所以我們忙了好一陣都沒搞通它。 因此我們急需檢測時鐘輸入的正確與否。如果用試波器吧,還陣不知道如何接出硬件管腳(設備封裝得很好),最後我們借助一段軟件程序來檢測端口時鐘頻率。
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();
}