Linux内核中断

Linux内核中断

ARM里当按下按键的时候,他首先会执行汇编文件start.s里面的异常向量表里面的irq,在irq里面进行一些操作

再跳转到C的do_irq();

进行操作:1)判断中断的序号;2)处理中断;3)清除中断;

Linux内核实现和ARM裸机实现中断的原理是一样的。

内核:当按键按下后依然到异常向量表,再到handler_irq函数(写死的),在handler_irq里面定义了一个数组,数组中每个成员里面存放的是结构体,在结构体里面有个函数指针,这个函数指针就指向了咱们自己提交函数的名字;(数组的下标是Linux内核的软中断号,它和硬件中断号之间有个映射关系)。内核实现中断时,在handler_irq函数里面把中断的寄存器都初始化好了,咱们只需要拿到软中断号,绑定我的中断处理函数就可以

1、注册中断

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
功能:注册中断  
参数:@irq : 软中断号 gpio的软中断号@handler: 中断的处理函数@flags :中断的触发方式@name :名字   cat /proc/interrupts@dev  :向中断处理函数中传递参数 ,不想传就写为NULL
返回值:成功0,失败返回错误码

参数1:@irq : 软中断号 gpio的软中断号

//0-159 -> 160    GPIOB15 - >1*32+15   GPIOC7 -2*32+7

   软中断号 = gpio_to_irq(gpino号);//160--》 0-159

gpiono = m*32+n(n:组内的序号)

m:那一组  A B C D E(5组)

  0 1 2 3 4

例: gpioa28 = 0*32+28   gpiob8 =1*32+8   gpiob16 = 1*32+16

控制器中断号(ADC):

find -name irqs.h(在内核源码中找)

find -name irqs.h (位置路径./arch/arm/mach-s5p6818/include/mach/irqs.h)

find -name s5p6818_irq.h (位置路径./arch/arm/mach-s5p6818/include/mach/s5p6818_irq.h)

#define IRQ_PHY_ADC   (41 + 32)  //IRQ_PHY_ADC软中断号

参数2:@handler: 中断的处理函数

irqreturn_t (*irq_handler_t)(int irqno, void *dev);

IRQ_NONE        //中断没有处理完成

IRQ_HANDLED     //中断正常处理完成

参数3:@flags :中断的触发方式

#define IRQF_DISABLED 0x00000020 

//快速中断(在处理函数里面写了他,就先处理这个中断)

#define IRQF_SHARED 0x00000080    

//共享中断中断的接口较少,但是器件都想要中断,那管脚需要外接两个寄存器里面有中断状态标志位,看中断状态标志位有没有置位一个口不可以链接两个按键,按键没办法区分

#define IRQF_TRIGGER_RISING 0x00000001上升沿触发

#define IRQF_TRIGGER_FALLING 0x00000002下降沿出发

#define IRQF_TRIGGER_HIGH 0x00000004(高电平触发)

#define IRQF_TRIGGER_LOW 0x00000008 (低电平触发)

参数4:@name :名字   cat /proc/interrupts

参数5:@dev :向中断处理函数中传递参数 ,不想传就写为NULL

2、注销中断

void free_irq(unsigned int irq, void *dev_id)
	功能:注销中断
	参数:@irq :软中断号@dev_id:向中断处理函数中传递的参数,不想传就写为NULL    

Eg:按键所对应的中断号是多少?及找所对应的GPIO

第一步:找底板原理图,找到按键

第二步:拷贝网络标号,到核心板

及对应的软中断号为:gpio_to_irq gpiob8 = 1*32+8);

gpio_to_irq gpiob16 = 1*32+16

ARRAY_SIZE计算数组里面元素的个数;

中断号占用问题

[root@farsight]#insmod farsight_irq.ko 

[ 21.262000] request irq146 error

insmod: can't insert 'farsight_irq.ko': Device or resource busy

通过 cat /proc/interrupts

146:        GPIO  nxp-keypad

154:        GPIO  nxp-keypad

说明中断号已经被占用了

解决办法:在内核中将这个驱动删掉

1、如何确定驱动文件的名字是谁?

1)grep "nxp-keypad" * -nR

arch/arm/mach-s5p6818/include/mach/devices.h:48:

#define DEV_NAME_KEYPAD  "nxp-keypad"

2)grep "DEV_NAME_KEYPAD" * -nR

drivers/input/keyboard/nxp_io_key.c:324:.name = DEV_NAME_KEYPAD,

3)驱动文件的名字是nxp_io_key.c

4)找宏的名字,在Makefine里面知道;

2、如何从内核中将他去掉?

选项菜单的名字?Kconfig

config KEYBOARD_NXP_KEY

tristate "SLsiAP push Keypad support"

5)make menuconfig

<>SLsiAP push Keypad support

去掉图形化界面里面的*号后,可以把nxp_io_key.o删除掉,这样再次编译内核的时候就可以看出来nxp_io_key.c是否备编译,如果被编译就有对应的.o生成,如果不被编译,就不会生成nxp_io_key.o文件。

6)rm nxp_io_key.o

3、make uImage  重新编译内核

7)make uImage

8)cp  arch/arm/boot/uImage ~/tftpboot

4、重新启动板子;
5、安装驱动:

6、然后按键,进行测试;

按键蜂鸣器驱动函数练习

驱动:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>#define GPIONO(m,n) (m*32+n)
#define GPIO_NOB8 GPIONO(1,8)
#define GPIO_NOB16 GPIONO(1,16)
#define NAME "chrdev_dev"//定义宏保存物理地址基地址
#define BUZZER_BASE 0xc001c000
int gpiono[]={GPIO_NOB8,GPIO_NOB16};
char *name[]={"interrupt_b8","interrupt_b16"};
int i;//定义指针保存映射后的虚拟地址首地址
unsigned int *buz_addr = NULL;
//open  read  write  close
//中断处理函数
irqreturn_t irq_handler(int irq,void *arg)
{if(irq == gpio_to_irq(GPIO_NOB8)){*buz_addr |= (1 << 14);       //喇叭关闭printk(KERN_ALERT"+++++++++++++++++++++++++++++++++++\n");//设置为大于终端打印权限,不然只能在demsg中查看}if(irq == gpio_to_irq(GPIO_NOB16)){*buz_addr &= (~(1 << 14));       //喇叭关闭printk(KERN_ALERT"-----------------------------------\n");}return IRQ_HANDLED;
}
static int __init interrupt_init(void)
{//建立虚拟地址和物理地址之间的映射关系-控制喇叭
    buz_addr = (unsigned int *)ioremap(BUZZER_BASE, 40);if (buz_addr == NULL){printk("ioremap red err.\n");return -EINVAL;}//初始化喇叭*(buz_addr + 8) &= (~(3 << 28)); //选择GPIOc14功能*(buz_addr + 8) |= (1 << 28);    //选择GPIOc14功能*(buz_addr + 1) |= (1 << 14);    //选择输出使能*buz_addr &= (~(1 << 14));       //喇叭关闭//注册中断for(i=0;i<sizeof(gpiono)/sizeof(int);i++){if(request_irq(gpio_to_irq(gpiono[i]),irq_handler,IRQF_TRIGGER_FALLING,name[i],NULL)!=0){printk("%s request_ire err.\n",name[i]);return -EINVAL;}}return 0;
}static void __exit interrupt_exit(void)
{//注销中断for(i=0;i<sizeof(gpiono)/sizeof(int);i++){free_irq(gpio_to_irq(gpiono[i]),NULL);}//取消映射iounmap(buz_addr);// //注销字符设备驱动// unregister_chrdev(major, NAME);
}
module_init(interrupt_init);
module_exit(interrupt_exit);
MODULE_LICENSE("GPL");

功能实现:按键控制蜂鸣器工作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/230651.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根本记不住MySQL进阶查询语句

1 MySQL进阶查询 1.1 MySQL进阶查询的语句 全文以数据库location和Store_Info为实例 ---- SELECT ----显示表格中一个或数个字段的所有数据记录 语法&#xff1a;SELECT "字段" FROM "表名"; select 列名 from 表名 ; ---- DISTINCT ----不显示重复的数…

UntiyShader(五)属性、内置文件和变量

目录 一、如何使用属性 例子 ShaderLab中的属性的类型和Cg中的变量的类型之间的匹配关系 二、Unity提供的内置文件和变量 内置的包含文件 内置的变量 一、如何使用属性 在一开始我们提到过&#xff0c;材质和UnityShader之间有着密切的练习&#xff0c;我们可以通过材质面…

HTML5是什么?与HTML有什么区别?

HTML5 简介 HTML5&#xff08;Hypertext Markup Language, version 5&#xff09;是用于构建和呈现Web内容的最新版本的HTML标准。HTML是一种标记语言&#xff0c;用于描述和定义Web页面的结构和内容。HTML5引入了一系列新的语法、API和特性&#xff0c;旨在增强Web应用的功能…

利用蚁剑钓鱼上线CS

前言 ​ 中国蚁剑使用Electron构建客户端软件&#xff0c;Electron实现上用的是Node.js&#xff0c;并且Node.js能执行系统命令&#xff0c;故可以利用蚁剑的webshell页面嵌入js来直接执行命令&#xff0c;进而钓鱼来上线CS。&#xff08;类似Goby&#xff0c;Goby也是使用Ele…

seo分享:慎重使用蜘蛛池

其实要提高搜索引擎蜘蛛的来访次数&#xff0c;唯一的方法还是要通过网站本身的内容更新。频繁更新有质量的内容&#xff0c;才能够提高蜘蛛的来访次数。如果本身内容更新不多&#xff0c;外部引流的蜘蛛过多&#xff0c;最终发现没什么内容索引&#xff0c;蜘蛛来访的次数也会…

es索引数据过滤查询

1.我们往kibana插入数据,来进行查询 POST /t1/_doc/ {"name":"cat","age":"18","address":"BJ","job":"dev" } POST /t1/_doc/ {"name":"dog","age":"1…

20231227在Firefly的AIO-3399J开发板的Android11的挖掘机的DTS配置单后摄像头ov13850

20231227在Firefly的AIO-3399J开发板的Android11的挖掘机的DTS配置单后摄像头ov13850 2023/12/27 18:40 1、简略步骤&#xff1a; rootrootrootroot-X99-Turbo:~/3TB$ cat Android11.0.tar.bz2.a* > Android11.0.tar.bz2 rootrootrootroot-X99-Turbo:~/3TB$ tar jxvf Androi…

网络安全自学顺序!千万不要盲目学习!

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

Java-IO-FAQ-中文乱码

1 需求 需求1&#xff1a;以指定编码方式读文件 java.io.InputStream/java.io.OutputStream java.io.FileInputStream/java.io.FileOutputStream java.io.InputStreamReader/java.io.OutputStreamWriter 这里可以设置编码方式 java.io.BufferedReader/java.io.BufferedWriter …

【MySQL】数据库之MHA高可用

目录 一、MHA 1、什么是MHA 2、MHA 的组成 3、MHA的特点 4、MHA的工作原理 二、有哪些数据库集群高可用方案 三、实操&#xff1a;一主两从部署MHA 1、完成主从复制 步骤一&#xff1a;完成所有MySQL的配置文件修改 步骤二&#xff1a;完成所有MySQL的主从授权&#x…

vue-动态高亮效果

个人练习&#xff0c;仅供参考 实现如下效果&#xff1a;点击某块&#xff0c;某块变成其他颜色。 具体实现代码&#xff1a; 上边&#xff1a; <template><div><h3 style"color: #f69">动态高亮效果</h3><hr> <!-- 对象 -->…

【DevOps-06】Jenkins实现CI/CD操作

一、简要说明 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 二、准备Springboot工程 1、IDEA新建工程 2、填写项目工程信息 3、选择Springboot版本…

数据库——LAMP的搭建及MySQL基操

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机&#xff0c;在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作&#xff1a; &#xff08;1&#xff09;登录 MySQL&#xff0c;在 MySQL 中创建用户&#xff0c;并对…

C++基础语法——基本知识、数据类型、运算符及程序流程结构

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; >第1阶段-C基础入门 ---------第2阶段实战-通讯…

MySQL之表的记录操作

前言 存数据不是目的&#xff0c;目的是能够将存起来的数据取出来或者查出来&#xff0c;并且能够对数据进行增删改查操作&#xff0c;本文将详细介绍表中记录的增删改查操作。对记录的操作属于DML数据库操作语言&#xff0c;可以通过SQL实现对数据的操作&#xff0c;包括实现向…

HTML5和JS实现太阳、地球、月亮运行动画

HTML5和JS实现太阳、地球、月亮运行动画 一个简单的地球绕太阳旋转&#xff0c;月亮绕地球旋转的动画效果。注意&#xff0c;这是一个简化的模型&#xff0c;地球运行的圆形轨道的中心是太阳的圆心&#xff0c;月球运行的圆形轨道的圆心是地球的圆心。实际的我们知道天体运动要…

Vue 中的 ref 与 reactive:让你的应用更具响应性(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Halcon粘连木材图像的目标分割计数

Halcon粘连木材图像的目标分割计数 文章目录 Halcon粘连木材图像的目标分割计数1. 提取面积较小区域2. 分割较大区域3. 区域合并与计数 本文以一个实际场景图片为例&#xff0c;介绍阈值处理与形态学计算的应用。案例图像如图所示,图&#xff08;a&#xff09;为输入的原始图像…

第十三章 需求工程之对数据关系进行建模

对数据关系进行建模 在设计阶段创建ERD时&#xff0c;其实也是在定义系统数据库的逻辑结构或物理&#xff08;实现&#xff09;结构。从分析阶段开始完成的视图能够扩展或者完善对系统的理解和优化系统实现。 ERD 实体 实体本来可以代表物理上的实体&#xff08;包括人&…

深度学习核心技术与实践之计算机视觉篇

非书中全部内容&#xff0c;只是写了些自认为有收获的部分 计算机视觉背景 &#xff08;1&#xff09;视觉皮层的神经元是一列一列组织起来的&#xff0c;每一列神经元只喜欢某一种特定的形状或者某些简单的线条组合&#xff0c;而不是鱼、老鼠、鲜花 &#xff08;2&#xf…