Linux内核开发之中断与时钟(一)

时钟中断(1) 在所有外部中断中,时钟中断起着特殊的作用。因为计算机是以精确的时间进行数值运算的数据处理的,最基本的时间单元是时钟周期,例如取指令,执行指令,存取内存等,我们将要讨论的是操作系统建立的时间系统,这个时间系统是整个操作系统活动的动力。 阅读详情

“小王,醒醒,开始上课了,今天咱们开始讲中断,这可是高级东西,错过不补哈”我使劲推着睡梦中的小王。

“嗯?感情好啊,快点,快点”小王一听有新东西讲,像打了鸡血似的兴奋,连我都怀疑起她是不是性格中喜新厌旧。

不管那么多了,我讲我的,她厌她的…

  啥叫中断?就是指cpu在执行过程中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU有返回原程序被中断的位置并继续执行。

  中断的分法不懂,分类就不同,向什么内外部中断,可/不可屏蔽中断…等等乱七八糟一大堆,我这里要说明的一点是按照中断入口跳转方法的不同,可分为向量中断和非向量中断。采用向量中断的CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行。不同的中断号有不同的中断地址(即入口)。而非向量中断的多个中断共享一个入口地址。进入后根据软件判断中断标志来识别具体是哪个中断。也就是说,向量中断是由硬件提供中断服务程序入口地址,非向量中断由软件提供中断服务程序入口地址。

  我们在后边会说到一个时钟定时器,它也是通过中断来实现的。它的原理很简单,嵌入式微处理器它接入一个时钟输入,当时钟脉冲到来时,就将目前的计数器值加1并和预先设置的计数值比较,若相等,证明计数周期满,产生定时器中断并复位目前计数器值。

              123

 

 

 

 

 

 

Linux中断处理架构

设备的中断会打断内核中进程的正常调度和运行,会影响系统的性能。为了在中断执行时间尽可能短和中断处理需完成大量工作之间找到一个平衡点,Linux将中断处理程序分解成两个半部:顶半部和底半部。其中顶半部尽可能完成尽可能少的比较紧急的功能。而底半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断。

在linux设备驱动中,提供了一系列函数来帮助设备实现中断的相关操作:

1)设备申请中断

int request_irq(unsigned int irq,  //irq是要申请的中断号

                    void (*handler)(int irq, void *dev_id, struct pt_regs * *regs),//回调函数,中断发生时,系统会调用该函数,

                    unsigned long irqflags,

                    const char *devname,

                    void *dev_id);

其中irqflags是中断处理的属性,若设置为SA_INTERRUPT,则表示中断处理程序是快速处理程序,它被调用时屏蔽所有中断。若设置为SA_SHIRQ,则表示多个设备共享中断,dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL.

该函数返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回EBUSY表示中断已经被占用且不能共享。

2)释放中断

free_irq(unsigned int irq, void *dev_id);

3)使能和屏蔽中断

void disable_irq(int irq);   //这个会立即返回

void disable_irq_nosync(int irq);//等待目前的中断处理完成再返回。

void enable_irq(int irq);

上述三个函数作用于可编程中断处理器,因此对系统内所有的CPU都生效。

void local_irq_save(unsigned long flags);//会将目前的中断状态保留在flags中

void local_irq_disable(void);//直接中断

这两个将屏蔽本CPU内的所有中断。对应的上边两个中断的方法如下

void local_irq_restore(unsigned long flags);

void local_irq_enable(void);

 

我们两边说了Linux系统中中断是分为顶半部和底半部的,那么在系统实现方面是具体怎样实现的呢,这主要有tasklet,工作队列,软中断:

1)tasklet:使用比较简单,如下:

void my_tasklet_function(unsigned long); //定义一个处理函数

DECLARE_TASKLET(my_tasklet, my_tasklet_function, data); //定义了一个名叫my_tasklet的tasklet并将其与处理函数绑定,而传入参数为data

在需要调度tasklet的时候引用一个tasklet_schedule()函数就能使系统在适当的时候进行调度运行:tasklet_schedule(&my_tasklet);

2)工作队列:使用方法和tasklet相似,如下:

struct work_struct my_wq; //定义一个工作队列

void my_wq_func(unsigned long);  //定义一个处理函数

通过INIT_WORK()可以初始化这个工作队列并将工作队列与处理函数绑定,如下:

INIT_WORK(&my_wq, (void (*)(void *))my_wq_func, NULL);  //初始化工作队列并将其与处理函数绑定

同样,使用schedule_work(&my_irq);来在系统在适当的时候需要调度时使用运行。

3)软中断:使用软件方式模拟硬件中断的概念,实现宏观上的异步执行效果,tasklet也是基于软中断实现的。

在Linux内核中,用softirq_action结构体表征一个软中断,这个结构体中包含软中断处理函数指针和传递给函数的参数,使用open_softirq()可以注册软中断对应的处理函数,而raise_softirq()函数可以触发一个中断。

软中断和tasklet仍然运行与中断上下文,而工作队列则运行于进程上下文。因此,软中断和tasklet的处理函数不能休眠,但工作队列是可以的。

local_bh_disable()和local_bh_enable()是内核用于禁止和使能软中断和tasklet底半部机制的函数。

 

下边咱们再来说说有关中断共享的相关点:中断共享即是多个设备共享一根硬件中断线的情况。Linux2.6内核支持中断共享,使用方法如下:

*共享中断的多个设备在申请中断时都应该使用SA_SHIRQ标志,而且一个设备以SA_SHIRQ申请某中断成功的前提是之前该中断的所有设备也都以SA_SHIRQ标志申请该终端

*尽管内核模块可访问的全局地址都可以作为request_irq(….,void *dev_id)的最后一个参数dev_id,但是设备结构体指针是可传入的最佳参数。

*在中断带来时,所有共享此中断的中断处理程序都会被执行,在中断处理程序顶半部中,应迅速根据硬件寄存器中的信息比照传入的dev_id参数判断是否是被设备的中断,如果不是,应迅速返回。

 

结语:在这次讲解中说了三种Linux系统中中断的顶/底半部机制和中断共享的先关内容,但碍于页面空间的原因,没有给出例子,我在下次博客中会专门来对每个点给出典型的模版.

Linux 时钟中断处理(一) 最近想研究下Linux下的时钟中断,因为时钟中断算是一个操作系统下最频繁的中断事件了吧(个人认为)。 以4.5 x86_64 Linux内核为例。 面对庞大的代码量,无从下手啊。不如从中断号看起吧微笑Linux 源码中有这样的定义(arch/x86/include/asm/irq_vectors.h): #define LOCAL_TIMER_VECTOR 0xef 如果没猜错的话,应该就是Linux下的时钟中断向量了(0xEF=239)。 阅读详情

相关推荐

Linux 时钟中断详解

在Linux的0号中断是一个定时器中断。在固定的时间间隔都发生一次中断,也是说每秒发生该中断的频率都是固定的。该频率是常量HZ,该值一般是在100 ~ 1000之间。该中断的作用是为了定时更新系统日期和时间,使系统时间不断地得到跳转。另外该中断的中断处理函数除了更新系统时间外,还需要更新本地CPU统计数。指的是调用scheduler_tick递减进程的时间片,若进程的时间片递减到0,进程则被调度出去而放弃CPU使用权。 时钟中断的产生 Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这

C/C++Linux、音视频、DPDK 4462

Linux设备驱动程序之中断与时钟(一)

Linux设备驱动程序之中断与时钟(一) http://www.cnblogs.com/hanyan225/archive/2010/10/24/1859796.html “小王,醒醒,开始上课了,今天咱们开始讲中断,这可是高级东西,错过不补哈”我使劲推着睡梦中的小王。 不管那么多了,我讲我的,她厌她的…   啥叫中断?就是指cpu在执行过程中,出现了某些突发事件时CPU必须暂停执行当前的

lqf785435771的专栏 697

Linux之时钟中断

from:深入分析Linux内核源码(http://oss.org.cn/kernel-book/)  时钟中断的产生      Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入CPU,就可以引发一个中断请求信号,我们就把它叫做时钟中断。 “时钟中断”是特别重要的一个中断,因为整个操作系统的活动都受到它的激励。系统利用时钟中断维持系统时间、促使环境的切换,以

Atlas2013的专栏 1万+

由i8253 count too high! resetting.....引起的 《Linux实现时钟中断的全过程》

Linux实现时钟中断的全过程1.可编程定时/计数器的初始化IBM PC中使用的是8253或8254芯片。有关该芯片的详细知识我们不再详述,只大体介绍以下它的组成和作用,如下表5.1所示: 表5.1           8253/8254的组成及作用 名称

wangyong19831110的专栏 732

Linux内核驱动开发(一)

linux操作系统历史开发模式git邮件组 mailing listpatch内核代码组成Makfilearch 体系系统架构相关block 块设备crypto 加密算法drivers 驱动(85%)firmware:外设fs 文件系统include 头文件init 启动代码ipc 进程通信代码kernel 内核lib 库mm 内存管理net 网络相关scripts 脚本security 安全相关sound 音频相关tools 工具(perf 测试工具)

qq_43142509的博客 2767

Linux内核的时钟中断机制(01)

此贴转自http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=driver&Number=385219&page=0&view=collapsed&sb=5&o=all&fpart=第七章 Linux内核的时钟中断 (By 詹荣开,NUDT) opyright © 2003 by 詹荣开 E-mail:zhanrk@sohu.c

huanghaibin的专栏 1210

linux内核时钟驱动,arm驱动linux内核时钟

《[arm驱动]linux内核时钟》涉及内核驱动函数四个,内核结构体一个,分析了内核驱动函数一个;可参考的相关应用程序模板或内核驱动模板一个,可参考的相关应用程序模板或内核驱动一个一、内核定时器意义:内核定时器是软件意义上的定时器,最终依赖定时器来实现。时钟中断处理程序会唤起Timer_softirq软中断,运行当前处理器上到期的所有定时器。二、linux设备驱动编程linux内核提供一组函数,时...

weixin_34381073的博客 225

Java云上香云祭祀线上祭祀系统小程序源码

云上香云祭祀线上祭祀系统”,不仅是一种祭祀方式的创新,更是对传统文化的一次深情致敬。它让我们明白,无论时代如何变迁,对亲人的怀念与尊重永远不会改变。在这个特别的平台上,让我们共同守护那份跨越时空的爱与思念,让心灵得以安放,让生命之树常青。🌳。

2401_84413757的博客 803

《Linux4.0设备驱动开发详解》笔记--第十章:Linux设备驱动中的中断与时钟

10.1 中断与定时器 分类 中断来源 内部中断 来源于CPU的内部(软件中断的指令、溢出、除法错误等) 外部中断 来源于外设请求 是否可屏蔽 可屏蔽中断 不可屏蔽中断 中断的入口方式 向量中断 CPU给每个不同的中断分配不同的中断号,中断发生时会自动跳到该中断号对应的地址执行 非向量中断 多个中断共享一个入口地址,进入该入口后通过软件判断中具体哪个中断 ARM渡河处理器里最常用的中断

zcj的博客 5398

Linear超高PSRR线性稳压器-典型应用电路解析

本文整理完了LT3045数据手册内所有的典型应用电路,试图让沉默的电路开口,简单介绍了他们这样做的目的和原理,从中我们可以更加熟悉这颗经典芯片的应用。但也有一些电路并没有搞懂,遗留下了不少问题。

硬件工程师笔记 2940

稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’?

本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。

weixin_42525005的博客 488

linux arm时钟中断,Linux的时钟及时钟中断

Linux的时钟及时钟中断来源:华强电子网作者:华仔浏览:124时间:2016-08-10 14:18标签:摘要:一般来说,计算机系统应有两个时钟:实时时钟(rtc)和操作系统(os)时钟。由于实时时钟是由硬件电路构成的,并由电池供电,因此即使系统断电,它也可正常工作。这个实时时钟就相当于一个机械钟摆,在机械计时系统中,摆要是出了问题,则后果不可想象。因此,实时时钟是整个计算机系统的计时基准,它为...

weixin_34987986的博客 436

中国ETF基金行情数据API接口

上交所:https://tsanghi.com/api/fin/etf/XSHG/daily?token={token}&ticker={ticker} 深交所:https://tsanghi.com/api/fin/etf/XSHE/daily?token={token}&ticker={ticker}

2401_83242712的博客 4031

linux内核-时钟中断

在所有的外部中断中,时钟中断起着特殊的作用,其作用远非单纯的计时所能相比。当然,即使是单纯的计时也已经足够重要了。别的不说,没有正确的时间关系,你用来重建内核的工具make就不能正常运行了,因为make是靠时间标记来确定是否需要重新编译以及链接的。瞌睡时钟中断的重要性还远不止于此。 我们在中断的博客中看到,内核在每次中断(以及系统调用和异常)服务完毕返回用户空间之前都要检查是否需要调度,若有需要就进行进程调度。事实上,调度只有当CPU在内核中运行时才能发生。在进程的博客中,读者将会看到进程调度发生在两种情

guoguangwu的专栏 3403

KEPServerEX6教程:IoT Gateway与MQTT Client实现工业数据双向通信

工业物联网的核心挑战在于异构设备协议与云端平台之间的数据互通。Modbus、S7、OPC UA等现场协议纷繁复杂,而上层应用普遍偏好MQTT、REST等轻量接口,此时需要一个可靠的协议转换层。MQTT作为低带宽、高可靠的发布/订阅消息协议,天然适合工业数据采集与远程控制场景。KEPServerEX6作为工业网关软件,内置IoT Gateway与MQTT Client组件,分别承担数据上行发布与指令下行订阅的职责,形成完整的双向闭环。通过配置Modbus TCP设备驱动、创建Tag、设置MQTT Broker

weixin_33787529的博客 387

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 604

Linux内核的时钟中断机制

看到一篇关于Linux时钟机制的文章,觉得分析得非常好,转贴于此:Linux内核的时钟中断机制第七章 Linux内核的时钟中断 (By 詹荣开,NUDT) opyright © 2003 by 詹荣开 E-mail:zhanrk@sohu.com Linux-2.4.0 Version 1.0.0,2003-2-14 摘要:本文主要从内核实现的角度分析了Linux 2.4.0内核

2838

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

Linux内核-时间子系统(时钟中断)专题汇总

Linux时间子系统知识汇总

weixin_38597669的博客 1726

yolov8 转华为昇腾om脚本

yolov8 转华为昇腾om脚本

jacke121的专栏 1601

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

linux时间管理,时钟中断,系统节拍

目录 1 时钟中断/系统节拍 1.1 简介 1.2 系统时钟中断需要处理的事情 2 HZ 2.1 简介 2.2 动态调节时钟中断 / CONFIG_NO_HZ / 降低功耗/tickless mode 2.3 获取当前运行系统的HZ值 / USER_HZ 3 jiffies和jiffies_64(记录系统启动以来产生的节拍数) 3.1 简介 3.2 访问jiffies和jiffies_64 3.3 jiffies和毫秒微秒之间的转换 4 uptime(系统启动到现在的时间;系统空闲时

u010936265的博客 3378

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

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

【linux内核分析与应用-陈莉君】时钟中断机制

1.linux时间系统 时间中断是非常重要的一个中断,因为操作系统的活动都受到它的激励,系统利用时钟中断 维持系统事件,促使进程的切换,以保证所有进程共享CPU,利用时钟中断进行记障,监督系统 工作以及确定未来的调度优先级等工作,可以说时钟中断是整个操作系统的脉搏. 2.基本的时钟硬件 linux的OS时钟的物理产生原因是可编程定时计数器产生的输出脉冲,这个脉冲送入CPU以后, 就可以引发一个中断请求信号,我们将它称作时钟中断,时钟中断的周期也就是脉冲信号的 周期,我们将其称作滴答或者节拍. 从

Edidaughter的博客 1227

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Linux】中断与时钟

所谓中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。根据中断的来源,中断可分为内部中断和外部中断,内部中断的中断源来自于CPU内部(软件中断指令、溢出、除法错误等,例如,操作系统从用户态切换到内核态需借助CPU的软件中断),外部中断的中断源来自CPU外部,由外设提出请求。

weixin_47596351的博客 1154
上一篇: Linux内核开发之异步通知与异步I/O(五)
下一篇: Linux内核开发之中断与时钟(二)
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值