当前位置: 首页 > news >正文

Linux延迟操作

一、软中断

Linux内核中定义了如下几种软中断:

enum
{HI_SOFTIRQ=0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */NR_SOFTIRQS
};

软中断的初始化

另外软中断必须在编译的时候静态注册! Linux 内核启动时在start_kernel()时会调用 softirq_init 函数初始化软中断,

void __init softirq_init(void)
{int cpu;for_each_possible_cpu(cpu) {per_cpu(tasklet_vec, cpu).tail =&per_cpu(tasklet_vec, cpu).head;per_cpu(tasklet_hi_vec, cpu).tail =&per_cpu(tasklet_hi_vec, cpu).head;}open_softirq(TASKLET_SOFTIRQ, tasklet_action);open_softirq(HI_SOFTIRQ, tasklet_hi_action);
}

由此可以看出, softirq_init 函数默认会打开 TASKLET_SOFTIRQ 和HI_SOFTIRQ。从这里也可以看出虽然软中断通常是由内核开发者来设计的,但是内核开发者专门保留了一个软中断来给驱动者使用,它就是TASKLET_SOFTIRQ和HI_SOFTIRQ,相应的软中断处理函数是tasklet_action和tasklet_hi_action。

如何使用软中断

一般来说, 驱动的编写者不会也不宜直接使用softirq。在内核中要使用软中断,必须:

先使用 open_softirq 函数注册对应的软中断处理函数,其中参数nr就是要开启的软中断,是以上定义的软中断之一;action为软中断对应的处理函数。

void open_softirq(int nr, void (*action)(struct softirq_action *))
{softirq_vec[nr].action = action;
}

raise_softirq()函数在触发一个软中断之前要先禁止中断,触发之后再恢复原来的状态;如果中断本来就已经被禁止了,那么可以调用raise_softirq_irqoff()函数,将会带来一些优化效果。


inline void raise_softirq_irqoff(unsigned int nr)
{__raise_softirq_irqoff(nr);/** If we're in an interrupt or softirq, we're done* (this also catches softirq-disabled code). We will* actually run the softirq once we return from* the irq or softirq.* Otherwise we wake up ksoftirqd to make sure we* schedule the softirq soon.*/if (!in_interrupt() && should_wake_ksoftirqd())wakeup_softirqd();
}void raise_softirq(unsigned int nr)
{unsigned long flags;local_irq_save(flags);raise_softirq_irqoff(nr);local_irq_restore(flags);
}

raise_softirq()函数可以将一个软中断设置为挂起状态,让它在下次调用do_softirq()函数时投入运行;

在中断处理程序中触发软中断是最常见的形式,在这种情况下,中断处理程序执行硬件设备的相关操作,然后触发相应的软中断,最后退出;内核在执行完中断处理程序以后,马上就会调用do_softirq()函数;于是软中断开始执行中断处理程序留给它去完成的剩余任务。

二、tasklet

tasklet 是利用软中断来实现的另外一种下半部机制。在驱动开发中使用tasklet比较多,它的执行上下文是软中断, 执行时机通常是顶半部返回的时候。 在使用时只需要定义tasklet及其处理函数, 并将两者关联则可, 使用模板为:

/*中断处理底半部*/
void xxx_do_tasklet(unsigned long)
{......
}/*中断处理顶半部*/
irqreturn_t xxx_interrupt(int irq, void *dev_id)
{......tasklet_schedule(&xxx_tasklet);......
}/*定义tasklet和底半部函数并将它们关联*/
DECLARE_TASKLET(xxx_tasklet, xxx_do_tasklet, 0);/*设备驱动模块加载函数*/
int __init xxx_init(void)
{....../*申请中断*/result = request_irq(xxx_irq, xxx_interrupt, 0, "xxx", NULL);......return IRQ_HANDLED;
}/*设备驱动模块卸载函数*/
void __exit xxx_exit(void)
{....../*释放中断*/free_irq(xxx_irq, xxx_interrupt);
}

不管是软中断还是tasklet都有一个限制,它们都是在中断上下文中执行。这也就是导致了不能将特别耗时的工作放在这里,否则系统会很卡;并且不能直接或间接地调用调度器。另外在执行的过程中应用程序是无法执行的。

三、work_struct

1)工作队列的应用场景:要做的事情比较耗时,甚至可能需要休眠,那么可以使用工作队列。

2)工作队列的缺点:在多个工作(函数)是在某个内核线程中依序执行的,钱买你函数执行很慢,就会影响后面的函数。在多CPU的系统下,一个工作队列可以有多个内核线程,可以在一定程度上缓解这个问题。

3)工作队列使用示例(以下是在中断中的示例,当然也可也在在非中断程序中用)如下。

struct work_struct xxx_wq;
void xxx_do_work(struct work_struct *work);/*中断处理底半部*/
void xxx_do_work(struct work_struct *work)
{......
}
/*中断处理顶半部*/
irqreturn_t xxx_interrupt(int irq, void *dev)
{....../*其中schedual_work是用来将work_struct放入系统默认的工作队列并且唤醒内核线程,当内核线程被唤醒之后就会从这个队列里把work_strct取出来然后执行它的函数。*/schedule_work(&xxx_wq);......return IRQ_HANDLED;
}int xxx_int(void)
{......result = request_irq(xxx_irq, xxx_interrupt, 0, "xxx", NULL);......INIT_WORK(&xxx_wq, xxx_do_work);......
}void xxx_exit(void)
{......free_irq(xxx_irq, xxx_interrupt);......
}

这里需要注意在内核中我们并不需要自己去创建内核线程,内核初始化工作队列就是为它创建了内核线程。以后我们要使用工作队列,只需要把“工作” 放入工作队列,对应的内核线程就会取出“工作”,执行里面的函数。

四、delayed_work

https://www.cnblogs.com/zafu/p/7400579.html

reference:

https://www.icode9.com/content-3-534083.html

http://blog.chinaunix.net/uid-23916171-id-2653116.html

相关文章:

Linux延迟操作

一、软中断Linux内核中定义了如下几种软中断:enum {HI_SOFTIRQ0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ, /* Preferable RCU should always be the last soft…...

np.insert()函数用法

目录insert()函数定义程序举例说明行插入列插入多数值行插入完整的程序和显示结果:insert()函数定义 insert(arr, obj, values, axisNone) 参数说明: arr : 需要插入的数组,即Input array; obj:向数组中插入值的位置…...

学习笔记-架构的演进之容器的封装-3月day06

文章目录前言封装应用的Dockerwhy Docker not LXC?附前言 当文件系统、访问、资源都可以被隔离后,容器就已经具备它降生所需要的全部前置支撑条件了。为了降低普通用户综合使用 namespaces、cgroups 这些低级特性的门槛,2008 年 Linux Kernel 2.6.24 内…...

Gorm根据关系模型中的属性查询原模型数据

type ExamResult struct {gorm.ModelExamManagementID uintExamManagement ExamManagement json:"examManagement" // 一场考试,其中有试卷,有试题,有试题答案//MarkExamPaperRecord MarkExamPaperRecord //每一场考试对应的结…...

车载技术【USB接口】—Android配件协议AOA【AOA连接】

简述 AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式,并给出了USB配件…...

SpringBoot的基本概念和使用

文章目录一、什么是SpringBoot二、Spring Boot优点三、Spring Boot项目创建四、Spring Boot 配置文件1. yml语法2.properties与yml关系3.多系统的配置五、Spring Boot日志文件1.日志对象2.日志级别日志级别的设置System.out.println VS 日志的两个致命缺点3.日志持久化4.更简单…...

基于计算机软件技术的化工设计特点

2.1 便利性将计算机软件技术应用于化工设计环节,最大的优点就在于提升了化工企业生产的便利性。化工设计作为化工生产的基础,在化工设计环节需要到有关化学反应和工艺流程设计等的相关问题,通过利用计算机软件技术可以为上述工作提供很好的辅…...

Nativefier把网页打包成exe

前要: 今天遇到一个需求,之前的应用都是用的h5挂载在企业微信的小应用,但是现在需要电脑运行的exe安装包! 所以需要用到nativefier导报工具:nativefier是一个使用electron将网页转换为app的插件,写这篇博客…...

STM32U5开发(1)----通过 USART1 发送数据

概述 通过 USART1 发送一些数据。 最近在弄ST和GD的课程,需要样片的可以加群申请:6_15061293。 生成例程 使用STM32CUBEMX生成例程,这里使用NUCLEO-U575ZI开发板。 选择工程的时候,先不必选择加载了TrustZone。 样品申请 h…...

20230308 Apdl lsdyna两杆撞击案例学习笔记

本次模拟使用的是ANSYS 16.0 一、设置Element type 首先打开APDL界面 添加element type 在LS-DYNA Explicit选择条件下,选择3D solid 164 二、设置材料类型 选择material models 选择Elastic-Isotropic-输入 Density:密度 EX:杨氏模量 NUXY:泊松比 三、几何模型建…...

互相关延时估计 Matlab仿真

文章目录互相关延时估计什么是互相关延时估计?原理代码实现总结互相关延时估计 互相关延时估计是一种信号处理技术,用于计算两个信号之间的时间延迟。在本篇博客中,我们将使用MATLAB来实现互相关延时估计,并提供多个例子和代码&a…...

谷歌插件Fetch在不同页面之间Cookie携带情况详解

content script 和 script inject 表现情况 在碰到content script 注入和用script标签注入一样&#xff0c;即使服务端有写入Cookie到域名下在该tab标签应用下也不会被保存&#xff0c;所以在发送时也无法自动携带&#xff0c;所以通过content script和<script>这种方式…...

Vue学习笔记(8)

8.1 组件自定义事件 在 Vue 中&#xff0c;组件可以通过自定义事件来实现组件之间的通信。自定义事件可以让一个组件触发一个事件&#xff0c;并向其他组件传递数据。以下是自定义事件的实现步骤&#xff1a; 在组件中定义一个事件名&#xff1a;可以在组件中使用 $emit 方法来…...

知道一个服务器IP应该怎么进入

首先我是国内&#xff0c;访问国外的网站比如谷歌等&#xff0c;访问特别慢&#xff0c;有时候甚至登录不进去。现在知道了一个台湾或者国外的服务器应该怎么登录进去呢&#xff1f;知道服务器IP之后&#xff0c;你还需要知道服务器的远程端口帐号密码才能登录的。知道上面信息…...

【计算机基础】Socket IO

一、I/O 模型 一个输入操作通常包括两个阶段&#xff1a; 等待数据准备好从内核向进程复制数据 对于一个套接字上的输入操作&#xff0c;第一步通常涉及等待数据从网络中到达。当所等待数据到达时&#xff0c;它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复…...

mingw编译opencv

我这里是msys2 这个是msys2的教程 https://blog.csdn.net/qq_39942341/article/details/105931335?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167821146216800197067008%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&requ…...

数据结构(八)排序

一、排序的概念以及引用概念排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;…...

函数习题:用函数实现判断一个整数是否能被n整除

Description 输入一组整数&#xff0c;输入0结束&#xff08;这组整数不包含0&#xff09;&#xff0c;输出其中能被n整除的所有整数之和&#xff08;n为整数&#xff0c;不用考虑n为0的情况&#xff09;&#xff0c; n及这组整数均由键盘输入。首先输入n&#xff0c;再输入一…...

SAP 创建会计冲销凭证

“功能描述&#xff1a;根据传输过来数据创建会计冲销凭证&#xff0c;并返回消息和状态 *”---------------------------------------------------------------------- "“本地接口&#xff1a; *” IMPORTING *" VALUE(IW_ZTFKCX0010) TYPE ZTFKCX0010 *" EXP…...

Jetson(Ubuntu18.04)设备无法ping通百度能ping通局域网错误集合,(神奇的是这样的情况下Todesk等远程确没有问题)

一、.打开DNS,意思是取消注释添加114.114.114.114 &#xff0c;文件如下 vim /etc/systemd/resolved.conf [Resolve] #DNS #FallbackDNS #Domains #LLMNRno #MulticastDNSno #DNSSECno #Cacheyes #DNSStubListeneryes然后重启服务sudo systemctl restart systemd-resolved.se…...

Web渗透测试全流程实战指南:从侦察到报告的结构化方法

1. 这不是“黑客速成班”&#xff0c;而是一张能真正带你进渗透测试实战现场的路线图很多人点开“Web渗透测试学习流程图”时&#xff0c;心里想的是&#xff1a;学完这个&#xff0c;我是不是就能黑进某个网站&#xff1f;能不能接单赚钱&#xff1f;甚至幻想自己坐在咖啡馆里…...

事件相机预处理芯片:基于混合内存计算的图像恢复与区域提取

1. 项目概述&#xff1a;为事件相机打造一颗“聪明”的本地大脑如果你接触过机器人、自动驾驶或者智能监控&#xff0c;大概率听说过“事件相机”&#xff08;Event-based Camera&#xff09;&#xff0c;或者更学术一点的名字——神经形态视觉传感器。和咱们手机里每秒拍几十张…...

神经纹理:让3D世界“活”起来的AI魔法,一篇讲透!

神经纹理&#xff1a;让3D世界“活”起来的AI魔法&#xff0c;一篇讲透&#xff01; 引言&#xff1a;从“贴图”到“思考”的纹理革命 想象一下&#xff0c;一个虚拟角色不仅能动&#xff0c;其皮肤还能随着情绪微微泛红、在阳光下呈现真实的汗渍光泽——这不再是电影特效的…...

Oracle EBS的退货处理逻辑

1.1日库存数量1个 价格20元 库存价值1*2020元&#xff0c;采用移动平均成本法2.1日PO1 采购价格 10元 数量3个 入库3个 此时库存价值为 203*1050元 平均价格为 50/412.5元3.1日PO2 采购价格 20元 数量6个 入库6个 此时库存价值为 203020*6170元 平均价格为 170/1017元5.1日PO1 …...

学习笔记·敏捷开发

“嗨,阿米戈!” “嗨,比拉博!” “今天我要给大家讲讲程序通常是怎么开发的。” “在 20 世纪,当现代 IT 还处于起步阶段时,每个人似乎都认为编程就像建筑或制造。” “事情通常是这样的:” “客户会解释他需要的程序类型——它应该做什么以及应该如何做。” “业…...

西门子S7-1200 PLC编程避坑指南:从振荡电路到浮点数计算,新手最易犯的5个错误

西门子S7-1200 PLC编程实战避坑手册&#xff1a;从逻辑陷阱到数据精度的深度解析 在工业自动化领域&#xff0c;PLC编程就像是在钢丝上跳舞——一步错可能导致整个产线瘫痪。作为西门子S7-1200的资深用户&#xff0c;我见过太多初学者在相同的地方跌倒。这篇文章不会给你教科书…...

从零上手腾讯 Marvis:真正接管电脑的 AI,看完直接封神

作者&#xff1a;逆境不可逃 技术永无止境 希望我的内容可以帮助到你&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 大家吼 ! 我是 逆境不可逃 今天给大家带来文章《从零上手腾讯 Marvis&#xff1a;真正接管电脑的 AI&#xff0c;看完直接封神》. Marvis 官…...

工厂MES数据自动采集怎样用AI完成?资深架构师的非侵入式集成落地指南

摘要&#xff1a; 我是架构师老王。在2026年工业数字化转型的深水区&#xff0c;工厂MES数据自动采集已不再是简单的“连线接口”&#xff0c;而是演变为一场关于“感知、决策与执行”的架构革命。面对老旧系统API缺失、烟囱式架构林立以及信创环境下严苛的安全合规要求&#x…...

PPT怎么转PDF?一键快捷操作与全方位转换方法测评

在日常工作中&#xff0c;我们经常需要将PowerPoint演示文稿转换成PDF格式。无论是为了保证演示文件的兼容性、方便分享给他人&#xff0c;还是用于打印和存档&#xff0c;PPT转PDF都是一项必不可少的技能。本文将为你深入讲解PPT转PDF的多种方法&#xff0c;包括快捷键操作、软…...

大麦抢票终极指南:告别手速焦虑,轻松锁定心仪演出门票

大麦抢票终极指南&#xff1a;告别手速焦虑&#xff0c;轻松锁定心仪演出门票 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 面对热门演唱会门票&q…...