千家信息网

芯灵思Sinlinx A64开发板Linux内核定时器编程

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,开发平台 芯灵思Sinlinx A64内存: 1GB 存储: 4GB开发板详细参数 https://m.tb.cn/h.3wMaSKm开发板交流群 641395230Linux 内核定时器是内核用来控
千家信息网最后更新 2026年11月02日芯灵思Sinlinx A64开发板Linux内核定时器编程

开发平台 芯灵思Sinlinx A64
内存: 1GB 存储: 4GB
开发板详细参数 https://m.tb.cn/h.3wMaSKm
开发板交流群 641395230

Linux 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 和 kernel/timer.c 文件中。
内核定时器的数据结构

struct timer_list {    struct list_head entry;  //双向链表元素list:用来将多个定时器连接成一条双向循环队列。    unsigned long expires; //expires 字段表示期望定时器执行的 jiffies 值,到达该 jiffies 值时,将调用 function 函数,并传递 data 作为参数。    void (*function)(unsigned long); //指向一个可执行函数。当定时器到期时,内核就执行function所指定的函数。而data域则被内核用作function函数的调用参数。    unsigned long data;    struct tvec_base *base;    /* ... */};

时间比较操作
在定时器应用中经常需要比较两个时间值,以确定timer是否超时,所以Linux内核在timer.h头文件中定义了4个时间关系比较操作宏。这里我们说时刻a在时刻b之后,就意味着时间值a≥b。
Linux强烈推荐用户使用它所定义的下列4个时间比较操作宏(include/linux/timer.h):

#define time_after(a,b) ((long)(b) - (long)(a) < 0)#define time_before(a,b) time_after(b,a)#define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0)#define time_before_eq(a,b) time_after_eq(b,a)

Linux 内核时间相关转换函数

  1. unsigned long usecs_to_jiffies(const unsigned int u)
    功能: 把微秒转换成时钟节拍
    参数: u 时间微秒
    返回: 对应的时钟节拍数量
  2. unsigned long msecs_to_jiffies(const unsigned int m)
    功能: 把毫秒转换成时钟节拍
    参数: u 时间毫秒
    返回: 对应的时钟节拍数量
    示例: 要定时从现在开始, 3 毫秒执行一个函数
    expires 设置为 jiffies+ msecs_to_jiffies(3)

Linux 内核定时器操作相关 API

  1. 静态定义结构体变量并且初始化(宏)
    DEFINE_TIMER(_name, _function, _expires, _data)
    功能: 定义一个名字为_name 的 struct timer_list 结构的变量, 并且初始化它的 function, expires, data 成员

  2. 定时器初始化(宏)
    init_timer(timer)
    功能: 只是对 struct timer_list 结构成员进行一些基础初始化操作, function, expires, data 成员还需要用户自
    己填充。

3.设置定时器(宏)
setup_timer(timer, fn, data)
功能: 设置定时器中的 function, data 和一些基础成员, expires 并没有初始化, 需要用户自己进行初始化

  1. 注册定时器到内核
    void add_timer(struct timer_list *timer)
    功能: 向内核注册一个定时器, 注册后会马上开始计时。
    5.从内核注销定时器
    int del_timer(struct timer_list * timer)
    功能: 从内核定时链表上删除指定的定时器, 删除后就不会再执行绑定的函数

  2. 修改定时器定时时间值, 并且重新注册
    int mod_timer(struct timer_list *timer, unsigned long expire0.s)
    功能: 修改定时器定时时间值, 并且重新注册, 不管这个定时的超时函数是否执行过。 执行完成后会马上启
    动定时。

内核定时器编程步骤
Step1 定义timer_list 结构变量
Step2 定义超时函数
Step3 对timer_list结构变量进行初始化
Step4 注册定时器,启动定时
Step5 注销定时器

驱动代码:

#include #include #include void tasklet_fun(unsigned long data);//Step1 定义并静态初始化tasklet_struct 结构变量DECLARE_TASKLET(mytasklet, tasklet_fun, 651);//Step2 tasklet服务函数void tasklet_fun(unsigned long data){        static unsigned long count = 0;        printk("count:%lu,%s is call! data:%lu\r\n",count++,__FUNCTION__,data);        tasklet_schedule(&mytasklet); //在工作函数中重新调度自己,这样会循环调用tasklet_fun}static int __init mytasklet_init(void){        //Step3 开始调度 mytasklet        tasklet_schedule(&mytasklet);        printk("%s is call!\r\n",__FUNCTION__);        return 0;}static void __exit mytasklet_exit(void) //Module exit function specified by module_exit(){        //Step4 删除 tasklet        tasklet_kill(&mytasklet);}module_init(mytasklet_init);module_exit(mytasklet_exit);MODULE_LICENSE("GPL");

实验现象

定时器 内核 函数 时间 功能 结构 参数 变量 成员 时钟 节拍 开发 用户 调度 双向 基础 数量 文件 时刻 静态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海喔噻互联网科技有限公司 西安纸贵互联网科技有限公司 凡科互联网科技 极限挑战互联网科技 奇酷互联网络科技公司 北京禾田雨橡互联网科技 互联网科技英文翻译 中国最先进互联网科技公司 互联网软件和科技 洛阳昕诺飞互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 陕西云淼互联网科技公司 互联网风格科技公司名称 互联网界的黑科技 唯美互联网科技 互联网金融运营模式中的金融科技 易租星互联网科技有限公司 广东猫王互联网科技有限公司电话 互联网科技自媒体灵感 科技互联网企业在行动 互联网科技公司 互联网科技网 互联网巨头反垄断金融科技 狮子座互联网科技 青海科技产业互联网发展 伊宁互联网科技做什么的 工业互联网山东科技大学 互联网科技圈年度人物 第三届互联网大会安防黑科技 互联网 科技节活动 微视频大赛
0