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

嵌入式Linux驱动开发(九)Linux中断

1. Linux中断简介

1)中断号
linux内核中使用一个int变量表示中断号。
2)申请中断:
该函数可以自动激活中断,但是可能引起睡眠,所以需要小心使用。

int request_irq(unsigned int irq, 			//要申请中断的中断号irq_handler_t handler, 		//中断处理函数unsigned long flags,		//中断标志-共享,触发方式等const char *name, 			//中断名void *dev)					//flags设置为共享时,用dev区分中断,一般是设备结构体

3)释放中断:
该函数可以自动释放中断。如果是非共享的,删除中断处理函数后还会禁止中断。共享中断只有在释放最后中断处理函数的时候才会被禁止掉。

void free_irq(unsigned int irq, void *dev)

4)中断处理函数:
该函数可以自动释放中断。如果是非共享的,删除中断处理函数后还会禁止中断。共享中断只有在释放最后中断处理函数的时候才会被禁止掉。

irqreturn_t (*irq_handler_t) (int, void *)
//para1:要处理的中断号
//para2:一个通用指针,与dev参数保持一致,用于区分中断设备。
//返回值irqreturn_t是个枚举类

5)中断使能与禁止函数:

//使能或禁止某一个中断
void enable_irq(unsigned int irq)			//使能
void disable_irq(unsigned int irq)			//禁止,等到当前正在执行的中断处理函数完毕才返回
void disable_irq_nosync(unsigned int irq)	//禁止,不等待当前正在执行的中断处理函数完毕,立即返回//使能/关闭全局中断(使能/关闭处理器整个中断系统)
local_irq_enable()
local_irq_disable()
//不同任务之间调用上述两个函数可能导致程序崩溃,以下函数可以保存中断状态并恢复
local_irq_save(flags)
local_irq_restore(flags)

2. Linux中断的上半部和下半部

目的:实现中断处理函数的快进快出。
上半部:中断处理函数。将处理较快,占用时间短的操作放到上半部。
下半部:将比较耗时的工作放到下半部执行。

上半部和下半部的划分完全看驱动开发者意愿,以下是一些参考划分依据
①如果要处理的内容不希望被其它中断打断,放到上半部。
②如果要处理的任务对时间敏感,上半部。
③如果要处理的任务与硬件有关,上半部。
④其它,下半部。

3. Linux中断的上半部和下半部处理方式

上半部处理方式:直接写中断处理函数。
下半部处理方式:软中断,tasklet,工作队列。建议使用tasklet。
1)软中断:
  linux内核使用softirq_action结构体表示软中断。软中断一共有10个,每个CPU处理自己触发的软中断,但是软中断服务函数都是相同的。
①注册软中断处理函数:

void open_softirq(int nr, void (*action)(struct softirq_action *))
/*
nr:要开启的软中断,可以去看interrupt.h中定义的NR_SOFTIRQS枚举类。
action:软中断对应处理函数。
*/

②触发软中断:

void raise_softirq(unsigned int nr

③初始化软中断:软中断必须在编译的时候静态注册。
  可以看到会默认打开tasklet和高优先级软中断。

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);
}

2)tasklet:
  linux内核使用tasklet_struct结构体表示tasklet。

struct tasklet_struct {struct tasklet_struct *next; 		/* 下一个 tasklet */unsigned long state; 				/* tasklet 状态 */atomic_t count; 					/* 计数器,记录对 tasklet 的引用数 */void (*func)(unsigned long); 		/* tasklet 执行的函数 */unsigned long data; 				/* 函数 func 的参数 */
};

①定义一个tasklet然后在驱动入口函数中初始化。

void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);
/*
t:要初始化的tasklet
func:tasklet处理函数
data:func的参数
*/
//也可以用宏定义实现一样的效果
DECLARE_TASKLET(name, func, data)

②上半部调用tasklet:

void tasklet_schedule(struct tasklet_struct *t)

3)工作队列:
  工作队列在进程上下文执行,将要推后的工作交给一个内核线程执行,工作队列允许睡眠或重新调度。Linux内核使用work_struct结构体表示一个工作,使用workqueue_struct结构体表示工作队列。
  Linux内核使用工作者线程(worker thread)处理工作队列中的各工作。用worker结构体表示工作者线程。
①实际开发中只需要自己定义work_struct也就是一个工作。然后初始化工作。

#define INIT_WORK(_work, _func)
//或者用这个宏直接创建+初始化工作
#define DECLARE_WORK(n, f)

②调度工作:

bool schedule_work(struct work_struct *work)

工作的使用方式其实和tasklet差不多。

4. 设备树中断信息节点

dtsi中的中断控制器节点:

intc: interrupt-controller@00a01000 {compatible = "arm,cortex-a7-gic";		//在内核源码中搜索即可找到GIC驱动文件#interrupt-cells = <3>;					//GIC下设备的cells有3个,分别表示中断类型,中断号,触发类型/PPI中断掩码。GPIO做中断控制器时,cells=2。interrupt-controller;					//表明这是一个中断控制器节点reg = <0x00a01000 0x1000>, <0x00a02000 0x100>;
7 };

以一个具体外设的中断配置来看,打开dts:fxls8471磁力计芯片,其中断引脚连接到IMX6ULL的SNVS_TAMPER0,这个引脚可以复用为GPIO5_IO00。所以这里可以使用gpio作为中断控制器。

fxls8471@1e {compatible = "fsl,fxls8471";reg = <0x1e>;position = <0>;interrupt-parent = <&gpio5>;		//设置gpio5为中断控制器interrupts = <0 8>;					//0表示gpio5,8表示低电平触发,只有两个,因为gpio做gic时cells=2
};

获取中断号:

//从interrupts 属性中提取对应中断号
unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
/*dev:设备节点	index:索引号,interrupts 属性可能包含多条中断信息,通过 index 指定要获取的信息。
return:中断号*///如果使用gpio,可以用以下函数获取gpio对应中断号
int gpio_to_irq(unsigned int gpio)
/*
gpio:要获取的gpio编号
return:gpio对应中断号
*/

相关文章:

嵌入式Linux驱动开发(九)Linux中断

1. Linux中断简介 1&#xff09;中断号 linux内核中使用一个int变量表示中断号。 2&#xff09;申请中断&#xff1a; 该函数可以自动激活中断&#xff0c;但是可能引起睡眠&#xff0c;所以需要小心使用。 int request_irq(unsigned int irq, //要申请中断的中断号irq_ha…...

数据库系统-并发控制

文章目录 一、为什么要并发控制1.2 并发控制解决的问题1.2.1 脏读1.2.2 幻读1.2.3 不可重复读1.2.4 数据丢失问题 二、事务调度及可串行性2.1 事务2.1.1 事务的宏观2.1.2 事务的微观2.1.3 事务的特性 ACID 2.2 事务调度与可串行性2.3 冲突可串行化判定 三、基于封锁的并发控制方…...

Java8 教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布&#xff0c;可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。 Java 8入门教程 - 从简单的步骤了解Java…...

从零开始学架构——高可用存储架构

双机架构 存储高可用方案的本质都是通过将数据复制到多个存储设备&#xff0c;通过数据冗余的方式来实现高可用&#xff0c;其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此&#xff0c;对任何一个高可用存储方案&#xff0c;我们需要从以下几个方面去进…...

连ChatGPT都不懂的五一调休,到底怎么来的?

今天是周几&#xff1f; 你上了几天班了&#xff1f; 还要上几天班放假&#xff1f; 五一啥安排&#xff1f; 出行的票抢到了吗&#xff1f; 调休到底是谁发明的&#xff1f;&#xff01; 五一劳动节是要劳动吗&#xff1f; 为什么昨天是周一&#xff0c;今天还是周一&a…...

AES工作流程

工作流程 模式 1&#xff1a;加密 ⚫ 复位EN 重置AES模块 ⚫ 设置模式寄存器mode[1:0]00&#xff0c;设置流数据处理模式寄存器CHMOD[1:0] ⚫ 写AES_KEYRx寄存器&#xff0c;CTR和CBC模式下写AES_IVRx寄存器 ⚫ 写EN1&#xff0c;使能AES ⚫ 写AES_DINR 寄存器4次 ⚫ 等待CCF标…...

C++11

C11 统一的列表初始化 在介绍这里的列表初始化之前&#xff0c;首先我认为这是一个比较鸡肋的功能特性&#xff0c;而且使用起来会和之前C98时有些区别。 // 首先可以定义普通的内置类型的变量int x1 1;int x2 { 1 };int x3{ 1 }; // 这样看起来着实有些怪int arry1[] { 1,…...

ubuntu18.04 配置zlmediakit 支持ffmpeg转码记录

1、zlmediakt 默认不支持ffmepg转码&#xff0c;需要在根目录下的CamkeLists.txt里面option(ENABLE_FFMPEG "Enable FFmpeg" OFF) 将OFF改成ON, 删除原有的build目录&#xff0c;sudo mkdir build. cd build,cmake .. 这样在编译生成文件夹release/linux/debug/生…...

H68K配置路由功能

系统环境Armbian ubuntu系统 参考 如何使用Debian/Ubuntu等Linux做软路由&#xff08;物理机版本&#xff0c;非虚拟机容器版&#xff09; - 知乎 https://zhuanlan.zhihu.com/p/587068225 按照他操作的结果,就是只有一个网卡正常 最后一顿操作就出现了我这么个配置 更新源…...

*2.5 迭代法的收敛阶与加速收敛方法

学习目标&#xff1a; 了解迭代法的基本概念和原理。学习者需要理解迭代法的基本概念和原理&#xff0c;包括迭代过程、迭代格式、收敛性等基本概念。 熟练掌握迭代法的收敛阶和收敛速度。学习者需要了解迭代法的收敛阶和收敛速度&#xff0c;掌握如何计算迭代法的收敛阶和收敛…...

仪表板展示 | X-lab开放实验室GitHub开源项目洞察大屏

背景介绍 X-lab开放实验室是一个开源软件产业开放式创新的共同体&#xff0c;由来自国内外著名高校、创业公司、部分互联网与IT企业的专家学者与工程师所构成&#xff0c;目前已在包括开源治理标准制定、开源社区行为度量与分析、开源社区流程自动化、开源全域数据治理与洞察等…...

【c语言】五大内存区域 | 堆区详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

【JavaScript】动态表格

&#x1f38a;专栏【 前端易错合集】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; &#x1f354;介绍 就是在输入框中输入数字后&#xff0c;再按…...

Css如何优雅的实现抽奖转盘

如图&#xff0c;抽奖转盘&#xff0c;可以拆分为几部分&#xff1a; 1.底部大圆&#xff1b; 2.中间小圆&#xff1b; 3.扇形区&#xff1b; 4.扇形内部奖品区&#xff1b; 5.抽奖按钮&#xff1b; 6.点击抽奖按钮时旋转动效及逻辑&#xff1b; 这其中&#xff0c;扇形区&am…...

在Java的小问题

问题1&#xff1a;如何在Java中创建一个对象&#xff1f; 解决方法&#xff1a; 在Java中&#xff0c;要创建一个对象&#xff0c;需要以下步骤&#xff1a; 创建一个类&#xff0c;定义对象的属性和行为。在类中定义一个构造函数&#xff0c;用于初始化对象的属性。在程序中…...

HashMap的扩容机制、初始化容量大小的选择、容量为什么是2的次幂

前置知识 先来看看HashMap中的成员属性 解释&#xff1a; size当前的容器中Entry的数量&#xff0c;也就是当前K-V的数量loadFactory装载因子&#xff0c;用来衡量HashMap满的程度&#xff0c;loadFactory的默认值是0.75threshold临界值&#xff0c;当实际KV数量超过threshol…...

[jenkins自动化2]: linux自动化部署方式之流水线(下篇)

目录 1. 引言: 2. 进阶操作 流水线 -> 2.1 简介: -> 2.2 最终效果图展示: -> 2.3 有没有心动, 真的像流水线一样, 实现了一键部署启动 3. 实现方式 3.1 下载几个插件 3.2 创建流水线任务 3.3 点击配置 3.4 根据流水线语法 写一个简单的helloworld 3.5 执行…...

idea使用 ( 二 ) 创建java项目

3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…...

RabbitMq-接收消息+redis消费者重复接收

在接触RammitMQ时&#xff0c;好多文章都说在配置中设置属性 # rabbitmq 配置 rabbitmq:host: xxx.xxx.xxx.xxxport: xxxxusername: xxxpassword: xxxxxx## 生产端配置# 开启发布确认,就是confirm模式. 消费端ack应答后,才将消息从队列中删除#确认消息已发送到队列(Queue)pub…...

Orangepi Zero2 全志H616简介

为什么学 学习目标依然是Linux 系统 &#xff0c;平台是 ARM 架构 蜂巢快递柜&#xff0c;配送机器人&#xff0c;这些应用场景用C51,STM32单片机无法实现 第三方介入库的局限性&#xff0c;比如刷脸支付和公交车收费设备需要集成支付宝SDK&#xff0c;提供的libalipay.so 是…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...