Linux-笔记 Linux内核定时器心得

本文详细介绍了Linux内核中的时间管理和内核定时器,包括系统节拍率、jiffies计数、定时器结构与API(如init_timer,add_timer,del_timer,mod_timer)以及短延时函数的使用。
摘要由CSDN通过智能技术生成

一、Linux时间管理与内核定时器

        1、常用定时中断来计时,中断周期性产生频率常称为系统频率(节拍率),在编译内核时可以通过图形化界面来设置系统节拍率。在内核路径下输入 make menuconfig  ,-> Kernel Features ->Timer Frequency(<choice>[=y]),设置好了以后可以在linux内核源码根目录下的.config文件下看到系统节拍率的设置语句。

        2、高节拍率会提高系统时间精度,但是高节拍率会导致中断频繁产生,频繁中断会加剧系统的负担,但是现在处理器性能已经很强了。

        3、Linux内核使用全局变量jiffies(64位)来记录系统从启动以来的系统节拍数,系统启动后会把jiffies初始化为0。

        4、每秒的节拍数用HZ表示,jiffies表示系统运行的节拍数,jiffies/HZ = 系统运行时间(秒),超时 = jiffies > jiffies+(2*HZ)。

        5、Linux内核定时器采用系统时钟来实现,提供超时时间(定时值)与定时处理函数就行,超时以后就会跳转到定时处理函数去执行,但需要注意的是超时后需要在处理函数中重新打开定时器。

        6、Linux内核采用结构体timer_list结构体表示内核定时器:

struct timer_list {
    struct list_head entry;
    unsigned long expires;   /* 定时器超时时间,单位是节拍数 */
    struct tvec_base *base;
    void (*function)(unsigned long);   /* 定时处理函数 */
    unsigned long data;   /* 要传递给 function 函数的参数 */
    int slack;
};

        7、 内核定时器API函数:

                1)init_timer函数:负责初始化timer_list变量。

void init_timer(struct timer_list *timer)

                2)add_timer函数:用于向Linux内核注册定时器,使用该函数后定时器就会开始运行。

void add_timer(struct timer_list *timer)

                3)del_timer函数:不管定时器激活否,都删除一个指定的定时器,但是要注意在多处理器系统,一个定时器可能会在其他处理器上运行,删除的时候需要等待其他处理器运行结束。返回值: 0 定时器未激活  1 定时器已激活

int del_timer(struct timer_list * timer)

                4) del_timer_sync函数:同步版的del_timer,会等待其他处理器用完定时器再删除定时器,但是该函数不能用在中断上下文中。返回值 :0 定时器未激活  1 定时器已激活

int del_timer_sync(struct timer_list *timer)

                5)mod_timer函数:用于修改定时值,如果定时器未激活也会被激活。 参数:timer 要修改的定时器  expires 修改后超时时间  返回值: 0 调用函数的时候定时器未激活   1 调用函数的时候定时器已经激活。

int mod_timer(struct timer_list *timer, unsigned long expires)

        8、Linux内核定时器使用流程

/*定义定时器*/
struct timer_list timer;

/*书写定时器回调函数*/
void function(unsigned long arg)
{
    /*
    * 定时器处理函数
    */
    
    /*需要周期性定时器使用函数mod_timer*/
    mod_timer(&dev->timertest, jissies + msecs_to_jiffies(定时值(2000 = 2秒)));
}


/*初始化函数*/
void init(void)
{
    /*初始化定时器*/
    init_timer(&timer);
    timer.function = function; /* 设置定时处理函数 */
    timer.expires=jffies + msecs_to_jiffies(2000);/* 超时时间 2 秒 */
    timer.data = (unsigned long)&dev; /* 将设备结构体作为参数 */

    add_timer(&timer); /* 启动定时器 */
}

/* 出口函数 */
void exit(void)
{
    del_timer(&timer); /* 删除定时器 */
}

        9、Linux内核短延时函数

                内核提供了豪秒、微秒、纳秒三种函数

                1) void ndelay(unsigned long nsecs)

                2)   void udelay(unsigned long usecs)

                3)   void mdelay(unsigned long msecs)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值