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

Linux设备驱动开发-中断

中断的核心是保存现场,处理现场,恢复现场

流程:

1.设置中断源

2.设置中断控制器(屏蔽,优先级)

3.设置 cpu 总开关(使能中断)

4.产生中断

5.cpu 每执行完一条指令都会检查是否有中断/异常产生

6.发现中断/异常产生,跳到相应地址(跳转指令)执行处理

7.跳转执行其他函数(保存现场,处理,恢复现场)

规则:

1.中断不能嵌套(可能出现栈溢出)

2.中断的处理要快

3.网卡这样耗时的中断可以分成上半部和下半部(使用内核线程处理,下半部可以被其他中断打断)

4.硬件中断处理完后会顺带处理软件中断

5.上半部和下半部执行次数是 n 比 1 的关系

6.内核通过 GIC 区分不同的中断

中断类型:

1.PPI:私有中断,只能到达指定中断处理器

2.SPI:共享中断,可以到达多个中断处理器

3.SGI:cpu 核之间的中断通信

使用方法:

在设备树声明中断,中断会发到父亲中断控制器

interrupt-controller;//表示自己是中断控制器
#interrupt-cell = <3>//用多少位表示中断
interrupt-parent = <&test>//父亲中断控制器
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;//中断类型 中断号 触发类型

触发类型:1 表示上升沿触发 ,2 表示下降沿触发,3 表示高电平触发,4 表示低电平触发,多种触发按位或即可

设备树匹配后,在 probe 函数中使用platform_get_resource 可以获得中断资源,i2c 和 spi 驱动也是在 probe 函数中取出中断信息,调用的函数稍有不同,中断信息会保存在 i2c_client 和 spi_device 结构体中

对于 gpio 还可以手动使用 gpio_to_irq 或 gpiod_to_irq 去解析设备树获得中断号

/ drivers / base / platform.c

struct resource *platform_get_resource(struct platform_device *dev,
				       unsigned int type, unsigned int num)
{
	u32 i;

	for (i = 0; i < dev->num_resources; i++) {
		struct resource *r = &dev->resource[i];

		if (type == resource_type(r) && num-- == 0)
			return r;
	}
	return NULL;
}
EXPORT_SYMBOL_GPL(platform_get_resource);

在获得中断号之后就可以去注册中断处理函数了

/ include / linux / interrupt.h

static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
	    const char *name, void *dev)
{
	return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}

可以直接调用request_threaded_irq,在第三个参数传入一个线程回调(下半部)就可以让内核帮我们创建一个线程去执行下半部处理

相关文章:

  • 特殊回文数的因子
  • 22、《Spring Boot消息队列:RabbitMQ延迟队列与死信队列深度解析》
  • SpringBoot约定大于配置
  • 【AIGC系列】1:自编码器(AutoEncoder, AE)
  • Win10登录Samba服务器报用户名密码错误问题解决
  • 测试工程师玩转DeepSeek之Prompt
  • ubuntu22.04的docker容器中安装ssh服务
  • 机器学习数学基础:32.斯皮尔曼等级相关
  • 机器学习数学基础:36.φ相关系数分析
  • iOS指纹归因详解
  • C++ Primer 额外的string操作
  • MySQL入门:高频操作命令大全
  • Java 实现快速排序算法:一条快速通道,分而治之
  • 超详细介绍map(multimap)的使用
  • JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
  • 【原创】Windows11安装WSL“无法解析服务器的名称或地址”问题解决方法
  • rust 前端npm依赖工具rsup升级日志
  • 独立开发者之Google Analytics使用教程
  • 文字语音相互转换
  • 玩机日记 11 解决fnOS识别不了虚拟核显的问题
  • 夜读丨什么样的前程值得把春天错过
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯今日执行死刑
  • 小米汽车机盖门陷谈判僵局,车主代表称小米表示“退订会造成崩塌”
  • 辽宁盘山县一乡镇幼儿园四名老师被指多次殴打一女童,均被行拘
  • 一图看懂|印巴交火后,双方基地受损多少?
  • 1至4月全国铁路发送旅客14.6亿人次,创同期历史新高