Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> 小談驅動開發中的時鐘調試

小談驅動開發中的時鐘調試

日期:2017/2/7 14:40:14      編輯:Linux教程
 

我想,調試過驅動的朋友多多少少都接觸過時鐘。因為時鐘對設備來說,就如同心髒對人體供血一樣,是不可或缺的。有些設備自己有時鐘,有些接收系統外部時鐘,總之時鐘源是設備工作的基石。

因此檢測時鐘是否正工作是調試設備的關鍵之一,本文我將給出大家一個有效的時鐘調試手段——不需要用試波器,而用軟件方法。

我先說說我碰到的時鐘問題,再來看如何調試時鐘。

問題發生在開發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();

}

 

 

Copyright © Windows教程網 All Rights Reserved