简单模拟了定时器功能,需要的朋友可以自己改写和扩充功能。
如果对你有帮助,麻烦点个在看或点个赞,感谢~ 文章首发 公众号—— Pou光明 程序中难免会使用到定时器,今天给大家介绍Linux中一种定时器的实现。...Linux下还有很多其他定时的实现,如精确定时等,感兴趣的同志可以再做深入了解。 编程到现在,其实很多工作都是在调用api,还没能完全脱离面向“谷歌”编程的实质,面对这种情形,如何破局呢?...一、api简介 NAME timerfd_create, timerfd_settime, timerfd_gettime -通过文件描述符来告知定时器状态。...timerfd_settime() 启动或关闭定时器。 new_value参数指定计时器的初始到期时间和间隔。...{ printf("read timerd failed \n"); return -1; } return 0; } 3、通过文件描述符销毁定时器
一般定时器实现的方式有以下几种: 基于排序链表方式: 通过排序链表来保存定时器,由于链表是排序好的,所以获取最小(最早到期)的定时器的时间复杂度为 O(1)。...时间轮: 但对于Linux这种对定时器依赖性比较高(网络子模块的TCP协议使用了大量的定时器)的操作系统来说,以上的数据结构都是不能满足要求的。所以Linux使用了效率更高的定时器算法:时间轮。...时钟通过时分秒来进行分级,当然我们也可以这样,但对于计算机来说,时分秒的分级不太友好,所以Linux内核中,对32位整型分为5个级别,第一个等级存储0 ~ 255秒 的定时器,第二个等级为 256秒 ~...注意:第二级至第五级数组的第一个槽是不挂任何定时器的。 每级数组上面都有一个指针,指向当前要执行的定时器。每当时间走一秒,Linux首先会移动第一级的指针,然后执行当前位置上的定时器。...Linux时间轮的实现 那么接下来我们看看Linux内核是怎么实现时间轮算法的。
用来取代 crontab systemd 系列文章请查看:https://www.khs1994.com/tags/systemd/ 要使用定时器必须编写两个文件: name.timer 配置时间。...编写脚本 /usr/local/bin/name.sh #!.../bin/bash date >> /tmp/name.txt echo 1 >> /tmp/name.txt 在 /etc/systemd/system 文件夹内编写下面的两个文件。...# 描述信息 Description=My systemd timer Demo [Service] Type=simple ExecStart=/usr/local/bin/name.sh 启用定时器...sudo systemctl daemon-reload $ sudo systemctl enable name.timer $ sudo systemctl start name.timer 查看定时器
linux实验示例----实现每2分钟将“/etc”下面的文件打包存储到“/usr/lobal”目录下 ·Step1:编辑当前用户的crontab并保存 终端输入: >crontab -u root -...l #查看root用户设置的定时器 >crontab -u root -e #进入vi编译模式 00-59/2 * * * * /bin/bash /usr/local/crontab_test.sh...#Esc退出编辑模式,在文件尾部输入“:wq”进行保存 ·Step2:/usr/local目录下,编写crontab_test.sh文件 #!...附:具体linux下crontab的使用可以参考“man crontab”指令!
2.Makefile简单的编写 Makefile主要由两部分组成:a.依赖关系,b.依赖方法 我们举个例子: 你在学校,然后给你爸打电话,电话通了之后你说: "爸,我是你儿子",然后就直接挂了....从vim中退出来,编写一个简单的test.c文件: 此时目录下会有两个我们刚才创建的文件:Makefile和test.c 我们直接执行make命令: 我们发现执行命令之后,有了我们想要的mytest...如果有多个文件,我们该如何使用Makefile编写呢?...在编写Makefile时,我们习惯于把依赖文件写成.o的形式.而.o又需要.c来编译。所以Makefile会自动向下寻找这些编译语句,我们只要写上编译的语句即可.
定时器在许多场景中非常有用,尤其是在需要精确定时或定时执行某些任务的情况下。而Linux专门为定时器提供了一套定时器接口。...timerfd_creat timerfd_create是 Linux 中用于创建定时器文件描述符的函数。这个功能主要是用来在指定的时间后或定时间隔内触发事件,适用于需要精确定时的应用。...定时器设置中的时间点 定时器的设置可以涉及两种主要的时间表示方式: 相对时间:定时器从设置的那一刻起开始计时。 绝对时间:定时器从指定的系统时间点开始计时。...关闭定时器:在程序结束时关闭定时器文件描述符。 定时器的使用场景 定时器在许多应用场景中都非常有用,特别是在需要精确时间控制和事件调度的情况下。...检查和调整定时器状态: 使用 timerfd_gettime 检查定时器的当前状态,确保定时器运行如预期。 在必要时动态调整定时器的时间设置,以适应变化的需求。
Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱 动编写者来说最常用的定时器。...function 就是 定时器超时以后的定时处理函数,我们要做的工作就放到这个函数里面,需要我们编写这个定 时处理函数。...void mdelay(unsigned long mseces) 表 50.1.3.1 内核短延时函数 50.3 实验程序编写 本实验对应的例程路径为: 开发板光盘-> 2、 Linux 驱动例程->...50.3.2 定时器驱动程序编写 新建名为“ 12_timer”的文件夹,然后在 12_timer 文件夹里面创建 vscode 工程,工作区命 名为“ timer”。...50.3.3 编写测试 APP 测试 APP 我们要实现的内容如下: ①、运行 APP 以后提示我们输入要测试的命令,输入 1 表示关闭定时器、输入 2 表示打开 定时器,输入 3 设置定时器周期。
时间轮实现 Linux定时器分为低精度定时器和高精度定时器两种类型,内核对其均有实现。本文讨论的是我们在应用程序开发中比较常见的低精度定时器。...下文从单个时间轮出发讲解,逐步扩展至linux实现定时器所采用的多级时间轮算法。...Linux定时器时间轮分为5个级别的轮子(tv1 ~ tv5),如图3所示。每个级别的轮子的刻度值(slot)不同,规律是次级轮子的slot等于上级轮子的slot之和。...Linux时间轮定时器算法的关键在于添加定时器操作和时间轮进位迁移链表操作。先来说添加定时器。添加定时器的关键又在于知道每个时间轮每一个刻度所能表示的到期时间的范围。...Linux在定时器到期检查上的操作也实现得很巧妙。假设curr_time=0x12345678,那么下一个检查的时刻为0x12345679。
函数 5.mod_timer 函数 3.linux内核短延时函数 二、硬件原理图分析 三、实验程序编写 1.修改设备树文件 2.定时器驱动程序编写 3.编写测试APP 四、运行测试 定时器是我们最常用到的功能...一、linux时间管理和内核定时器简介 1.内核时间管理简介 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。...function 就是定时器超时以后的定时处理函数,我们要做的工作就放到这个函数里面,需要我们编写这个定时处理函数。...Linux 内核提供了毫秒、微秒和纳秒延时函数,这三个函数如表所示: 二、硬件原理图分析 三、实验程序编写 本章实验我们使用内核定时器周期性的点亮和熄灭开发板上的 LED 灯,LED 灯的闪烁周期由内核定时器来设置...3.编写测试APP 测试 APP 我们要实现的内容如下: ①、运行 APP 以后提示我们输入要测试的命令,输入 1 表示关闭定时器、输入 2 表示打开定时器,输入 3 设置定时器周期。
批处理:用户事先编好一个完整的Shell脚本,Shell会一次性执行脚本中的诸多命令
# 前言 开发过单片机的小伙伴可以看一下我之前的一篇文章从单片机开发到linux内核驱动,以浅显易懂的方式带你敲开Linux驱动开发的大门。.../init.h> // #include #include #include /* printk()...*/ #include /* kmalloc() */ #include /* everything... */ #include /* error codes */ #include /* size_t */ #include /* O_ACCMODE...*/ #include MODULE_LICENSE("Dual BSD/GPL"); /* 函数声明 Declaration
编写alias命令 Linux操作系统中打开一些应用,有时需要进入对应的文件夹,打开对应的程序,不是很方便。.... ~/.bashrc //更新生效相关的bashrc文件 执行alias命令 执行完第三步,使编写好的alias命令生效了,然后便可以执行刚才写好的alias命令。...打开微信 因为之前编写了微信的alias命令: alias wechat='cd electronic-wechat&&npm start' //添加命令 直接在终端输入如下命令: wechat 回车便会成功打开微信
基本过程是首先使用汇编通过系统调用的方式实现程序功能,编译成可执行文件,然后使用 objdump 进行机器码提取
set_timer() { itv.it_interval.tv_sec = 0; itv.it_interval.tv_usec = 990000; //启动后的定时器每隔...990ms唤醒一次 itv.it_value.tv_sec = 0; itv.it_value.tv_usec = 50000; //定时器在50ms后启动...setitimer(ITIMER_REAL, &itv, &oldtv); //ITIMER_REAL表示每次定时器唤醒时将会触发SIGALRM信号 } void shut_timer...() { itv.it_value.tv_sec = 0; //将启动参数设置为0,表示定时器不启动 itv.it_value.tv_usec = 0;...signal_handler(int m) { count ++; printf("%d\n", count); if(count==4) //调用4次后,关闭定时器
内核定时器介绍 内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数的一种机制,相关函数位于 和 kernel/timer.c 文件中...函数参数 timer:对应的定时器结构体 expires:超时时间 函数返回值 成功返回 :修改成功的时间值 函数定义文件 \linux-3.5\kernel\timer.c 2.2 初始化定时器...函数原型 #define init_timer(timer)\ 函数功能 初始化定时器结构 函数参数 timer:对应的定时器结构体 函数定义文件 \linux-3.5\include\linux\timer.h...函数参数 timer:对应的定 时器结构体 函数返回值 返回0:成功 函数定义文件 \linux-3.5\include\linux\timer.h 2.4 关闭定时器 函数原型 int del_timer_sync...init_timer(&mytimer); /*初始化定时器*/ add_timer(&mytimer); /*启动定时器*/ 完整示例代码: #include <linux
软件意义上的定时器最终依赖硬件定时器来实现, 内核在时钟中断发生后检测各定时器是否到期 , 到期后的定时器处理函数将作为软中断在底半部执行 。...总结起来还是软中断的流程 a.注册软中断处理函数 /*/linux/kernel.timer.c*/ void __init init_timers(void) -->open_softirq(TIMER_SOFTIRQ...在Linux设备驱动编程中,可以利用Linux内核中提供的一组函数和数据结构来完成定时触发工作或者完成某种周期性的事务。...1) 一个timer_list 结构体的实例对应一个定时器,其定义如下: struct timer_list { struct list_head entry, /*定时器列表*/ unsigned...long expires, /*定时器到期时间*/ void (*function) (unsigned long), /*定时器处理函数*/ unsigned long data,/*作为参数被传入定时器处理函数
Linux中编写Shell脚本 目录 Shell Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr...Shell脚本语言很适合用于处理纯文本型的数据,而Linux系统中几乎所有的配置文件、日志文件,以及绝大对数的启动文件都是纯文本类型的文件。...Shell脚本编写规范 Shell脚本的开发规范及习惯非常重要,虽然这些规范不是必须要遵守的,但有了好的规范和习惯,可以大大提升开发效率,并能在后期降低对脚本的维护成本。.../bin/bash cd /opt/project/ scrapy crawl xx python3 test.py 相关文章: Linux中sed工具的使用 Linux中grep工具的使用 Linux...中awk工具的使用 Linux中正则表达式和字符串的查询、替换(tr/diff/wc/find)
比如说,有的驱动是芯片厂商直接写好的,假设芯片厂商提供了对应平台的sdk函数,那么驱动的工作就是对这些sdk函数进行封装就可以了,另外一种就是自己编写具体平台的驱动接口了。...比如说,现在你需要编写串口、i2c、i2s、FLASH、网卡、LCD、触摸屏、USB驱动了。这个时候,你手里面除了一堆芯片手册,啥也没有。能不能调试成功,就看你自己的了。...我们今天所要说的是linux驱动编写。...现在linux驱动比较流行,主要有几个方面的原因:1)linux平台免费,很多芯片厂商希望linux平台支持自己的产品;2)最近android平台很火,这在无形之中帮了linux的忙,搞linux驱动的人也开始多了起来...就拿一个lcd来说,我们可以在windows ce上编写驱动,也可以利用linux framebuffer编写驱动,当然如果是做通信的朋友,也可以利用vxworks来做驱动。
领取专属 10元无门槛券
手把手带您无忧上云