arm内核驱动-中断

news2024/11/28 18:35:18

先介绍个东西   ctags

这个工具可以像keil一样在工程里查找跳转,帮我们找到我们想要的东西。

安装教程可以找到,这里只讲怎么用。

在工程目录(包含所有你会用到的头文件等)下,先加载这个命令,可能要等待一会

然后在我们写代码过程中,比如下面

以按键中断为例

按键K1中断源为EINT8

与裸机不同,操作系统下,很多东西别人已经写好了

我们在用到中断时

直接CTRL  +  ]   就会帮你搜索跳转到所要查找的文件里。CRTL  +  O回跳。我们也可以通过这个方式找到头文件。

回到中断

在操作系统中,我们不需要用很多的寄存器去配置中断。我们只需要按步骤配置就行了

1.注册中断  request_irq

参数:

        irq:中断号,就是我们上面第一张图所显示的,这里是K1的EINT8

        handler:中断回调函数,懂的都懂

        flags:中断行为、触发方式

下降沿触发

关闭其他中断(后面要用其他中断需要开启)

后面两个参数就是中断的名字和我们给回调函数传的参数,不在赘述。

回调函数

read函数

当我们调用read函数时,会进入wake_event阻塞。然后按键产生的中断会唤醒。

这里用的wake_even_interruptible而不用wake_event,如果是wake_event,在进入底层后,程序调度无法影响到它

用wake_even_interruptible这个卡死就可以被中断,也可以用wake_even_timeout,设置超时时间,当时间到了还在之前的地方就会被强制打断,上图红字所示 。

所以整个程序,中断前卡死在read那里,按一下按键就执行一次回调函数。

代码:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/module.h>
#include <linux/kdev_t.h>
#include <asm/string.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <linux/irqreturn.h>
#include <mach/irqs.h>
#include <linux/wait.h>
#include <linux/sched.h>

#define MAJOR_NUM 247
#define MINOR_NUM 0
#define DEV_NAME "eint8_key"
static wait_queue_head_t wq;
static int condition = 0;

irqreturn_t eint8_handler(int irq, void *arg)
{
    condition = 1;
    wake_up_interruptible(&wq);

    printk("irq = %d    arg = %d\n", irq, *(int *)arg);
    return IRQ_HANDLED;
}

static int open(struct inode *node, struct file *file)
{
    printk("kernrl open \n");
    return 0;
}

static int read(struct file *file, char __user *buf, size_t len, loff_t *loff)
{
    condition = 0;
    wait_event_interruptible(wq, condition);
    printk("kernrl read \n");
    return 0;
}


static int write(struct file *file, const char __user *buf, size_t len, loff_t *loff)
{
    printk("kernrl write \n");
    
    return 0;
}

static int close(struct inode *node, struct file *file)
{
    printk("kernrl close \n");
    return 0;
}

static dev_t dev_num;
static struct file_operations fops =
{
    .owner = THIS_MODULE,
    .open = open,
    .read = read,
    .write = write,
    .release = close
};
static struct cdev dev;
static unsigned int args = 100;

static int __init exit_key_init(void)
{
    int ret = 0;
    dev_num = MKDEV(MAJOR_NUM, MINOR_NUM);

    ret = cdev_add(&dev, dev_num, 1);
    if(ret < 0)
        goto err_add_failed;

    cdev_init(&dev, &fops);

    
    ret = register_chrdev_region(dev_num, 1, DEV_NAME);
    if(ret < 0)
        goto err2_register_failed;
    
    ret = request_irq(IRQ_EINT8, eint8_handler, IRQF_TRIGGER_FALLING | IRQF_DISABLED, "exit_key", &args);
    if(ret < 0)
        goto err_request_irq_failed;


    printk("eint8_key_init       /\n");
    return 0;
    
err_add_failed:
    printk("cdev_add failed\n");
    cdev_del(&dev);
    return ret;

err2_register_failed:
    printk("register_chrdev_region failed\n");
    unregister_chrdev_region(dev_num, 1);
    cdev_del(&dev);
    return ret;
        
err_request_irq_failed:
    printk("err_request_irq failed\n");
    disable_irq(IRQ_EINT8);
    free_irq(IRQ_EINT8, &args);
    unregister_chrdev_region(dev_num, 1);
    cdev_del(&dev);
    return ret;

}

static void __exit key_exit(void)
{
    disable_irq(IRQ_EINT8);
    free_irq(IRQ_EINT8, &args);
    unregister_chrdev_region(dev_num, 1);
    cdev_del(&dev);
    printk("led_exit ....\n");
}

module_init(exit_key_init);
module_exit(key_exit);

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

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

相关文章

第十五讲:C语言内存函数

目录 1、C语言内存函数 1.1、memcpy函数的使用和模拟 1.2、memmove函数的使用和模拟 1.3、memset函数的使用 1.4、memcmp函数的使用 1、C语言内存函数 注意&#xff1a;下面这些函数的使用要包含头文件&#xff1a;string.h 1.1、memcpy函数的使用和模拟 函数声明为&am…

2024年第十七届 认证杯 网络挑战赛 (C题)| 云中的海盐 | 辐射传输方程 Stefan-Boltzmann分析 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (C题&#xff09;&#xff01…

PTA qls学画图

这一天qls在学校综合楼等电梯的时候看到了电梯数字的样子&#xff0c;突然觉得这样写数字特别有趣&#xff0c;于是自己想用程序跑出来。由于正常大小输出数字太小了&#xff0c;qls决定加大难度&#xff0c;他想画出不同大小的数字&#xff0c;你能帮他解决这个问题吗&#xf…

ELK,ELFK日志收集分析系统

ELK简介 ELK是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch&#xff0c;Logstash和Kibana三个开源工具配合使用&#xff0c;实现用户对日志的查询、排序、统计需求。 ELK工作原理 在所有需要收集日志的服务器上部署Logstash&#xff0c;或者先将日志进行集中…

渗透入门靶场大盘点

写给新手朋友入门&#xff0c;有了靶场丰富自己思路&#xff0c;也巩固自己的技术。当然新手老手都可以玩玩。 这期盘点渗透靶场&#xff0c;排名不分前后&#xff0c;还有其他靶场欢迎留言提出&#xff01;以及在留言当中评论出你最喜欢的靶场并附上理由。 本期是盘点入门必刷…

用html写一个雨的特效

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>雨特效</title><link rel"stylesheet" href"./style.css"> </head> <body> <div id"wrap-textu…

19 文件接口

文件概念 文件指的是文件内容属性&#xff0c;对文件的操作无外乎就是对内容或者属性的操作 为什么平时不用文件接口 我们运行程序访问文件&#xff0c;本质是进程在访问文件&#xff0c;向硬件写入内容&#xff0c;只有操作系统有这个权限。普通用户想写入内容呢&#xff1…

SpringBoot学习笔记四

SpringBoot学习笔记四-监听机制 1. SpringBoot监听器1.1 无需配置1.1.1 CommandLineRunner使用1.1.2 ApplicationRunner的使用1.1.3 CommandLineRunner与ApplicationRunner的区别 1.2 需要创建META-INF文件&#xff0c;并在其中创建spring.factories&#xff0c;配置相关的信息…

SpringMVC原理及工作流程

组件 SpringMVC的原理主要基于它的各个组件之间的相互协作交互&#xff0c;从而实现了Web请求的接收&#xff0c;处理和响应。 它的组件有如下几个&#xff1a; DispatcherServlet前端控制器 HandlerMapping处理器映射器 Controller处理器 ModelAndView ViewResolver视图…

make/makefile学习

文章目录 1、makefile函数1.1、字符串替换函数&#xff1a;subst1.2、模式字符串替换函数&#xff1a;patsubst1.3、去空格函数&#xff1a;strip1.4、查找字符串函数&#xff1a;findstring 2、、:、&#xff1f;区别 1、makefile函数 1.1、字符串替换函数&#xff1a;subst …

2000-2022年县域常住人口和户籍人口数据

2000-2022年县域常住人口和户籍人口数据/县常住人口及县户籍人口数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;县域统计年鉴、各省年鉴 3、指标&#xff1a;户籍人口数、常住人口数 4、范围&#xff1a;县区级&#xff0c;具体县名单参看数据预览 5、缺失情况…

文心一言 VS 讯飞星火 VS chatgpt (233)-- 算法导论17.2 1题

一、假定对一个规模永远不会超过 k 的栈执行一个栈操作序列。执行 k 个操作后&#xff0c;我们复制整个栈来进行备份。通过为不同的栈操作赋予适合的摊还代价&#xff0c;证明&#xff1a; n 个操作(包括复制栈)的代价为 O(n) 。 文心一言&#xff1a; 为了证明对一个规模永远…

直播带货行业将迎来大地震

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 为什么这么多人喊着关闭直播带货?实体经济是到底因为什么萧条的?为什么大街上冷冷清清的?是房租、虚高的价格、还是直播带货引起的? 在4月9日的国务院政策吹风会上&#xff0c;市场监管明确指出&#xff1a; …

MINI2440 开发板 给他干出来了

环境是ubuntu14.04。不要问我为什么是这个版本&#xff0c;因为之前的ubuntu12.04 环境干不出来&#xff0c;你去试试就知道了&#xff01;各种资源包下载不下来。 输入启动参数&#xff1a; 进入MINI2440&#xff1a;别说心里一万个开心&#xff0c;启动完成&#xff0c;输入p…

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解 HTTP的由来 HTTP是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写。它的发展是万维网协会&#xff08;World Wide Web Consortium&#xff09;和Internet工作小组IETF&#xff08;Internet Eng…

【软件测试之判定表法】

【软件测试之判断表法】(蓝桥课学习笔记) 1、判定表法的概念 判定表又称“决策表”&#xff0c;是一种表格状的图形工具&#xff0c;适用于处理判断条件较多&#xff0c;各条件又相互组合、有多种决策方案的情况。由于决策表可以把复杂的逻辑关系和多种条件组合的情况表达的既…

最新国产中文版官网chatGPT镜像网站

分享5个国产中文版chatGPT镜像网站&#xff0c;希望可以帮助到您&#xff01; 1️⃣ HiClaude3基于国外原版GPT模型、Claude模型开发&#xff0c;是资源丰富的全能镜像&#xff0c;适合各行各业的工作者。不仅有gpt&#xff0c;而且还支持图片对话、文件对话&#xff0c;轻松解…

zookeeper解析

目录 zookeeper定义 zookeeper定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目 Zookeeper工作机制 zookeeper从设计模式角度来理解&#xff1a; 是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心…

.a和.so库文件是什么?

我们在编译开源代码后&#xff0c;通常会生成.a和.so这两个库文件&#xff0c;这两个文件有什么区别&#xff1f;又如何使用&#xff1f; 在 Linux 中&#xff0c;.a 和 .so 文件都是库文件&#xff0c;但它们有一些区别&#xff1a; 静态库文件&#xff08;.a&#xff09;&am…

【C++算法】线性DP详解:数字三角形、最长上升子序列、最长公共子序列、最长公共子串、字符串编辑距离

文章目录 1&#xff09;数字三角形1&#xff1a;顺推2&#xff1a;逆推 2&#xff09;最长上升子序列1&#xff1a;线性DP做法2&#xff1a;二分优化 3&#xff09;最长公共子序列4&#xff09;最长公共子串5&#xff09;字符串编辑距离 1&#xff09;数字三角形 1&#xff1a…