組み込みLINUXドライバーが7割り込み関連(5)遅延処理機能を学習
Linuxシステムでは、2つのタイプのタスク遅延があります:
1つはビジー遅延で、これは主に割り込み関連の関数で使用されます。実装方法は、リソースを解放しないwhile(n)と同様にアイドリングしています。 、しかし常に待機状態を処理します;
もう1つ:スリープ遅延、このメソッドは主にプロセスに使用されます。スリープ遅延が使用されると、プロセスはリソースを解放し、遅延時間が経過した後、リソースは再取得され、実行を継続します
1.ヘッダファイルとビジーディレイ方式の説明(主に割り込み処理機能で使用)
//源码位置:arch/arm/include/asm/delay.h
//udelay(n)函数功能:延迟n微秒后继续向下执行
#define udelay(n) \
(__builtin_constant_p(n) ? \
((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \
__const_udelay((n) * ((2199023U*HZ)>>11))) : \
__udelay(n))
//__const_udelay函数和__udelay函数源码位置:arch/arm/lib/delay.S
//源码位置:include/linux/delay.h
//ndelay函数功能:延迟x纳秒后继续向下执行
static inline void ndelay(unsigned long x)
{
udelay(DIV_ROUND_UP(x, 1000));
/*
DIV_ROUND_UP函数位置:linux/kernel.h
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
*/
}
//源码位置:include/linux/delay.h
//mdelay函数功能:延迟n毫秒后继续向下执行
#ifndef MAX_UDELAY_MS
#define MAX_UDELAY_MS 5
#endif
#ifndef mdelay
#define mdelay(n) (\
(__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : \
({unsigned long __ms=(n); while (__ms--) udelay(1000);}))
#endif
2.スリープ遅延メソッドのヘッダーファイル、関数、および説明(プロセスで使用)
/* msleep(n) :
功能 : 休眠n毫秒后继续向下执行
源码头文件位置:include/linux/delay.h
源码实现位置:kernel/delay.c
*/
void msleep(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout)
timeout = schedule_timeout_uninterruptible(timeout);
}
EXPORT_SYMBOL(msleep);
/* ssleep(n):
功能 : 休眠n秒后,继续向下执行
源码位置:include/linux/delay.h
*/
static inline void ssleep(unsigned int seconds)
{
msleep(seconds * 1000);
}
schedule()
/*
功能:永久休眠,但可以被中断打断
头文件位置:include/linux/sched.h
asmlinkage void schedule(void);
*/
schedule_timeout(signed long timeout)
/*
功能:休眠timeout(一般有HZ。如:1*HZ表示1秒),但可以被中断打断
当timeout 为: MAX_SCHEDULE_TIMEOUT时,表示永久休眠,等同于schedule() 函数
头文件位置:include/linux/sched.h
signed long __sched schedule_timeout(signed long timeout)
*/