add timer

Linux 内核定时器实验 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于驱动编写者来说最常用的就是定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率)。其中jiffies_64用于64为系统,jiffies用于32位系统。为了硬件的兼容性他们的关系如下:其实读取jiffies变量也就是读取jiffies_64的低32位。 阅读详情

下面一段添加一个定时器的代码:

1.  timer 的声明如下:

static struct timer_list timer;

timer_list 定义于include/linux/timer.h  中

struct timer_list {
        struct list_head entry;
       //定时器触发时间 
       unsigned long expires;

        //定时器触发时,执行的函数 
        void (*function)(unsigned long);
        //定时器私有数据,可以用来赋值,传递信息
        unsigned long data;

        struct tvec_base *base;
#ifdef CONFIG_TIMER_STATS
        void *start_site;
        char start_comm[16];
        int start_pid;
#endif
#ifdef CONFIG_LOCKDEP
        struct lockdep_map lockdep_map;
#endif  
};           

2.  在模块初始化中,添加定时器:

static int demo_map_init(void)
{
        int err = 0;
        char *kstr;
...
        //创建定时器,每隔10秒打印一次被映射的物理内存的内容
        //初始化定时器
        init_timer(&timer);
        //赋值定时器执行函数
        timer.function = timer_func;
        //赋值定时器私有数据
        timer.data = (unsigned long)kstr;
        // 赋值定时器触发时间
        timer.expires = jiffies + HZ * 10;
        // 向内核添加该定时器
        add_timer(&timer);
...
}

3. timer_func 函数定义:

//timer function, print mapped physical pages.
static void timer_func(unsigned long data)
{
        printk("timer_func: %s\n", (char *)data);
        timer.expires = jiffies + HZ * 10;
        add_timer(&timer);
}

4. delete timer, 模块卸载时 删除定时器:

static void demo_map_exit(void)
{
        //同步从内核中 删除定时器
        del_timer_sync(&timer);
        cdev_del(pcdev);
        unregister_chrdev_region(ndev, 1);
        kunmap(pg);
        ClearPageReserved(pg);
        __free_pages(pg, 0);
}






深入杰理AC632N定时器:sys_timer_add与usr_timer_add的选择与低功耗实践 本文深入探讨杰理AC632N芯片中sys_timer_add与usr_timer_add两种定时器接口的区别与应用场景,特别关注低功耗实践。通过对比分析定时精度、调度方式和低功耗兼容性,提供优化策略和实战案例,帮助开发者在蓝牙音频和IoT设备中实现高效定时任务管理。 阅读详情

相关推荐

深入杰理AC632N定时器:sys_timer_add与usr_timer_add的实测对比与低功耗应用

本文深入分析了杰理AC632N芯片的两种定时器API——sys_timer_add与usr_timer_add的实测表现与低功耗应用。通过详细的测试数据和实际案例,揭示了它们在精度、优先级影响及低功耗模式下的行为差异,为开发者提供了选型建议和混合使用的最佳实践,帮助优化智能硬件和物联网设备的实时性与能效。

weixin_30570101的博客 404

Linux内核定时器---init_timer()、add_timer()与mod_timer()使用

一、内核定时器API函数 init_timer(timer):初始化timer。 setup_timer(timer, fn, data):与init_timer()类似,fn为定时器回调函数,data为回调函数的参数。 void add_timer(struct timer_list *timer) 用于向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会开始运行。 int mod_timer(struct timer_list *timer, unsigned

lihuan680680的博客 1万+

杰理AC632N低功耗与定时器应用指南:sys_timer_add vs usr_timer_add实测对比

本文深入解析杰理AC632N芯片的定时器应用,对比sys_timer_add与usr_timer_add在低功耗模式下的性能差异。通过实测数据展示两者的定时精度、中断响应及功耗表现,并提供优化GPIO配置和定时器组合使用的实战技巧,帮助开发者在智能穿戴和IoT设备中实现高效低功耗设计。

weixin_29540599的博客 342

Workerman给Timer定时器里的方法传参数

一、需求 1、进程启动时onWorkerStart()里有一个Timer定时器,我想把$worker->id进程ID传递到另一个Demo类的run()方法里。 <?php namespace app\kj\controller; use think\worker\Server; use Workerman\Lib\Timer; use app\kj\controller\Demo; class Worker extends Server { protected $socket = 'h

美奇软件开发工作室 1444

2.1 量子精密测量:SERF原子陀螺仪中的核自旋-电子自旋强耦合机制

本文深入解析了SERF原子陀螺仪中核自旋-电子自旋强耦合机制的核心原理与应用。通过量子精密测量技术,SERF陀螺仪实现了超高精度的惯性导航,其独特的磁场自补偿和拉莫尔进动特性使其在弱磁场环境下表现出色。文章还探讨了关键技术突破和前沿进展,展示了量子精密测量在惯性导航领域的巨大潜力。

kotlin6android的博客 211

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1907

内核定时器的使用

概要内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 和 kernel/timer.c 文件中。被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则:1) 没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。2) 不能执行休眠(或可能

iczyh的专栏 4226

别再被网站风控了!手把手教你修改Chromium源码,实现TLS指纹随机化

本文详细介绍了如何通过修改Chromium源码实现TLS指纹随机化,有效规避网站风控。文章深入解析了TLS指纹(如JA3指纹)的工作原理,并提供了具体的源码修改步骤和编译方法,帮助开发者突破高级反爬技术。通过动态打乱加密套件顺序,实现每次请求生成不同的指纹,显著提升自动化工具的隐蔽性。

weixin_28712661的博客 427

add_timer

FROM:http://book.51cto.com/art/201202/319703.htm   add_timer 当程序定义了一个定时器对象,并且通过init_timer函数及相应代码对该定时器对象中的expires、data和function等成员初始化之后,程序需要调用add_timer将该定时器对象加入到系统中,这样定时器才会在expires表示的时间点到期后被触发。可以想见,

LBO4031的专栏 1885

移远EC800M CAT1模块HTTP POST实战:从AT指令到数据上报的完整避坑指南

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报的完整开发流程,包括模块初始化、PDP上下文配置、HTTP POST实现及优化策略。针对实际开发中的常见问题如网络异常、低功耗需求等提供了经过验证的解决方案,帮助开发者快速实现稳定可靠的物联网数据传输功能。

weixin_42556197的博客 481

从零到一:手把手教你用DJI E-Port套件为M350 RTK开发第三方负载(PSDK V3实战)

本文详细介绍了如何使用DJI E-Port套件为M350 RTK开发第三方负载,涵盖硬件配置、开发环境搭建及实战应用。通过PSDK V3开发套件,开发者可以高效实现负载与无人机的通信,适用于电力巡检等工业场景,提升开发效率与系统稳定性。

weixin_26841743的博客 704

对internal_add_timer 的疑惑

static inline void internal_add_timer(struct timer_list *timer) {  /*  * must be cli-ed when calling this  */  unsigned long expires = timer->expires;  unsigned long idx = expires - 

ruixj的专栏 1966

新手避坑指南:用SARScape 5.6.2处理Sentinel-1数据做SBAS-InSAR,这些参数设置错了白忙活

本文详细介绍了使用SARScape 5.6.2处理Sentinel-1数据做SBAS-InSAR时的关键参数设置技巧,帮助新手避免常见错误。重点解析了连接图生成、干涉工作流、DEM处理等环节的12个关键参数,包括Max Normal Baseline、Unwrapping Coherence Threshold等,提供实测安全值范围和优化建议,确保处理效率和结果准确性。

weixin_30694389的博客 557

内核定时机制API之add_timer_on

add_timer_on 用于在形参指定的cpu上开始一个定时器. 其源码分析如下: 从这个函数可以知道每个cpu上都有timer的list.如果调用add_timer的时候没有指定cpu 其实就是运行在当前的cpu上。 void add_timer_on(struct timer_list *timer, int cpu) { struct timer_base *new_base, *bas

jason的笔记 2400

cadence virtuoso 激励信号源

vpulse,vpwl,vsin,vsource信号源介绍

努力学习的IC小白 3万+

CAN轴控制流【6041,6040】

【代码】CAN轴控制流【6041,6040】

cfqq1989的博客 1783

2020-12-12 Linux 内核定时器应用 init_timer add_timer

Linux 内核定时器应用 init_timer add_timer 一、定时器的结构体,kernel/include/linux/timer.h。 二、相关的API函数。 初始化定时器: void init_timer(struct timer_list * timer); 增加定时器: void add_timer(struct timer_list * timer); 删除定时器: int del_timer(struct ti...

海月汐辰 1797

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

内核定时机制API之add_timer

void add_timer(struct timer_list *timer)用于开始一个定时器。 这个函数在内核中用的实在是太多了。 其源码分析如下: void add_timer(struct timer_list *timer) { BUG_ON(timer_pending(timer)); mod_timer(timer, timer->expires); } 首先通过timer_p

jason的笔记 5057

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

sys_timer_add()和sys_timer_add_to_task()函数的区别

如果你想把多个定时器回调集中到一个专用线程处理(比如创建一个专门的事件处理线程),使用。如果你想让定时器回调在当前线程环境中执行(比如更新当前线程的UI),使用。允许显式指定一个目标线程(task_name)来执行定时器回调。// 指定"event_thread"线程处理定时器。系统通过自动检测当前线程上下文来确定回调的执行位置。无论从哪个线程调用,回调都会在指定的任务线程中执行。适用于需要将定时事件集中到特定线程处理的场景。适用于定时器回调需要与当前线程交互的情况。// 在当前线程上下文中添加定时器。

he30837993的博客 449

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

8.3.2 add_timer

http://book.51cto.com/art/201202/319703.htm 8.3.2  add_timer 当程序定义了一个定时器对象,并且通过init_timer函数及相应代码对该定时器对象中的expires、data和function等成员初始化之后,程序需要调用add_timer将该定时器对象加入到系统中,这样定时器才会在expires表示的时间点到期后被触发。

JK198310的专栏 1256

linux内核timer执行上下文,内核定时器的使用(好几个例子add_timer)

LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 和 kernel/timer.c 文件中。被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则:1) 没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。2) 不能执行休眠(或...

weixin_32411919的博客 970

linux c自写时钟,关于internal_add_timer函数(linux/kernel/timer.c中定义的)的一个问题

关于internal_add_timer函数的一个问题staticvoidinternal_add_timer(tvec_base_t*base,structtimer_list*timer){unsignedlongexpires=timer->expires;unsignedlongidx=expires-base->timer_jiffies;st...

weixin_33154775的博客 277

复杂一点的add_timer

总的来说,timer的用法还是很简单的。主要需要定义一个timer_list变量timer、先初始化timer   init_timer(&timer);   then 对timer的相关参数赋值:   timer.function = fun;   timer.expires = jiffies + TIMER_DELAY;   add_timer(&timer);   在定时器时间到的时候,会

2957

linux 0.12: 我对add_timer的修改

今天看到add_timer函数,注释中说这个有点问题。 我仔细看了一下,果然有点问题。自己修正了一下,还请大家看看。红色部分是我改的。不过貌似free_timer这个东西还是有点问题。源代码如下:/**  linux/kernel/sched.c*  *  This piece of code is copied from Linux Kernel 0.12.*  Since the timer

RichardYSteven的专栏 2862

杰理AC632定时任务接口sys_timer_add和usr_timer_add区别详述

详细讲述了杰理AC632蓝牙SOC定时任务接口sys_timer_add和usr_timer_add的区别,并给出了简单测试。

ydgd118的博客 2887

内核函数add_timer 内核版本2.6.32

struct timer_list {     struct list_head entry;               //将多个定时器连城链表     unsigned long expires;              //超时时间,用节拍表示,此值小于或等于jiffies的时候说明定时器到期或终止     void (*function)(unsigned long);//超时后执行的...

yldfree的博客 2079
上一篇: mtdoops 和 kdump 原理
下一篇: 添加字符设备
lamdoc
博客等级 码龄18年 155粉丝 655原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值