組み込み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)

*/

おすすめ

転載: blog.csdn.net/weixin_47273317/article/details/107984530