嵌入式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)中断号 linux内核中使用一个int变量表示中断号。 2)申请中断: 该函数可以自动激活中断,但是可能引起睡眠,所以需要小心使用。 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月发布,可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。 Java 8入门教程 - 从简单的步骤了解Java…...
从零开始学架构——高可用存储架构
双机架构 存储高可用方案的本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用,其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此,对任何一个高可用存储方案,我们需要从以下几个方面去进…...
连ChatGPT都不懂的五一调休,到底怎么来的?
今天是周几? 你上了几天班了? 还要上几天班放假? 五一啥安排? 出行的票抢到了吗? 调休到底是谁发明的?! 五一劳动节是要劳动吗? 为什么昨天是周一,今天还是周一&a…...
AES工作流程
工作流程 模式 1:加密 ⚫ 复位EN 重置AES模块 ⚫ 设置模式寄存器mode[1:0]00,设置流数据处理模式寄存器CHMOD[1:0] ⚫ 写AES_KEYRx寄存器,CTR和CBC模式下写AES_IVRx寄存器 ⚫ 写EN1,使能AES ⚫ 写AES_DINR 寄存器4次 ⚫ 等待CCF标…...
C++11
C11 统一的列表初始化 在介绍这里的列表初始化之前,首先我认为这是一个比较鸡肋的功能特性,而且使用起来会和之前C98时有些区别。 // 首先可以定义普通的内置类型的变量int x1 1;int x2 { 1 };int x3{ 1 }; // 这样看起来着实有些怪int arry1[] { 1,…...
ubuntu18.04 配置zlmediakit 支持ffmpeg转码记录
1、zlmediakt 默认不支持ffmepg转码,需要在根目录下的CamkeLists.txt里面option(ENABLE_FFMPEG "Enable FFmpeg" OFF) 将OFF改成ON, 删除原有的build目录,sudo mkdir build. cd build,cmake .. 这样在编译生成文件夹release/linux/debug/生…...
H68K配置路由功能
系统环境Armbian ubuntu系统 参考 如何使用Debian/Ubuntu等Linux做软路由(物理机版本,非虚拟机容器版) - 知乎 https://zhuanlan.zhihu.com/p/587068225 按照他操作的结果,就是只有一个网卡正常 最后一顿操作就出现了我这么个配置 更新源…...
*2.5 迭代法的收敛阶与加速收敛方法
学习目标: 了解迭代法的基本概念和原理。学习者需要理解迭代法的基本概念和原理,包括迭代过程、迭代格式、收敛性等基本概念。 熟练掌握迭代法的收敛阶和收敛速度。学习者需要了解迭代法的收敛阶和收敛速度,掌握如何计算迭代法的收敛阶和收敛…...
仪表板展示 | X-lab开放实验室GitHub开源项目洞察大屏
背景介绍 X-lab开放实验室是一个开源软件产业开放式创新的共同体,由来自国内外著名高校、创业公司、部分互联网与IT企业的专家学者与工程师所构成,目前已在包括开源治理标准制定、开源社区行为度量与分析、开源社区流程自动化、开源全域数据治理与洞察等…...
【c语言】五大内存区域 | 堆区详解
创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...
【JavaScript】动态表格
🎊专栏【 前端易错合集】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 🍔介绍 就是在输入框中输入数字后,再按…...
Css如何优雅的实现抽奖转盘
如图,抽奖转盘,可以拆分为几部分: 1.底部大圆; 2.中间小圆; 3.扇形区; 4.扇形内部奖品区; 5.抽奖按钮; 6.点击抽奖按钮时旋转动效及逻辑; 这其中,扇形区&am…...
在Java的小问题
问题1:如何在Java中创建一个对象? 解决方法: 在Java中,要创建一个对象,需要以下步骤: 创建一个类,定义对象的属性和行为。在类中定义一个构造函数,用于初始化对象的属性。在程序中…...
HashMap的扩容机制、初始化容量大小的选择、容量为什么是2的次幂
前置知识 先来看看HashMap中的成员属性 解释: size当前的容器中Entry的数量,也就是当前K-V的数量loadFactory装载因子,用来衡量HashMap满的程度,loadFactory的默认值是0.75threshold临界值,当实际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时,好多文章都说在配置中设置属性 # rabbitmq 配置 rabbitmq:host: xxx.xxx.xxx.xxxport: xxxxusername: xxxpassword: xxxxxx## 生产端配置# 开启发布确认,就是confirm模式. 消费端ack应答后,才将消息从队列中删除#确认消息已发送到队列(Queue)pub…...
Orangepi Zero2 全志H616简介
为什么学 学习目标依然是Linux 系统 ,平台是 ARM 架构 蜂巢快递柜,配送机器人,这些应用场景用C51,STM32单片机无法实现 第三方介入库的局限性,比如刷脸支付和公交车收费设备需要集成支付宝SDK,提供的libalipay.so 是…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
