Linux定时器jiffies学习

本文探讨了Linux内核中的定时器jiffies,介绍了如何使用add_timer添加定时任务,并通过mod_timer调整触发时间。jiffies是一个低精度计数器,每HZ频率递增,1*HZ代表1秒。若要实现周期性任务,需在回调函数中重新调度定时器。同时提到了msecs_to_jiffies函数用于将毫秒转换为jiffies单位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct timer_list {
	struct list_head entry; /* 定时器链表 */
	unsigned long expires; /* 启动定时长 */
	struct tvec_base *base;
	void (*function)(unsigned long); /* 定时执行函数 */
	unsigned long data; /* 传递给func的参数 */
	int slack;
};

api

void add_timer(struct timer_list *timer);
int del_timer_sync(struct timer_list *timer);//多处理器用,等所有处理执行完func再删除
extern int del_timer(struct timer_list * timer);
extern int mod_timer(struct timer_list *timer, unsigned long expires);
extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires);
init_timer(timer) //宏初始化一个定时器,将定时器加入内核链表
DEFINE_TIMER(_name, _function, _expires, _data) //静态申明一个定时器

add_timer向内核工作链表插入一个定时器任务,取值按参数expires算,最终是调用mod_timer函数来实现
具体实现

static void led_timer_fuc(unsigned long ps)
{
    struct gpioled_dev *led = (struct gpioled_dev *)ps;
    if (led->flash_flag) {
        led_control[LED_FLIP](led);
        mod_timer(&led->timer, jiffies + msecs_to_jiffies(led->timer_proid));/* 重新启动一次新的定时器 */
    }
}

/* 初始化的时候不将定时器加入内核链表,所以不调用add_timer */
static void led_timer_init(struct gpioled_dev *led)
{
    /* add_timer函数之后会触发一次定时器中断 */
    init_timer(&led->timer);/* 初始化定时器 */
    led->timer_proid = 500;
    led->timer.function = led_timer_fuc; /* 定时器函数 */
    //led->timer.expires = 0;
    led->timer.data = (unsigned long)led;/* 给fuc提供的参数 */
    //add_timer(&led->timer);/* 添加定时器 */
}

jiffies 内核低精度定时器,一直在加,只能设置未来的一个时间段触发定时任务,并且只执行一次,所以如果要持续定时触发的话,需要在func中对定时器重新处理,即调用mod_timer修改定时触发的时间点
jiffies 计数与内核宏HZ有关,1 * HZ计数就是1秒
msecs_to_jiffies函数将毫秒数值转化为jiffies

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值