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.mzph.cn/news/581171.shtml

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

相关文章

2024美赛数学建模思路A题B题C题D题E题F题思路汇总 选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

【JavaScript】new原理解析

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

netty源码:(40)ReplayingDecoder

ReplayingDecoder是ByteToMessageDecoder的子类&#xff0c;我们继承这个类时&#xff0c;也要实现decode方法&#xff0c;示例如下&#xff1a; package cn.edu.tju;import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handle…

Ubuntu20.04服务器使用教程(安装教程、常用命令、故障排查)持续更新中.....

安装教程&#xff08;系统、驱动、CUDA、CUDNN、Pytorch、Timeshift、ToDesk&#xff09; 制作U盘启动盘&#xff0c;并安装系统 在MSDN i tell you下载Ubuntu20.04 Desktop 版本&#xff0c;并使用Rufus制作UEFI启动盘&#xff0c;参考UEFI安装Ubuntu使用GPTUEFI模式安装&am…

【IoT网络层】STM32 + ESP8266 +MQTT + 阿里云物联网平台 |开源,附资料|

目标&#xff1a;实现STM32连接阿里云物联网平台发送数据同时接收数据&#xff0c;IOT studio界面显示数据。具体来说&#xff1a;使用ESP8266 ESP-01来连接网络&#xff0c;获取设备数据发送到阿里云物联网平台并显示且oled显示屏当前的设备数据&#xff0c;通过IOT studio界面…

OpenHarmony城市技术论坛武汉站:探索大模型时代的终端操作系统创新

2023年12月23日下午,OpenHarmony城市技术论坛(以下简称“技术论坛”)——第6期(武汉站)于华中科技大学梧桐语问学中心明德报告厅圆满举办。本次技术论坛聚焦“大模型时代的系统软件”,旨在探索AI大模型在终端操作系统领域的创新趋势和挑战。论坛从“终端操作系统十大技术挑战”…

最适合学生用的台灯有哪些?分享高口碑的学生护眼台灯

台灯是我们日常比较实用的一盏桌面照明灯具&#xff0c;不管是休闲看书、学习、办公都会用得上。如果使用了一款光源不好的台灯&#xff0c;时间长了可能就会影响我们的眼睛健康&#xff0c;特别是孩子的眼睛&#xff0c;还没有发育完全&#xff0c;影响更大。因此孩子学习的台…

模式识别与机器学习-SVM(带软间隔的支持向量机)

SVM&#xff08;带软间隔的支持向量机&#xff09; 软间隔思想的由来软间隔的引入 谨以此博客作为复习期间的记录。 软间隔思想的由来 在上一篇博客中&#xff0c;回顾了线性可分的支持向量机,但在实际情况中&#xff0c;很少有完全线性可分的情况&#xff0c;大部分线性可分…

MYSQL高级SQL语句

目录 一、环境准备 二、高级SQL语句 三、通配符&#xff08;通常通配符都是跟 LIKE 一起使用的&#xff09; 四、函数 一、环境准备 create database kgc; use kgc; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Bost…

【算法与数据结构】860、LeetCode柠檬水找零

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题的思路比较简单&#xff0c;首先要保存收到的零钱&#xff0c;其次计算找零&#xff0c;最后分解找…

前缀和——OJ题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、和为 k 的子数组1、题目讲解2、思路讲解3、代码实现 二、和可被 K 整除的⼦数组1、题目讲…

【Pytorch】学习记录分享9——PyTorch新闻数据集文本分类任务实战

【Pytorch】学习记录分享9——PyTorch新闻数据集文本分类任务 1. 认为主流程code2. NLP 对话和预测基本均属于分类任务详细见3. Tensorborad 1. 认为主流程code import time import torch import numpy as np from train_eval import train, init_network from importlib impo…

【机器学习】西瓜书第6章支持向量机课后习题6.1参考答案

【机器学习】西瓜书学习心得及课后习题参考答案—第6章支持向量机 1.试证明样本空间中任意点x到超平面(w,b)的距离为式(6.2)。 首先&#xff0c;直观解释二维空间内点到直线的距离&#xff1a; 由平面向量的有关知识&#xff0c;可得&#xff1a; 超平面的法向量为 w w w&am…

PHP的Laravel加一个小页面出现问题(whereRaw的用法)

1.权限更新问题 因为是已经有样例了所以html和php页面很快写出来了 然后就是页面写完了路由不知道在哪写&#xff0c;后来想起来之前有要开权限来着&#xff0c;试了一下&#xff0c;还是不行&#xff0c;不过方向是对了 这是加的路由&#xff0c;不过需要在更新一下权限 这…

开箱即用的企业级数据和业务管理中后台前端框架Ant Design Pro 5的开箱使用和偏好配置

Ant Design Pro 介绍 Ant Design Pro 是一个开箱即用的企业级前端解决方案&#xff0c;基于 Ant Design 设计体系&#xff0c;提供了丰富的组件和功能&#xff0c;帮助开发者更快速地开发和部署企业级应用。 Ant Design Pro 使用 React、umi 和 dva 这三个主要的前端开发技术…

Linux高级管理——yum仓库服务

一、部署yum软件仓库&#xff1a; 借助于YLM软件仓库&#xff0c;可以完成安装&#xff0e;卸载、自动升级rpm软件包等任务。YUM的前身是YUP (Yellow dog Updater, Yellow dog Linux的软件更新器),最初由TSS公司&#xff08;TerraSoft Solutions&#xff0c;INC.&#xff09;使…

数据结构--查找

目录 1. 查找的基本概念 2. 线性表的查找 3. 树表的查找 3.1 二叉排序树 3.1.1 定义: 3.1.2 存储结构&#xff1a; 3.1.3 二叉排序树的查找 3.1.4 二叉排序树的插入 3.1.5 二叉排序树删除 3.2 平衡二叉树&#xff08;AVL 3.2.1 为什么要有平衡二叉树 3.2.2 定义 3.3 B-树 3.3.1…

Linux命令-ps命令

ps用于显示进程 process&#xff1a;进程 执行&#xff1a;ps -ef -e&#xff1a;等价于 ‘-A’ &#xff0c;表示列出全部的进程 -f&#xff1a;显示全部的列&#xff08;显示全字段&#xff09;配合grep命令去搜索程序&#xff1a; ps -ef | grep sshd

http——https实现指南

第一部分&#xff1a;HTTPS安全证书简介 什么是HTTPS安全证书&#xff1f; 在网络通信中&#xff0c;HTTPS安全证书是一种由可信任的证书颁发机构&#xff08;CA&#xff09;签发的数字证书&#xff0c;用于保障网站与用户之间的数据传输安全。通过加密和身份验证&#xff0c…

mapboxgl 中热力图的实现以及给热力图点增加鼠标移上 popup 效果

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章还是关于最近做到的 mapboxgl 地图展开的。 借鉴官方示例&#xff1a;https://iclient.supermap.io/examples/mapboxgl/editor.html#heatMapLayer 效果预览 技术思路 将接口数据渲染到地图中形成热力图。还需要将热…