linux设备驱动归纳总结(六):1.中断的实现

2023-11-16


一、什么是中断


中断分两种:

1)中断,又叫外部中断或异步中断,它的产生是由于外设向处理器发出中断请求。其中外部中断也有两种,这是由配置寄存器设定的:普通中断请求(IRQ)和快速中断请求(FIQ)。一般地,linux下很少使用快速中断请求。

2)异常,又叫内部中断或同步中断,它的产生是由于处理器执行指令出错。

在以下的内容我是要介绍由于外部设备产生的中断。


这里我还有两个名词要说清楚

1)中断请求线:在后面也叫中断号,每个中断都会通过一个唯一的数值来标识,而这个值就称做中断请求线

2)在2440芯片中,有些中断是需要共享一个中断寄存器中的一位,如EINT4——EINT7,它们是共享寄存器SRCPEND的第4位。具体可以查看芯片手册。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


二、什么是中断处理函数


在相应一个中断是,内核会执行该信号对应的一个函数,该函数就叫做该中断对应的中断处理函数。一般来说,中断的优先级是最高的,一但接收到中断,内核就会调用对应的中断处理函数。

中断处理函数运行在中断上下文中。中断上下文与内核上下文有一点区别:

内核上下文是指应用层调用系统调用陷入内核执行,内核代表陷入的进程执行操作。函数中可以通过current查看当前进程(即应用层的进程)的信息,并且可以睡眠。

中断上下文中,不能通过current查看调用它的应用层进程的信息,同时,处于中断上下文时,不能睡眠。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


一、从硬件角度看中断


中断的产生到处理器获得中断这段过程中,还要通过中断处理器来筛选信号。


先温习一下S3C2440芯片手册的知识:中断是如何产生的,中断处理器本身如何处理中断。先看一下一幅经典的图,这是介绍中断控制器的工作流程:

从硬件上的分类,有两种不同的中断类型:

1)自己占有SORCPND寄存器的一位(without sub-register)。

2)几个中断共同享用SRCPND寄存器的一位(with sub-register)。


其实两种都差不多,只是多了两步的检测。我以自己占用一位的中断来举例,EINT1,在我的开发板,EINT1上接了一个按键

1)当我按下按键产生电平变化,传到S3C2440的中断控制器上(即将要进入上面图的流程图)。

2)首先,信号要经过寄存器SRCPNDSRCPND是用来配置当前的处理器要接收什么中断,如果该寄存器配置成接收EINT1中断(对应位置一),则允许继续下一步。

3)然后,信号经过寄存器MASK,这是用来设置当前系统需要屏蔽的中断。注意,这里的屏蔽跟上一个寄存器的不接收中断是不一样的。这里的屏蔽是指,中断是接受了,但是由于某种原因,先暂时不屏蔽产生的中断。

4)通过INTPND寄存器,查看当前是否有相同的中断已经被请求(如果是,INTPND对应位置一)。

5)如果没有相同的中断在请求,中断处理器才会把这个信号传给处理器,这时处理器才会知道有EINT0的中断真正来了,要对信号进行处理了。

注:如果设定了EINT0是快速中断模式(FIQ),中断通过SRCPND寄存器后就会通过MODE寄存器的判断,确定是FIQ后,中断控制器优先将该中断传给CPU处理。

6)对应传来的中断类型(IRQFIQ),通过CPSR寄存器切换到对应的工作模式ARM有七种工作模式)。

7)切换工作模式后,进入指定的中断处理入口执行中断处理函数。

注意:第67步在linux下的实现相对复杂,不像在裸板程序,只需要切换一下工作模式,执行相应的函数就可以了。迟点会介绍linux如何实现。


来个流程图比较只在,同时来个类比,处理器是老板,中断处理器是小秘:


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

四、注册和释放中断处理函数


上面的介绍只是讲解了一个设备产生中断后要经过怎么样的步骤才能让处理器接收到中断信号。传入处理器后,接下来的工作就是由内核来实现了,那是一个复杂的机制,我们这里先不说。但是,内核提供了相关的接口给我们,我们只要通过接口告诉内核,当来了指定中断时,内核你该执行哪个中断处理函数


注册中断处理函数:

/*include <linux/interrupt.h>*/

int request_irq(unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char *devname, void *dev_id)

使用:

将中断号irq与中断处理函数handler对应

参数:

irq:指定要分配的中断号,中断号的定义在“include/mach/irqs.h”中。注意,不管是单独占有中断请求线的中断,还是共享中断请求线的每个中断,都有一个对应的中断号。,所以,调用该函数不需要考虑是哪种中断(是否共享寄存器),你想哪种中断响应,你就填对应的中断号。

handler:中断处理函数指针。

irqflags:中断处理标记,待会介绍:

devname:该字符串将显示在/proc/irq/pro/interrupt中。

dev_idID 号,待会会介绍。

返回值:成功返回0,失败返回非0

注册函数需要注意两件事:

1)该函数会睡眠。

2)必须判断返回值。


中断处理标志irqflags,这里先介绍几个待会要用的:

/*linux-2.6.29/include/linux/interrupt.h*/

29 #define IRQF_TRIGGER_NONE 0x00000000

30 #define IRQF_TRIGGER_RISING 0x00000001 //上升沿触发中断

31 #define IRQF_TRIGGER_FALLING 0x00000002 //下降沿触发中断

32 #define IRQF_TRIGGER_HIGH 0x00000004 //高电平触发中断

33 #define IRQF_TRIGGER_LOW 0x00000008 //低电平触发中断

34 #define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \

35 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)

36 #define IRQF_TRIGGER_PROBE 0x00000010


释放中断处理函数:

void free_irq(unsigned int irq, void *dev_id)


编写中断处理函数:

中断处理函数声明如下:

static irqreturn_t intr_handler(int irq, void *dev_id)

先看第一个参数irq,这是调用中断处理函数时传给它的中断号,对于新版本的内核,这个参数已经用处不大,一般只用于打印。

第二个参数dev_id,这个参数与request_irq()的参数dev_id一致,由于待会的程序我并不需要用这个参数,所以先不介绍。

再看返回值,中断处理函数的返回值有三个:

/*linux-2.6.29/include/linux/interrupt..h*/

21 #define IRQ_NONE (0) //如果产生的中断并不会执行该中断处理函数时返回该值

22 #define IRQ_HANDLED (1) //中断处理函数正确调用会返回

23 #define IRQ_RETVAL(x) ((x) != 0) //指定返回的数值,如果非0,返回IRQ_HADLER,否则

26 #ifndef IRQ_NONE //返回IRQ_NONE


接下来就要写函数了,在我的开发板中,有一个按键是对应EINT1,我要实现的操作是,当我按下按键,终端打印”key down”。在这个程序中,我并没有使用dev_id。这将在会以后的章节介绍。

/*6th_irq_1/1st/test.c*/

1 #include <linux/module.h>

2 #include <linux/init.h>

3

4 #include <linux/interrupt.h>

5

。。。省略。。。

13 irqreturn_t irq_handler(int irqno, void *dev_id) //中断处理函数

14 {

15 printk("key down\n");

16 return IRQ_HANDLED;

17 }

18

19 static int __init test_init(void) //模块初始化函数

20 {

21 int ret;

22

23 /*注册中断处理函数,必须查看返回值

24 * IRQ_EINT1:中断号,定义在"include/mach/irqs.h"

25 * irq_handler:中断处理函数

26 * IRQ_TIRGGER_FALLING:中断类型标记,下降沿触发中断

27 * ker_INT_EINT1:中断的名字,显示在/proc/interrupts等文件中

28 * NULL;现在我不使用dev_id,所以这里不传参数

29 */

30 ret = request_irq(IRQ_EINT1, irq_handler, IRQF_TRIGGER_FALLING,

31 "key INT_EINT1", NULL);

32 if(ret){

33 P_DEBUG("request irq failed!\n");

34 return -1;

35 }

36 printk("hello irq\n");

37 return 0;

38 }

39

40 static void __exit test_exit(void) //模块卸载函数

41 {

42 free_irq(IRQ_EINT1, NULL);

43 printk("good bye irq\n");

44 }

45

46 module_init(test_init);

47 module_exit(test_exit);

48

49 MODULE_LICENSE("GPL");

50 MODULE_AUTHOR("xoao bai");

51 MODULE_VERSION("v0.1");

接下来验证一下:

[root: 1st]# insmod test.ko

hello irq

[root: 1st]# key down //按下按键显示

key down

key down

key down

[root: 1st]# cat /proc/interrupts

CPU0

17: 11 s3c-ext0 key INT_EINT1 显示我注册和中断名字

30: 423482 s3c S3C2410 Timer Tick

32: 0 s3c s3c2410-lcd

51: 2782 s3c-ext eth0

70: 49 s3c-uart0 s3c2440-uart

71: 69 s3c-uart0 s3c2440-uart

79: 0 s3c-adc s3c2410_action

80: 0 s3c-adc adc, s3c2410_action

83: 0 - s3c2410-wdt

Err: 0

[root: key INT_EINT1]# rmmod test //卸载

good bye irq

[root: key INT_EINT1]# cat /proc/interrupts //卸载后,我的中断名字消失了

CPU0

30: 828977 s3c S3C2410 Timer Tick

32: 0 s3c s3c2410-lcd

51: 3202 s3c-ext eth0

70: 192 s3c-uart0 s3c2440-uart

71: 277 s3c-uart0 s3c2440-uart

79: 0 s3c-adc s3c2410_action

80: 0 s3c-adc adc, s3c2410_action

83: 0 - s3c2410-wdt

Err: 0



xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


五、proc/interrupt


接下来,稍稍介绍一下proc/interrupt

[root: 1st]# cat /proc/interrupts

CPU0

17: 11 s3c-ext0 key INT_EINT1 显示我注册和中断名字

首先,第一列是中断号,之前的程序应该有人会有疑问:

中断号在哪里找的?

S3C2440中,这些中断号定义在文件"include/mach/irqs.h"中,在这里,可以找到对应的中断:

25 /* main cpu interrupts */

26 #define IRQ_EINT0 S3C2410_IRQ(0) /* 16 */

27 #define IRQ_EINT1 S3C2410_IRQ(1)

28 #define IRQ_EINT2 S3C2410_IRQ(2)

29 #define IRQ_EINT3 S3C2410_IRQ(3)

30 #define IRQ_EINT4t7 S3C2410_IRQ(4) /* 20 */

在这里我标了两处红笔:

第一处:可以看到,S3C2440所有的中断号在原来的基值上加了16构成中断号,但不同的芯片或许有不同的定义方法。

第二处:有些中断号是共享的。在S3C2440中,EINT4---EINT7是共享寄存器SRCPND中的一位,所以,linux系统给这样的中断分配了一个共享的中断号。那就是说,如果你使用IRQ_EINT4t7当收到这些中断时,都会调用对应的中断处理函数。这就需要在中断处理函数中通过第一个传参irq来辨别中断并执行相应的操作。如:

13 irqreturn_t irq_handler(int irqno, void *dev_id) //中断处理函数

14 {

15 switch(irqno){

16 。。。。}

17 }


那肯定有人会说,这太麻烦了吧,有没有更好的办法处理共享中断号

那当然是有,继续看文件"include/mach/irqs.h"

61 /* interrupts generated from the external interrupts sources */

62 #define IRQ_EINT4 S3C2410_IRQ(32) /* 48 */

63 #define IRQ_EINT5 S3C2410_IRQ(33)

64 #define IRQ_EINT6 S3C2410_IRQ(34)

65 #define IRQ_EINT7 S3C2410_IRQ(35)

66 #define IRQ_EINT8 S3C2410_IRQ(36)

看到了吧?内核把共享的中断分离出来,只要使用这些标记就可以了。

其实上面我只是想说明:无论在硬件上ARM是怎么实现中断的(是否共享),在内核看来所有的中断都是一样的,都可以独自获得一个中断号。


第二列“11”是对应处理器响应该中断的次数。

第三列“s3c-ext0是处理这个中断的中断控制器

第四列一看就知道调用irq_request()时定义的中断名字。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


六、总结


其实要实现中断,大部分的工作已经给内核包了,我们只需要做的就是告诉内核,当来了什么中断要执行怎么样的函数,这也是今天介绍的重点,其实步骤很简单:

1)调用两个函数:requesr_irqfree_irq

2)实现中断处理函数:irq_handler()


还有没讲的知识:

1)还有几个irqflag没介绍。

2)没有介绍dev_id

可能有人会加载上面的模块失败,这也是我今天没介绍的只是,共享中断号。这里说的共享和硬件的共享不一样性质,下节会介绍。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux设备驱动归纳总结(六):1.中断的实现 的相关文章

  • 远程工作高效方法(几年前帖子,私密变公开后时间就变了)

    1 要和居住环境分开 我在阳台上办公 2 制订计划 每天写到纸上 贴在墙上 3 时间调整 以前上班时 有公司上班时间 先在要调整 比如 上午九点才开始工作 在家可以7点起床 困了再睡 4 每小时是工作内容 学习内容50分钟 视频教程1个或者
  • ubuntu中使用QT同时编译pcl和opencv出现error: field ‘pa ram_k_’ has incomplete type ‘flann::SearchParams’

    问题描述 ubuntu中使用QT同时编译opencv和pcl时出现如下错误 错误原因 pcl和opencv中均包含flann库产生冲突 解决办法 将flann目前更换为flann2或者其它名字 在更改目录后 其它关联引用文件也需要更改 涉及
  • kali apt update问题

    这两天使用卡里进行升级sudo apt update 错误无法升级 sudo apt update Get 1 http mirrors neusoft edu cn kali kali rolling InRelease 30 6 kB
  • 算法笔记-DTW动态时间规整

    算法笔记 DTW动态时间规整 简介 简单的例子 定义 讨论 约束条件 步模式 标准化 点与点的距离函数 具体应用场景 分类 点到点匹配 算法笔记 DTW动态时间规整 动态时间规整 规划 Dynamic Time Warping DTW 是一
  • 戴尔如何加装固态硬盘

    这是手册中有关固态硬盘的支持规格 您可以按照这个参数进行选购 G15 5511 支持两个 M 2 2230 2280 固态硬盘 M 2 2230 固态硬盘 PCIe 3 0 x4 NVMe 高达 1 TB M 2 2280 固态硬盘 PCI
  • 2023版软件测试学习路线图(超详细自学路线)

    送福利了 超详细的软件测试学习路线图来啦 2023版是首发哟 软件测试学习路线图分为9个阶段 包含 软件测试环境配置和管理 gt 软件测试数据管理与数据库测试 gt web前端测试技术 gt 通用软件测试技术 gt Python测试开发技术
  • python openpyxl 操作excel 插入行,列

    import openpyxl wb openpyxl load workbook D 村数据 实验 xlsx ws wb Sheet1 ws insert rows 3 插入行 ws insert cols 4 插入列 wb save D
  • JAVA【基础】 IDEA导入jar包的几种方式

    目录 获取想要添加的依赖 或者jar包 maven添加依赖 手动导入jar包 最后测试一下 是否添加成功 下面多图预警 获取想要添加的依赖 或者jar包 添加依赖 或者下载jar包 都可以去maven网站下载 进入 Maven仓库 http
  • 获取windows凭证管理器明文密码

    1 运行cmdkey list查看windows保存凭证 方法1 mimikaz mimikatz vault cred 2 利用powershell尝试获取 windows 普通凭据类型中的明文密码 powershell import F
  • IPv6基础

    IPv6 1 优势 无限 地址空间 地址长度为128 bit 海量的地址空间 满足物联网等新兴业务 有利于业务演进及扩展 层次化的地址结构 相较于IPv4地址 IPv6地址的分配更加规范 利于路由聚合 缩减IPv6路由表规模 路由快速查询
  • 数的划分(递归)

    整数划分是另外的问题 题目描述 Description 将整数n分成k份 且每份不能为空 任意两种划分方案不能相同 不考虑顺序 例如 n 7 k 3 下面三种划分方案被认为是相同的 7 1 1 5 7 1 5 1 7 5 1 1 问有多少种
  • 7z怎么解压linux,7z 常用解压命令

    用命令行来执行7z的极限压缩 就是如下的命令 C 01 MyApp 7 Zip 7z exe a t7z newPack 7z F 14 newWork 7z testDoc r mx 9 m0 LZMA2 ms 10m mf on mhc
  • cmd简单游戏代码_python简单游戏应用——剪刀石头布!

    我们的基础中的基础 在前几文中已经介绍完了 其他的知识用什么学什么就对了 接下来我们做款小游戏 纵观全文 先引入了一个函数 random 随机数 单用random 这个函数 会产生一个随机的实数 范围在 0 1 若是要从自定的范围取出一个
  • 在flask框架中,设置执行完视图函数后自动将数据提交回数据库

    设置执行完视图函数后自动提交操作回数据库 app config SQLALCHEMY COMMIT ON TEARDOWN True
  • pytorch GPU版本安装

    使用驱动精灵安装 参考 pytorch GPU版本安装 尘世猫的博客 CSDN博客 pytorchgpu版本 安装cuda 高版本的cuda是可以兼容低版本的cuda的 比如我的电脑支持cuda11 0 我就可以安装cuda10 0 cud
  • 汽车OBD初级开发入门

    汽车OBD初级开发入门 我所认识的OBD 从何开始学习OBD stm32的CAN总线 OBD的标准协议 我所认识的OBD 直观的从名称上来说是英文On Board Diagnostics的缩写 中文翻译为 车载诊断系统 书面上的解释就是处理
  • 太强了!100个Python算法实例.pdf

    常言道 算法才是编程的灵魂 不管是java python还是PHP 都跨不过算法这个门槛 算法确实不好学 但算法也是真必要 各大公司为了筛选人才 面试程序员的时候多多少少都会考察你的算法能力 学习算法无非这几种目的 学习基本编程语法和思想
  • Python VTK numpy数据3D可视化

    在Python的3D图像处理中 通常用numpy array来进行非常方便的计算或者转化 这里记录一下numpy数据的VTK可视化基本流程 包括面绘制 Surfase Rendering 和体绘制 Volume Rendering 除去数据

随机推荐

  • 全局变量、静态全局变量、静态局部变量和普通局部变量的区别

    按存储区域分 全局变量 静态全局变量和静态局部变量都存放在内存的全局数据区 局部变量存放在内存的栈区 按作用域分 1 全局变量在整个工程文件内都有效 2 静态全局变量只在定义它的文件内有效 3 静态局部变量只在定义它的函数内有效 且程序仅分
  • 【FAQ】API6低代码开发问题汇总

    参考文档 低代码开发参考文档 文档中心 使用低代码进行开发 基于景区模板开发元服务 文档中心 模板简介 使用API6低代码开发遇到的问题汇总情况如下 1 低代码环境下 如何实现box shadow阴影效果的配置 答 低码目前不支持box s
  • 蓝牙之十七-bluedroid scan流程

    蓝牙扫描过程是指扫描蓝牙设备 app层 这里有两张截图 第一张图显示的是安卓设置setting菜单栏中有Bluetooth这一项 点进去以后 点击右上角显示如下的截图 其中Refresh就是刷新设备列表 也就会扫描设备信息 上图显示的三个菜
  • Gated Mechanism for Attention Based Multi Modal Sentiment Analysis 阅读笔记

    GATED MECHANISM FOR ATTENTION BASED MULTIMODAL SENTIMENT ANALYSIS 阅读笔记 最近在跟进多模态的情感分析发现多模态榜一又被刷下来了 这篇论文是当前时间内的最好的效果 下面就对论
  • linux服务器补丁怎么修复,linux 服务器打补丁

    linux 服务器打补丁 内容精选 换一换 MindStudio和Ascend cann toolkit开发套件包可以安装在Linux服务器上 可以使用Linux服务器上原生桌面自带的终端gnome terminal进行安装 也可以在Win
  • Python数据挖掘-机器学习

    目录 零 概念 算法 开发流程 一 机器学习概述 1 数据集 1 sklearn自带数据集应用 2 数据集划分 二 特征工程 1 特征抽取 1 字典特征提取 sklearn feature extraction DictVectorizer
  • windows下修改mysql时区设置

    root身份登录MySQL mysql u root p 查看time zone变量 show variables like time zone 显示 time zone 变量 设置time zone变量 set time zone 08
  • dobbo源码解析目录地址

    肥朝 Dubbo 源码解析 作者 肥朝 博客 http www jianshu com u f7daa458b874 目录 Dubbo 源码解析 集群容错架构设计 Dubbo 源码解析 Directory Dubbo 源码解析 Router
  • 模糊匹配之——BK树与拼写纠正

    介绍 拼写纠错功能常常出现在比较高级的文本编辑应用中 例如大家熟知的word 高级一点的IDE例如Jet Brains系列 在一些在线翻译上 也有自动校正拼写的功能 例如谷歌翻译 原理 拼写纠正的实现方式有多种 这里使用的是一种名为BK树的
  • 【Java项目推荐】值得写到简历上的项目--黑马点评

    优惠卷秒杀 前言 优惠券秒杀 实现优惠券秒杀下单 超卖问题 一人一单 分布式锁 redis中加锁的一些特殊情况 手动实现分布式锁 分布式锁误删情况1 分布式锁误删情况2 lua脚本解决多条命令的原子性问题 Redisson 秒杀优化 异步秒
  • Mac使用Python接入东方财富量化接口Choice,调试与获取数据

    这篇博客用来把在Mac平台上使用python接入东方财富Choice接口的流程细化并重写 官方文档有些地方说的太含糊了 有的地方博主尝试了多种方法才试出来 这里直接把标准答案给到大家 尽量避坑吧 吐槽 同花顺科技感很足 赞 但是没有Mac版
  • 什么是虚拟键码、虚拟密钥码、扫描码

    虚拟键码 虚拟密钥码 扫描码
  • spring_boot-启动错误笔记

    2018 07 15 17 15 42 443 INFO 10892 restartedMain s b a e w s WebMvcEndpointHandlerMapping Mapped actuator health methods
  • ElementUI tabs标签页样式改造美化

    今天针对ElementUI的Tabs标签页进行了样式修改 更改为如下图所属的样子 在线运行地址 JSRUN项目 ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用 下面我也简单的贴上代码 代码没有注释 很抱歉 时间比
  • python的运行方式有哪两种 有何区别_python程序的两种运行方式是什么

    python程序的两种运行方式是什么 第一种方式 REPL 所谓REPL即read eva print loop 读取 计算 打印 循环 实现REPL运行方式有以下两种 1 IDLE 集成开发环境或集成开发和学习环境 是Python的集成开
  • 在ESXi安装ubuntu中,ubuntu20.04是LVM管理的,lvm盘只有识别100G ,需扩展逻辑卷来使用更多的空间

    sudo fdisk l Device Start End Sectors Size Type dev sda1 2048 4095 2048 1M BIOS boot dev sda2 4096 4198399 4194304 2G Li
  • SpringCloud中Hystrix中熔断器的简单配置和调用

    SpringCloud中Hystrix组件 用于在云环境中远程调用方法失败后的处理机制 它通过配置一个处理类实现接口重写其方法提供调用失败后的紧急处理 是一个非常好用的组件 1 首先在没有配置熔断器之前启动项目访问 只启动了一个模块 注册中
  • docker dbus-x11

    本来想用terminator启动nvidia docker 显示出图形界面的 结果发现启动的时候出问题了 terminator 1 dbind WARNING 07 31 53 725 Couldn t connect to accessi
  • Java接口登录实现页面跳转

    方式一 在Java中 可以通过使用接口和实现类来实现页面跳转功能 以下是一个简单的示例代码 首先 创建一个接口 例如LoginService public interface LoginService void login String u
  • linux设备驱动归纳总结(六):1.中断的实现

    一 什么是中断 中断分两种 1 中断 又叫外部中断或异步中断 它的产生是由于外设向处理器发出中断请求 其中外部中断也有两种 这是由配置寄存器设定的 普通中断请求 IRQ 和快速中断请求 FIQ 一般地 linux下很少使用快速中断请求 2