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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode中调试C++程序

目录 一、准备工作&#xff1a;安装插件 1、C/C插件 ​编辑 2、CMake插件 3、CMake tool插件 二、调试过程 1、debug 2、打断点 3、调C/C文件 每次重新调试的时候都忘了具体步骤&#xff0c;直接给自己写个备忘录好了。 一、准备工作&#xff1a;安装插件 1、C/C插件…

李沐29_残差网络ResNet——自学笔记

残差网络 残差网络的核心思想是&#xff1a;每个附加层都应该更容易地包含原始函数作为其元素之一。 残差块 串联一个层改变函数类&#xff0c;我们希望扩大函数类&#xff0c;残差块加入快速通道来得到f(x)xg(x)的结果 ResNet块 1.高宽减半的ResNet块&#xff08;步幅2&a…

Android开发之移除权限

Android开发之移除权限 在Android开发结束后&#xff0c;我们将build好的App Bundle上传至Google Play。这时Google可能会提示一些需要解决的错误&#xff0c;比如xx权限需要限制&#xff0c;需要解释为什么需要这些权限&#xff0c;需要添加文字描述和视频链接&#xff0c;但…

MicroCinema与CCEdit:让文生视频兼具创造性与可控性

编者按&#xff1a;随着视频生成技术的飞速进步&#xff0c;我们见证了人工智能技术在视频清晰度、长视频连贯性以及对物理变化理解和镜头转换处理能力方面的显著提升。不过&#xff0c;这些高质量的生成结果是否完全符合我们的需求呢&#xff1f;显然&#xff0c;并非总是如此…

如何借助AI高效完成写作提纲

AI变革力量&#xff1a;未来数据中心的智能化之旅&#xff01; 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;在众多领域展现出了它的能力&#xff0c;特别是在写作领域。AI写作工具不仅能够帮助我们高效地生成内容&#xff0c;还能在一定程度上提升…

利用弱监督定位的高分辨率乳腺癌筛查图像的可解释分类器

标准筛查乳房 X 光检查由每个乳房的两张高分辨率 X 射线组成&#xff0c;分别从侧面&#xff08;“中外侧”或 MLO 视图&#xff09;和上方&#xff08;“头尾”或 CC 视图&#xff09;拍摄&#xff0c;总共四张图像。 乳房X光照片的分辨率非常高&#xff0c;而大多数无症状癌症…

WebGL异步绘制多点

异步绘制线段 1.先画一个点 2.一秒钟后&#xff0c;在左下角画一个点 3.两秒钟后&#xff0c;我再画一条线段 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"…

[2024年4月最新]Python安装教程

一、Python下载 1、进入Python官网 官网地址&#xff1a;https://www.python.org 2、点击【Downloads】展开后点击【Windows】跳转到下载python版本页面&#xff0c;选择"Stable Releases"稳定版本&#xff0c;我下载的是Python 3.10.10版本&#xff0c;所以找到【…

IDEA中无法保存设置 Cannot Save Settings

确定原因: 在IDEA中父工程不应该存在有子工程的相关东西 首先,这是我的DCYJ项目(观察右侧的Content Root) 其次,这是我的EAPOFode项目(观察右侧的Content Root爆红处) 最后我将DCYJ项目右侧的Content Root全部删掉

共享单车到底是什么通信原理

我们经常骑的共享单车到底是什么通信原理&#xff0c;有人了解过吗&#xff1f; 一、智能车锁 共享单车最核心的硬件是智能车锁&#xff0c;主要用于实现控制和定位功能。 车锁内集成了嵌入式芯片&#xff08;通信模块&#xff09;&#xff0c;GPS模块和物联网SIM卡。 智能锁制…

DP例题详解(二)最短编辑距离和编辑距离

902. 最短编辑距离 - AcWing题库 #include<bits/stdc.h>using namespace std;const int N1010;int n,m; char a[N],b[N]; int f[N][N];int main() {cin>>n>>a1;cin>>m>>b1;for(int i0;i<m;i)f[0][i]i;for(int i0;i<n;i)f[i][0]i;//先初始化…

用户状态保持机制-Session

0、业务需求 会话&#xff1a;web应用中的会话是指一个客户端浏览器和服务器之间连续发生的一系列请求和响应的过程。 会话状态&#xff1a;web应用中的会话状态是指web服务器与浏览器在会话过程中产生的状态信息&#xff0c;借助会话状态&#xff0c;服务器能够把属于同一会话…

线性表概念及实现1

文章目录 前言一、线性表1.定义2.特点3.一般线性表的抽象数据类型定义 二、线性表的顺序存储&#xff08;顺序表&#xff09;1.基本概念2.数组实现顺序表3.顺序表中基本操作的具体实现 总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#…

纯小白蓝桥杯备赛笔记--DAY14(计算几何)

文章目录 计算几何基础平面几何距离圆的周长和面积圆与圆之间的关系&#xff1a;海伦公式计算三角形面积点到直线的距离 点积和叉积例题&#xff1a; 点和线的关系点的表示形式和代码判断点在直线的那边点到线的垂足点到线的距离例题-1242例题-1240升级--点到线段的距离--1285 …

指定世界TOP名校|医学研究学者公派美国麻省理工学院做博士后

W医生公派博士后条件为&#xff1a;世界TOP100的知名高校&#xff0c;研究方向相符且前沿。最终我们用世界顶级高校-美国麻省理工学院&#xff08;MIT&#xff09;的博士后邀请函助其获得单位资助&#xff0c;顺利通过签证并出国。 W医生背景&#xff1a; 申请类型&#xff1a…

LC 501.二叉搜索树中的众数

501.二叉搜索树中的众数 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 …

全国贫困县DID数据(2008-2022年)

数据来源&#xff1a;国W院扶贫开发领导小组办公室 时间跨度&#xff1a;2008-2022年 数据范围&#xff1a;各县域 数据指标 年份 县域名称 所属地市 所属省份 县域代码 是否贫困县(是为1&#xff0c;否为0) 参考文献&#xff1a; [1]马雯嘉,吴茂祯.从全面脱贫到乡村振兴…

VQ-BeT: Behavior Generation with Latent Actions 代码复现(Mujoco 安装)

代码地址&#xff1a;https://github.com/jayLEE0301/vq_bet_official.git 创建环境 conda create -n vq-bet python3.9 conda activate vq-bet拉取库 git clone https://github.com/jayLEE0301/vq_bet_official.git export PROJ_ROOT$(pwd)安装pytorch conda install pyto…

AI论文速读 | 线性时间序列预测模型分析

论文标题&#xff1a;An Analysis of Linear Time Series Forecasting Models 作者&#xff1a; William Toner&#xff0c; Luke Darlow 机构&#xff1a;爱丁堡大学&#xff08;Edinburgh&#xff09;&#xff0c;华为研究中心&#xff08;爱丁堡&#xff09; 论文链接&am…

开源项目若依放大招了?

前言 鉴于之前写了篇插件式相关的文章&#xff0c;阅读量比起其它文章可不要好太多&#xff0c;所以我决定继续这个主题&#xff01; 以前我们公司用的就是Ruoyi&#xff0c;代码比较简单易懂。但是有些功能确实用不上&#xff0c;比如部门和岗位&#xff0c;每次新项目我拉了…