ドライバー情報を見つける方法を知りたいです。また、Beaglebone Black を起動または再起動するときにドライバーの初期化を遅らせることができるかどうかも知りたいです。
答え1
ドライバーを変更できる場合は、私の回答を参照してくださいここ。
私の解決策はusleep_range(1000000, 12000000);
、調査ドライバーに機能が追加され、ドライバーは10~12秒遅れることになります。調査関数は、ドライバーが実行/初期化を開始する場所です。
答え2
デバイス ドライバーはオープンソースですか? オープンソースの場合は、ソース コードをダウンロードして変更する必要があります。
システム クロックの倍数を利用して、次のコード スニペットでドライバーの方向を内部から遅延します。
while (time_before(jiffies, j1))
cpu_relax();
j1
遅延の期限が切れたときの jiffies の値は、
cpu_relax
アイドル状態のプロセッサを示すためにアーキテクチャを呼び出す呼び出しです。
繰り返しますが、すべてはドライバーのソース コードがあることに依存します。
答え3
cpu_relax()
潜在的な欠点がある、、またはを呼び出すビジー ループよりもschedule()
、潜在的な悪影響 (他のアクティビティをブロックして、最善の場合でも不便な状態になったり、最悪の場合はデバイスが停止したりするなど) なしで待機するように設計されたタイマー関数を使用する方が適切です。
遅延が短い場合 (たとえば、短いレイテンシの問題に対処する場合)、以下を使用できます。
#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
ドライバーの初期化をブロックし、ドライバーが初期化されるまで OS に戻らない必要があるこのシナリオではおそらく役に立ちませんが、通常、現在のプロセスをブロックせずに後でアクションを実行するようにスケジュールする必要がある場合は、カーネル タイマーが適しています。
#include <linux/timer.h>
struct timer_list {
/* ... */
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
};
struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
void init_timer(struct timer_list *timer);
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);
int mod_timer(struct timer_list *timer, unsigned long expires);
int timer_pending(const struct timer_list * timer);
これらを使用するには、timer_list
エントリを初期化します。 はTIMER_INITIALIZER()
、これを行うための便利な関数で、実行する関数へのポインタ、関数に渡す不透明なデータ、および関数を_expires
実行する jiffy 時間を渡します。 注: 構造体内の省略されたフィールドは、timer_list
この説明には不要な実装の詳細です。
次に、呼び出しによりadd_timer()
、timer_list エントリがキューに挿入されます (つまり、タイマーが「開始」されます)。
もう1つの可能性は、 のようなものを使用することですwait_event()
。これは、カーネルによってチェックされる何らかの条件が満たされるまで待機し、任意の時間待機するのではなく、何かが起こるまで待機します。