arm内核驱动-中断

先介绍个东西   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.hqwc.cn/news/611086.html

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

相关文章

每日一题---OJ题: 链表的回文结构

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题--- 链表的回文结构 嗯...这道题好像不是很难,我们来分析分析 举个例子: 我们可以看到,上图中的两个链表都是回文结构: 即链表的回文结构是指一个链表中的结点值从前往后读和从后往前读都是一样的结构。也就是说&#xf…

vue表格操作列,按钮太多显示... 点击后悬浮显示全部按钮

效果: 分析原理: 一共就三步,仔细看看很简单,位置要加对,代码结构下边有demo 代码结构demo: <el-table-columnlabel"操作"align"center"fixed"right"show-overflow-tooltip><template slot-scope"scope"><el-buttonsi…

前端服务请求跨域被拦截,Java后端Springboot服务解决办法

跨域问题 跨域前端遇到的问题&#xff1a; Access to XMLHttpRequest at ‘http://www.xxx.xxxx/api/x/d/xc’ from origin ‘http://127.0.0.1:3000’ has been blocked by cors policy: No ‘Access-Contorl-Allow-Origin’ header is present on the requested resource. …

npm创建Vue3项目

npm创建Vue3项目 1 创建Vue项目说明 2 安装3 运行 1 创建Vue项目 创建最新版的Vue项目&#xff0c;已经不推荐使用CLI构建方式了。参考如下即可。 npm create vuelatest如果发现一直动不了&#xff0c;切换网络试一下&#xff0c;个人热点尝试一下。 按下图的选项按需引入自…

flask后端+网页前端:基于 socket.io 的双向通信和服务器部署

我想实现的效果是&#xff0c;我的服务器提供两个路由网址&#xff0c;网页A用于拍照、然后录音&#xff0c;把照片和录音传给服务器&#xff0c;服务器发射信号&#xff0c;通知另一个路由的网页B更新&#xff0c;把刚刚传来的照片和录音显示在网页上。 然后网页B用户根据这个…

IntelliJ IDEA(WebStorm、PyCharm、DataGrip等)设置中英文等宽字体,英文为中文的一半(包括标点符号)

1.设置前&#xff08;idea默认字体为 JetBrains Mono&#xff09; 2.设置后&#xff08;楷体&#xff09;

关于游戏当中击退/击飞效果的制作

关于游戏当中击退/击飞效果的制作 在游戏当中我们免不了会有一些炫酷的效果&#xff0c;特别是RPG游戏&#xff0c;比如放一个技能&#xff0c;直接大范围杀伤&#xff0c;然后把敌人全部击飞或者击退&#xff0c;那效果真的很舒服。把自己想象成武林高手&#xff0c;一套江湖…

Debian 安装 Docker

Debian 安装 Docker。 这是官方安装文档 Install Docker Engine on Debian | Docker DocsLearn how to install Docker Engine on Debian. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/i…

⭐Unity 里调用弹出电脑系统文件选择窗 (选择图片/文件)

今天遇到的需求要从Uinty里调用选择程序外的图片&#xff0c;类似手机环境下拿图库的照片一样。 效果如下: 话不多说 直接上代码&#xff01; 1.编辑器模式下 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using Syst…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…

软考高级架构师:数据库模式概念和例题

一、AI 讲解 数据库模式分为三个层次&#xff1a;外模式、概念模式和内模式。这三个层次分别对应不同的抽象级别&#xff0c;帮助数据库管理员和用户以不同的视角理解数据库结构。 外模式&#xff08;用户级&#xff09;&#xff1a;是数据库用户的视图。每个用户可以通过外模…

Banana Pi BPI-M7 RK3588开发板运行RKLLM软件堆AI大模型部署

关于Banana Pi BPI-M7 Banana Pi BPI-M7 采用Rockchip RK3588&#xff0c;板载8/16/32G RAM内存和 64/128G eMMC存储&#xff0c;支持无线wifi6和蓝牙5.2。2x2.5G网络端口&#xff0c;1个HDMIout标准 输出口&#xff0c;2x USB3.0&#xff0c;2xTYPE-C&#xff0c;2x MIPI CSI…