Linux设备驱动学习(五)------Linux下定时器操作

Linux设备驱动之timer定时器与延时 理论知识 原理介绍 软件意义上的定时器是依赖硬件定时器实现的,内核在时钟中断发生后检测各个定时器是否到期,如果到期,将到期的定时器的处理函数作为软中断的下半部执行。实质上,时钟中断处理程序会唤醒TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。 timer定时器的重要数据结构 struct timer_list { /* 阅读详情

在裸机编程中,我们知道常用的三大模块,GPIO,定时器,UART(串口),前面几篇文章已经介绍了GPIO的模块与应用的分而治之的模型,还有串口通讯的统一接口,那么接下来就是定时器的操作了:

让我们想想,我们在裸机的时候,定时器一般实现什么功能?延迟(这个必须有),计数(这个很常用),超时中断(用的也挺多),那么在Linux下,我们又怎么实现他们呢?


延迟:

Linux下的延迟比较简单,和windows下编程差不多,sleep()函数,没错,就是它,在us/os中,任务的调度就发生在延迟函数下,而裸机编程我们要迟延时候,就只能在那里空转盲等,非常的浪费资源。

sleep延迟的单位是s,如果想要延迟毫秒或者微妙,就用usleep();usleep的基本单位是us(微妙),所以如果一个操作我想要延迟2ms,就值需要调用usleep(2000);就可以延迟2ms,是不是比裸机编程操作方便了很多,而且效率还高,不会浪费硬件资源在哪里盲等!


计数:

这个也很常用,我们常常要记录下一个操作,或者一个引脚的电平的长度时候,就需要使用计数功能。裸机编程下,一般都会有个寄存器存放从计时开始到现在的计数次数,我们一般通过这个方法读出寄存器里面的数值,而在Linux却完全不是这样,也是通过一个结构体,通过操作统一的函数接口来获取。

Linux下,对于时间操作有个很重要的结构体:

	struct timeval
	{
		tv_sec;		//秒数
		tv_usec;	//微妙数
	}

这个结构体记录着需要计时的秒数,和微妙数,如果看过我前面串口通讯的文章的朋友,对这个结构体不陌生,我在使用select方法的时候,设置一个超时的时间,用的就是这个结构体。这个可以精确的对时间进行操作。

让我们看一段代码,怎么获取某个操作的时间长度:

#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>

int main()

{

	struct timeval tpstart, tpend;			//记录记录时间开始和结束的两个变量
	double timeuse;					//最后换算成double类型的,如1.23s

	int i = 0;					//短暂延迟变量

	gettimeofday(&tpstart, NULL); 			//记录开始计时时间tpstart

	for (i = 0; i < 65536; i++);				//延迟一会

	gettimeofday(&tpend, NULL); 				//记录计时结束时间tpend

	timeuse = 1000000 * (tpend.tv_sec - tpstart.tv_sec) + tpend.tv_usec- tpstart.tv_usec;

	timeuse /= 1000000;							//换算成*.* s

	printf("processor time is %lf s\n", timeuse);

	return 0;

}
这个程序很简单,可能大家不理解的是,gettimeofday这个函数,大家应该都知道Linux所有时间起始位1970年1月1日,00:00开始,这个函数就是计算从这个时间点,到现在的精确时间,精确到微妙,经过差值换算,就可以得到执行for语句所耗费的时间,Linux中也很多不精确计时法,只能计时到秒级,这里就不多说了。一般这样的操作可以满足大多数情况。

超时中断:

这个功能我没有在应用程序层实验过,但是在内核驱动层,却是有这个功能,我用的也不多,只是简单的介绍下:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>

struct timer_list timer;							//定义定时器结构体

//超时中断服务子函数
void timeout(void)
{
	printk("<0>Time out!The data is %d\n",timer.data);
}

static int __init timer_init(void)  
{
	init_timer(&timer);							//初始化定时器
		
	timer.data = 5;								//为了验证进入了中断
	timer.expires = jiffies + (5*HZ);					//设置超时时间
	timer.function = timeout;						//设置超时之后中断服务子程序入口

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


static void __exit timer_exit(void)	
{
	del_timer(&timer);
	printk("Goodbye!Kernel\n");
}

module_init(timer_init);
module_exit(timer_exit);

MODULE_LICENSE("GPL");
这个模块加载之后,5秒之后就会进入中断程序,打印出一段话,表示成功进入了超时中断。

jiffies为一个全局变量,unsigned long 类型,它是从机子开始运行,到现在为止,产生的节拍总数,在每次时钟中断时都会加1,HZ是个宏定义,表示一秒产生的中断次数,所有上面的表达语句为5秒产生超时中断。

相信到了这里,大家对于Linux编程应该有了一点入门的感觉了,我至少有这个感觉,它的逻辑结构和操作都和裸机编程不一样,不过慢慢的我们要转变过来,下一篇文章我会讲述,我们为什么要在嵌入式系统中采用Linux!

linux内核学习13:时钟、定时器、延时/定时机制 1、时钟和定时电路 Linux内核必须完成两种主要的定时测量 ,我们可以对此加以区分: 保存当前的时间和日期 ,以便能通过time()、ftime()和gettimeofday()系统调用把它们返回给用户程序,也可以由内核本身把当前时间作为文件和网络包的时间戳。 维持定时器 ,这种机制能够告诉内核或用户程序某一时间间隔已经过去 定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的。 https://www.iteye.com/blog/wangyuxxx-1725792 2.、定时器 3、延时/定 阅读详情

相关推荐

Linux设备驱动中的定时器与延时

定时器可以在指定的时间间隔内反复触发,用于执行特定的任务。在驱动开发中,合理使用定时器和延时机制可以实现各种时间相关的功能。在Linux设备驱动中,定时器和延时是两个常用的机制,用于实现时间相关的操作和功能。在Linux设备驱动中,可以使用内核提供的定时器机制来实现定时执行某个任务的功能。定时器可以在指定的时间间隔内反复触发,以执行特定的操作。在回调函数中,可以执行特定的操作,并通过重新设置定时器的方式实现定时任务的循环执行。函数中,首先初始化定时器,然后设置定时器的触发时间,并最后启动定时器。

InjeProgram的博客 289

linux驱动-定时器

1、设置系统节拍率 在编译 Linux 内核的时候可以通过图形化界面设置系统节拍率。 -> Kernel Features -> Timer frequency CONFIG_HZ Linux 内核会使用 CONFIG_HZ 来设置自己的系统时钟。打开文件 include/asm-generic/param.h #undef HZ #define HZ CONFIG_HZ #define USER_HZ 100 #define CLOCKS_PER_SEC (US.....

qq_37932504的博客 1559

Linux中,通过ioctl函数控制定时器驱动是设备驱动开发的核心技术之一

Linux中,通过ioctl函数控制定时器驱动是设备驱动开发的核心技术之一

a_zxswer的博客 659

Linux驱动开发基础__定时器

Linux驱动开发基础__定时器

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 4783

Linux定时器驱动程序深入指南

本文还有配套的精品资源,点击获取 简介:在Linux内核中,定时器驱动程序为系统提供时间管理功能,包括软硬件定时器的实现和管理。本文将详细解析Linux定时器机制,涵盖定时器API使用、硬件定时器与软件定时器的区别、高分辨率定时器(hrtimer)以及如何在Linux驱动程序中实现和管理定时器。通过实例分析,本文旨在指导开发者如何选择和使用定时器来优化系统性能和稳定性。 ...

weixin_35972981的博客 1386

保姆级教程:在DolphinScheduler 3.x中配置Apache SeaTunnel任务(Flink/Spark双引擎)

本文提供了一份详细的教程,指导如何在DolphinScheduler 3.x中配置Apache SeaTunnel任务,支持Flink和Spark双引擎。从环境准备、脚本选择到配置文件编写和任务调度优化,涵盖了所有关键步骤和常见问题解决方案,帮助用户高效集成SeaTunnel到海豚调度系统中。

weixin_42524945的博客 194

Linux学习第21天:Linux内核定时器驱动开发: 流淌的时间长河

本节笔记主要学习Linux内核定时器的驱动开发,主要包括内核时间管理和定时器、硬件原理图分析【LED】、驱动开发和测试。最重要的内容为定时器驱动开发部分。

2328

Android Camera Sensor HDR详解

本文详细介绍了Android相机传感器(Sensor)中实现高动态范围(HDR)采集的各种技术方式。主要内容包括: Sensor HDR技术分类 帧内HDR(Single-Frame HDR):在同一帧同一像素内完成多增益采集,无运动伪影和帧率损失,包括DAG(双模拟增益)、DCG(双转换增益)等技术 帧间HDR(Multi-Frame HDR):通过多帧曝光实现,如DOL(数字重叠)、Staggered HDR等 混合HDR:结合多种技术的复合方案 详细技术原理 重点解析了DAG和DCG两种主流帧内HDR

DU_YULIN的博客 362

【linux驱动】定时器的使用

linux驱动:定时器

嵌入式修炼师的博客 1299

ZEMAX优化方法---【Zemax学习】

在光学系统自动设计中,优化设计是光学设计中的重要阶段,也是ZEMAX软件的核心功能,涉及评价函数、权因子、阻尼因子等重要概念。在常用的阻尼最小二乘法优化设计的基础上,ZEMAX给我们提供了三种优化选择:Optimization(局部优化)、Global Search(全局优化)和 Hammer Optimization(锤形优化)。

yh的博客 4454

银行客户投诉预测模型优化

在实际操作中,银行可以使用这个优化后的模型来识别那些可能引起客户不满的因素,并采取预防措施。例如,如果模型表明退款金额是一个很强的预测因子,银行可能会审查其退款政策,以确保它对客户是公平和透明的。在银行业务中,客户投诉是一个重要的指标,它直接关系到客户满意度和银行服务质量。某一个指标,比如:退款金额,本文假设退款金额对于预测投诉的权重应该高于赔偿金额。在每次迭代中,本文使用当前的权重组合来训练模型,并计算在测试集上的准确率。的可能值来搜索最佳的权重组合,并输出最佳准确率及对应的权重。来寻找最佳的权重组合。

weixin_57499254的博客 1708

Linux驱动学习—内核定时器

比如,现在是10点5分,我要定时5分钟,那么定时就是10点5分+5分钟=10点10分。HZ的值我们是可以设置的,也就是一秒对应的时钟拍数我们是可以设置的,Linux内核会使用CONFIG_HZ来设置自己的系统时钟。宏HZ就是CONFIG_HZ,因此HZ=100,表示一秒的节拍数是100,在编译Linux内核的时候可以通过图形化界面设置系统节拍率,按照如下路径打开配置界面。通过上图我们可以发现可选的系统节拍率为100HZ,200HZ,250HZ,300HZ、500HZ和1000HZ.默认是100HZ。

suifen_的博客 2337

AI工具如何提升产品经理工作效率

AI工具在现代产品管理中扮演着越来越重要的角色,从需求挖掘到原型设计再到交付物制作,AI技术正在重塑产品经理的工作流程。通过自然语言处理(NLP)和机器学习(ML)技术,AI工具能够自动化处理大量重复性任务,如用户访谈转录、竞品分析、原型生成等,显著提升工作效率。以ChatGPT和Notion AI为例,这些工具可以快速生成结构化分析框架和PRD初稿,将传统需要数小时甚至数天的工作压缩到几分钟内完成。在产品设计阶段,工具如Uizard和Galileo AI能够根据文本描述自动生成可交互原型,大幅缩短设计探索

weixin_29194817的博客 243

学习Linux内核必读的五本书

如果希望在Linux操作系统上支持计算机外部设备,或者在Linux上运行新的硬件,或者只是希望一般性地了解Linux内核的编程,就一定要阅读本书。网络功能的实现或破坏在不同的时候是由不同的代码块完成的,这正是理解网络和实现它的难点中的一部分。这门课可以带您用理论结合实践的方法一步一步抓住Linux内核最核心的部分代码,理解Linux操作系统运行的基本过程及涉及的核心机制。一本讲解网络子系统实现的书,通过这本书,我们可以了解到Linux内核是如何实现复杂的网络功能的。简称LKD,内核新人首选必读的书籍。

m0_74282605的博客 1708

如何制作DOS启动盘 U盘制作DOS启动盘 HP-U盘启动DOS7 详细步骤教程 Intel网卡使用软件 bootutil lanconfig eeupdate Intel网卡修改MAC地址教程

制作DOS启动盘不是一项复杂的任务,只要按照以下简单的步骤进行操作,您就可以自己动手制作一个DOS启动盘。

lcy524514826的博客 898

9 硬件工程师笔面试高频知识考点真题解析——运算放大器

运算放大器(运放)摘要 运放是一种高增益、差分输入的模拟集成电路,具有虚短(线性区输入电压相等)和虚断(输入电流为零)特性,支持负反馈(线性放大)和开环/正反馈(饱和区比较)两种工作模式。关键特性包括高输入阻抗、低输出阻抗,理想运放参数(如无限增益)与实际参数(如有限带宽)的差异。 选型要点: 信号特性:直流/低频信号关注失调电压(Vos)、温漂;高频信号侧重带宽(GBW)和压摆率(SR)。 电源条件:单/双电源供电、电压范围及功耗需求(如电池设备需低静态电流)。 精度与噪声:微弱信号需低噪声运放,高精度场

XU157303764的博客 1677

【Linux】Linux设备驱动开发详解:基于最新的Linux 4.0内核

1 Linux设备驱动概述及开发环境构建 1.1 设备驱动的作用 驱使硬件设备行动 1.2 无操作系统时的设备驱动 典型架构:一个无限循环中夹杂着对设备中断的检测或者对设备的轮询 1.3 有操作系统时的设备驱动 并发 、内存管理 1.4 Linux 设备驱动 1.4.1 设备的分类及特点 ● 字符设备。 ● 块设备。 ● 网络...

九牧林的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

linux驱动怎么判断定时器正在运行,Linux设备驱动编程之定时器

Linux设备驱动编程之定时器2006-10-26 13:34作者:出处:Linux责任编辑:方舟相关专题:Linux设备驱动程序开发入门Linux内核中定义了一个timer_list结构,我们在驱动程序中可以利用之:struct timer_list {struct list_head list;unsigned long expires; //定时器到期时间unsigned long data...

weixin_35410099的博客 178

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

linux设备驱动归纳总结

【转自diytvgy的日志:http://apple.chinaunix.com/space.php?uid=25014876&do=blog&id=59420】前言:我的总结是根据学习时的笔记(李杨老师授课)、《linux内核设计与实现》第三版、《linux设备驱动程序》第三版和《linux设备驱动开发详解》第一版来归纳的。·linux设备驱动归纳总结(一):内核的相关基础概念||---------1.1、linux设备驱动的作用|         1.2、内核代码树介绍|         1.3、内核补

草莽农夫 2508

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《Linux设备驱动程序》(第三版)的详细目录

本书的目标本书的组织结构本书的约定排版约定代码约定本书使用的内核版本获得帮助反馈1.1 什么是设备驱动程序1.1.1 驱动程序的角色1.1.2 字符设备、块设备和网络设备1.2 为什么要写驱动程序1.2.1 为新硬件写驱动程序1.2.2 访问内核服务1.2.3 与内核开发者交流1.3 设备驱动程序的模块形式1.3.1 什么是内核模块1.3.2 模块的优点1.4 为什么要关心内核版本1.4.1 内核版本号1.4.2 内核版本的差异。

qq_40844444的博客 1135

【原创】《Linux设备驱动程序》学习之循序渐进 --- 时间、延迟及延缓操作

【原创】《Linux设备驱动程序》学习之循序渐进 --- 时间、延迟及延缓操作 第七章

GengLUT 1320

Linux设备驱动程序第七章——时间、延迟及延迟操作

其实现定义在。

感觉画质不如...原神的博客 912

精通 LINUX 设备驱动程序开发

精通 LINUX 设备驱动程序开发 去发现同类优质开源项目:https://gitcode.com/ 本书旨在深入探讨 Linux 设备驱动程序开发,涵盖了从内核基础到高级主题的各个方面。通过学习本书,读者可以掌握编写高效、稳定的 Linux 设备驱动程序所需的知识和技能。 目录 本书共分为 23 章,涵盖了以下主题: 引言:介绍 Linux 设备驱动程序开发的基本概念、工具和环境。 内核:深入...

gitblog_06744的博客 822

《Linux设备驱动程序》(第三版) 第5章 定时器和时间管理

如果有,内核调用相应的定时器回调函数。定时器的实现涉及到内核的定时器队列管理,每个定时器都被插入到一个按到期时间排序的队列中。时钟滴答是系统定时器中断的频率,不同的系统可能有不同的滴答频率。例如,在等待设备响应时,如果在指定时间内设备未响应,则执行相应的超时处理逻辑。表示的是时钟滴答数,通常需要将其换算为实际的时间单位(如秒、毫秒)。Linux内核提供了定时器机制,允许驱动程序在未来的某个时间点执行特定的函数。函数,它会使当前进程睡眠指定的毫秒数,让出CPU资源。函数,分别用于微秒级和纳秒级的延迟。

qq_40844444的博客 917

Linux设备驱动核心

信号量采用睡眠等待机制: 如果有一个任务试图获得一个已经被占用的信号量时, 信号量会将其推到一个等待队列中睡眠, 当持有信号量的进程将信号量释放后, 处于等待队列中的那个任务被唤醒, 并将获得该信号量。中断上下文: 中断服务程序执行时所处的内核环境,CPU的所有寄存器的值、 中断相关的硬件参数( 中断控制器的寄存器中的值) 、 被打断进程的信息等。如果CPU接收到一个中断, 它会停止一切工作,调用中断处理函数, 因为进程调度依赖中断, 此时进程调度也会停止, 所以就要求我们的中断处理一定要快。

实力派,无需多言! 1098
上一篇: Linux设备程序设计(四)------Linux下串口通讯
下一篇: 嵌入式中为什么要用Linux操作系统?
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值