Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> ドライバ開発におけるクロックデバッグについて話す

ドライバ開発におけるクロックデバッグについて話す

  

ドライバをデバッグした友人は、多かれ少なかれクロックに晒されてきたと思います。心臓が人体に血液を供給するのと同じように、時計はデバイスに不可欠であるため。いくつかのデバイスはそれら自身のクロックを持ち、いくつかはシステムから外部クロックを受け取り、そしてクロックソースはデバイスの動作の礎石です。

したがって、クロックが機能しているかどうかを検出することは、デバイスをデバッグするための重要な要素の1つです。この記事では、効果的なクロックデバッグ方法を説明します。

私が遭遇したクロックの問題についてお話しし、それからクロックをデバッグする方法を見ます。

mcc(マルチチャネルコントローラ)ドライバの開発時に問題が発生しました - ドライバをテストしたところ、mccパラメータとトリガデバイスの設定方法に関係なく、デバイスが動作していないように見えないことがわかりました。したがって、推定クロックが受信されます。調査の結果、mccが使用するクロックソースmt9045が設定されていません。このクロックソースは、同期クロックだけでなく、mcc入力の送受信クロックも入力します。

当時は時計を設定するのに十分なデータがなく、時計が非常に複雑だったため、しばらくの間忙しかったのでそれを通過できませんでした。そのため、クロック入力の正確さを確認する必要があります。ウェーブテスターを使用している場合、ハードウェアピンを拾う方法がわかりません(デバイスはうまくパッケージされています)最後に、ポートクロック周波数を検出するためにソフトウェアプログラムを使用します。


static

int frequency_count(揮発性の符号なしlong型アドレス、符号なしint型マスク)

{

int t、nt、et;

int v、lv、cnt;


t = Gettick();

while(1)

{< Br>

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周波数がおよそ速い場合、精度はおよそです - メカニズムは誰にでも理解できるようになっています。

この関数の使い方はとても簡単です。特定のクロック出力、つまり特定のアドレスライン上のピン(ソフトウェアアングルはビット)が周波数を生成するかどうかを検出する場合、アドレス0xfdf90d50のようにアドレスアドレスとfrequency_countの出力ピンマスクのみが必要です。 0番目のビットは0xfdf90d50、0x00000001に渡されます。この関数は時間周波数値を出力します。

2つのヘルパー関数があることに注意してください。 1つはシステムの現在のティック値を取得するために使用されるGettick、もう1つはシステムのティック頻度を取得するためのGetsysClkRateです。

上記の機能は、Linuxシステムでは次のように実装できます。


static int Gettick()

{
return(int)jiffies;

}

< Br>

static int GetsysClkRate()

{
return(int)HZ;

}

vxWorksシステムの上記の関数は次のように実装できます。

static int Gettick()

{

return tickGet();

}


static int GetsysClkRate()

{

return sysClkRateGet();

}



Copyright © Windowsの知識 All Rights Reserved