嵌入式Linux学习: interrupt实验
Linux中的Interrupt(中断)系统是一个至关重要的组成部分,它负责管理和处理系统中发生的各种硬件和软件中断,确保系统能够正确响应外部设备的请求,保持系统的稳定性和可靠性。
1.中断的作用
- 允许设备在没有CPU干预的情况下发送信号并请求处理。
- 提高系统的并发处理能力,使CPU能够同时处理多个任务。
- 确保系统能够及时响应外部设备的请求,保证系统的实时性和稳定性。
2. Linux中断子系统的组成与工作流程
- 中断控制器:负责收集所有中断源发起的中断,并对中断进行初步处理,如优先级排序、中断分发等。
- 中断处理函数:每个中断都会对应一个或多个中断处理函数,当中断发生时,CPU会暂停当前任务,跳转到相应的中断处理函数执行。
- 中断描述符(irq_desc):用于描述IRQ(Interrupt Request,中断请求)线的属性与状态,是中断子系统中的重要数据结构。
- 中断芯片(irq_chip):描述不同类型的中断控制器,提供与硬件中断控制器交互的接口。
3.特殊中断类型
- SGI(Software Generated Interrupt):软件触发的中断,一般用于核间通信。
- PPI(Private Peripheral Interrupt):私有外设中断,每个核心私有的中断。
- SPI(Shared Peripheral Interrupt):共享外设中断,可以分发到某一个CPU上。
- LPI(Locality-specific Peripheral Interrupt):GICv3中的新特性,基于消息的中断。
4. Linux 中断 API 函数
request_irq 函数
在 Linux 内核中要想使用某个中断是需要申请的,request_irq 函数用于申请中断,request_irq
函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用 request_irq 函
数。 request_irq 函数会激活(使能)中断,所以不需要我们手动去使能中断, request_irq 函数原型
如下:
int request_irq(unsigned int irq,irq_handler_t handler,unsigned long flags,const char *name,void *dev)
/* irq:要申请中断的中断号。handler:中断处理函数,当中断发生以后就会执行此中断处理函数。flags:中断标志,可以在文件 include/linux/interrupt.h 里面查看所有的中断标志name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名字。dev: 如果将 flags 设置为 IRQF_SHARED 的话, dev 用来区分不同的中断,一般情况下将dev 设置为设备结构体, dev 会传递给中断处理函数 irq_handler_t 的第二个参数。返回值: 0 中断申请成功,其他负值 中断申请失败,如果返回-EBUSY 的话表示中断已经被申请了。*/
flags中断标志介绍如下:
| 标志 | 描述 |
|--------------------|--------------------------------------------------------------|
| IRQF_SHARED | 允许多个设备共享同一个中断线,所有共享中断都需指定此标志,dev 参数为唯一区分标志 |
| IRQF_PROBE_SHARED | 类似IRQF_SHARED,但用于自动探测共享中断。不推荐使用 |
| IRQF_TIMER | 这是一个定时器中断 |
| IRQF_IRQPOLL | 驱动程序应使用慢速中断轮询 |
| IRQF_ONESHOT | 如果是共享中断,request_irq的dev参数应唯一,用于区分中断请求 |
| IRQF_NO_SUSPEND | 禁止在挂起期间禁用此中断 |
| IRQF_FORCE_RESUME | 强制在设备唤醒时重新启用中断,即使它被标记为IRQF_NO_SUSPEND |
| IRQF_NOBALANCING | 不允许在CPU之间平衡此中断 |
| IRQF_IRQ_DISABLED | 中断被禁用(用于特殊目的的中断初始化) |
| IRQF_PERCPU | 中断是每CPU的(不支持共享) |
| IRQF_NO_THREAD | 不要为中断创建线程(也称为“bottom half”) |
| IRQF_EARLY_RESUME | 允许在suspend-to-idle期间尽早恢复中断(与IRQF_NO_SUSPEND相关) |
| IRQF_TRIGGER_NONE | 没有触发事件 |
| IRQF_TRIGGER_RISING | 上升沿触发 |
| IRQF_TRIGGER_FALLING| 下降沿触发 |
| IRQF_TRIGGER_HIGH | 高电平触发 |
| IRQF_TRIGGER_LOW | 低电平触发 |
| IRQF_TRIGGER_MASK | 触发类型掩码(用于清除触发类型标志) |
free_irq 函数
使用中断的时候需要通过 request_irq 函数申请,使用完成以后就要通过 free_irq 函数释放
掉相应的中断。如果中断不是共享的,那么 free_irq 会删除中断处理函数并且禁止中断。
void free_irq(unsigned int irq,void *dev)
/*irq: 要释放的中断。dev:如果中断设置为共享(IRQF_SHARED)的话,此参数用来区分具体的中断。共享中断只有在释放最后中断处理函数的时候才会被禁止掉。返回值:无。
*/
5.interrupt子系统实验
注:本实验使用的是韦东山I.MX6U开发板
dts文件
/dts-v1/;
/{gpio_keys_100ask_imx6ull{compatible = "100ask,gpio_keys";gpios = <&gpio5 1 GPIO_ACTIVE_LOW&gpio4 14 GPIO_ACTIVE_LOW>;pinctrl-names = "default";pinctrl-0 = <&key1_pinctrl&key2_pinctrl>;status = "okay";};
};
&iomuxc_snvs {key1_pinctrl: key1_pinctrl { /*!< Function assigned for the core: Cortex-A7[ca7] */fsl,pins = <MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x000110A0>;};
};&iomuxc {key2_pinctrl: key2_pinctrl { /*!< Function assigned for the core: Cortex-A7[ca7] */fsl,pins = <MX6UL_PAD_NAND_CE1_B__GPIO4_IO14 0x000010B0>;};
}
100ask_imx6ull-14x14.dts 完成编写后,在(内核目录)编译dts文件
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make dtbs
将编译好的dtb文件拷贝到网络文件系统中
cp /home/book/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/
#include "asm-generic/errno-base.h"
#include "asm-generic/int-ll64.h"
#include "asm/gpio.h"
#include "linux/compiler.h"
#include "linux/err.h"
#include "linux/export.h"
#include "linux/gpio/consumer.h"
#include "linux/interrupt.h"
#include "linux/ioport.h"
#include "linux/kdev_t.h"
#include "linux/leds.h"
#include "linux/of.h"
#include "linux/printk.h"
#include "linux/slab.h"
#include "linux/stddef.h"
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/irq.h>
#include <linux/wait.h>
#include <linux/poll.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <linux/platform_device.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>struct gpio_key{int gpio;enum of_gpio_flags flags;int irq;
};static struct gpio_key *gpio_keys;static irqreturn_t gpio_keys_100ask_irq(int irq, void *dev_id)
{struct gpio_key *gpio_key = dev_id;printk("key %d val %d\n", irq,gpio_get_value(gpio_key->gpio));return IRQ_HANDLED;
}/* 当驱动与设备连匹配成功时执行此函数 */
static int keys_probe (struct platform_device *pdv){int count,i,err;int gpio,irq;enum of_gpio_flags flags;struct device_node *node = pdv->dev.of_node;count = of_gpio_count(node); // 得到设备所使用的GPIO个数gpio_keys = kzalloc(count * sizeof(struct gpio_key), GFP_KERNEL);for(i = 0; i < count; i++){gpio = of_get_gpio_flags(node,i,&flags);irq = gpio_to_irq(gpio);gpio_keys[i].gpio = gpio;gpio_keys[i].irq = irq;gpio_keys[i].flags = flags;err = request_irq(irq, gpio_keys_100ask_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "100ask_gpio_key", &gpio_keys[i]);if(err != 0){dev_err(&pdv->dev, "Could not get irq %d.\n", irq);}}return 0;
}static int keys_remove (struct platform_device *pdv)
{int i;for(i = 0; i < of_gpio_count(pdv->dev.of_node); i++){free_irq(gpio_keys[i].irq, &gpio_keys[i]);}kfree(gpio_keys);return 0;
}static struct of_device_id keys_match[] = {{.compatible = "100ask,gpio_keys"},{},
};static struct platform_driver keys_driver = {.probe = keys_probe,.remove = keys_remove,.driver = {.name = "key_driver",.of_match_table = of_match_ptr(keys_match),},
};static int __init keys_init(void)
{return platform_driver_register(&keys_driver);
}static void __exit keys_exit(void)
{platform_driver_unregister(&keys_driver);
}module_init(keys_init);
module_exit(keys_exit);MODULE_AUTHOR("Pumpk1n");
MODULE_LICENSE("GPL");
KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88obj-m += keys_int_driver.oall: $(MAKE) -C $(KERN_DIR) M=`pwd` modulesclean:make -C $(KERN_DIR) M=`pwd` modules cleanrm -rf modules.order
执行命令: make
编译 keys_int_driver.c文件为 keys_int_driver.ko内核模块文件
拷贝文件到网络文件系统中
cp keys_int_driver.ko ~/nfs_rootfs/
串口连接开发板
挂载到网络文件系统中
[root@100ask:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
将/mnt/100ask_imx6ull-14x14.dtb文件复制到/boot/下面
[root@100ask:~]# cp /mnt/100ask_imx6ull-14x14.dtb /boot/
重启开发板,等待重启完成后重新挂载网络文件系统中
[root@100ask:~]# reboot
[root@100ask:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
进入到/mnt/目录中,并向内核加载模块文件keys_int_driver.ko
[root@100ask:~]# cd /mnt
[root@100ask:mnt]# insmod keys_int_driver.ko
设置内核消息的打印
echo "7 4 1 7" > /proc/sys/kernel/printk
按下按键key1,key2可分别在控制台打印消息
遇到的错误:
genirq: Flags mismatch irq 208. 00000003 (100ask_gpio_key) vs. 00000083 (User1 Button)
解决办法:
If you want to use the same irq number to register different interrupt handler, please use IRQ_SHARED flags.
err = request_irq(irq, gpio_keys_100ask_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, "100ask_gpio_key", &gpio_keys[i]);
相关文章:
嵌入式Linux学习: interrupt实验
Linux中的Interrupt(中断)系统是一个至关重要的组成部分,它负责管理和处理系统中发生的各种硬件和软件中断,确保系统能够正确响应外部设备的请求,保持系统的稳定性和可靠性。 1.中断的作用 允许设备在没有CPU干预的情…...
GPT-4o mini 来袭:开发者如何驾驭新一代AI模型?
GPT-4o Mini 来袭:开发者如何驾驭新一代 AI 模型? 引言 随着人工智能(AI)技术的飞速发展,越来越多的先进模型不断涌现,给各行各业带来了深远的影响。OpenAI 最新推出的 GPT-4o Mini 是一种创新的 AI 模型…...
校园点餐系统
1 项目介绍 1.1 摘要 在这个被海量信息淹没的数字化时代,互联网技术以惊人的速度迭代,信息的触角无处不在,社会的脉动随之加速。每一天,我们都被汹涌而至的数据浪潮包裹,生活在一个全方位的数字信息矩阵中。互联网的…...
进口不锈钢309S螺栓的应用优势
进口不锈钢309S螺栓因其优异的性能和广泛的应用范围而在许多行业中备受青睐。309S不锈钢是一种含硫的易切削不锈钢,具有良好的耐高温和耐腐蚀性能,使其成为高温环境下理想的选择。下面我们就来详细探讨一下进口不锈钢309S螺栓的应用优势。 一、309S不锈钢…...
C# 设计模式之工厂方法模式
总目录 前言 本文是个人基于C#学习设计模式总结的学习笔记,希望对你有用! 在简单工厂模式中说到了简单工厂模式的缺点:简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现…...
Webpack 从入门到精通
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、Webpack 简介 二、Webpack 的核心概念 三、Webpack 的安装与配置 安装 Node.js 安装 Webpack 初始…...
基于VScode和C++ 实现Protobuf数据格式的通信
目录 1. Protobuf 概述1.1 定义1.2Protobuf的优势 2. Protobuf 语法3、序列号和反序列化3.1 .pb.h 头文件3.2 序列化3.3 反序列化 4、测试用例 Protobuf详细讲解链接 1. Protobuf 概述 1.1 定义 protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立…...
linux环境openssl升级
1、下载openssl https://openssl-library.org/source/ 或者通过wget --no-check-certificate https://www.openssl.org/source/openssl-3.0.13.tar.gz 2、解压openssl tar -zxvf openssl-3.0.13.tar.gz 3、切换到解压后的目录 cd openssl-3.0.13/ 4、配置openssl安装目录…...
150Kg载重遥控履带式无人车技术详解
150Kg载重遥控履带式无人车是一种专为复杂地形和重载运输设计的无人化智能平台。它结合了先进的动力技术、履带式行走机构、远程遥控系统、高精度感知与导航技术及模块化设计,能够在恶劣环境下执行物资运输、侦察监视、灾害救援等多种任务。该车以其卓越的越野能力、…...
STM32的外部中断详解
一、什么是中断? 想象一下你正在家里做饭,突然门铃响了,你听到门铃声后,会暂时放下手中的事情(比如炒菜),去开门看看是谁。在这个例子中,门铃声就是一个“中断”,它打断…...
关于python问题 ,生成的excel文件内无爬取的数据存在,请问应如何解决?
🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…...
详细介绍Avalonia中的文件操作StorageProvider服务
文章目录 一、介绍二、StorageProvider的原理三、StorageProvider的实现1. 创建文件选择和保存对话框2. 选择目录四、StorageProvider的配置五、StorageProvider的高级用法1. 读取和写入文件2. 获取文件和目录信息3. 管理文件和目录4. 处理不同平台的差异六、总结一、介绍 在桌…...
「7.31更新日志」JVS·智能BI、逻辑、规则引擎功能更新说明
项目介绍 JVS是企业级数字化服务构建的基础脚手架,主要解决企业信息化项目交付难、实施效率低、开发成本高的问题,采用微服务配置化的方式,提供了 低代码数据分析物联网的核心能力产品,并构建了协同办公、企业常用的管理工具等&am…...
编程语言 | C | 代码整理 | 4月
八月拍了拍你,并对你说:“好运就要开始了”! 目录 编程语言 | C | 代码整理 | 4月2019/4/12019/4/22019/4/22019/4/32019/4/42019/4/52019/4/62019/4/72019/4/82019/4/92019/4/102019/4/112019/4/122019/4/132019/4/142019/4/152019/4/162019…...
模板可变参数
当涉及到 C 编程中的模板参数处理时,特别是在处理可变数量的参数时,模板可变参数(variadic templates)是一个非常有用的特性。本篇博客将深入介绍模板可变参数的基本概念、语法、应用场景以及示例代码,帮助读者理解如何…...
是你!是你!我们的黄金写手!
...
QT 获取用于获取特定屏幕坐标处的最上层小部件(父与子关系的类)
QPoint globalPos pEvent->globalPos(); QWidget* widget QApplication::widgetAt(globalPos); 注意:屏幕坐标(包括显示器双屏)...
【应急响应】Linux权限维持 -隐藏权限
前言 不知攻焉知守,学会排查就要先学习如何攻击。 隐藏文件 Linux下创建一个隐藏文件:touch .test.txt 查看Linux下的隐藏文件需要用到命令:ls -al 隐藏文件时间戳 touch -r .docker hello.php 创建的hello.php文件会和.docker创建文件的时间…...
还有哪些AI应用案例目前备受关注
目前备受关注的AI应用案例众多,以下是一些代表性的例子: 1. WPS AI 背景:WPS AI是金山办公发布的基于大语言模型的人工智能办公助手,于2023年11月开启公测。 功能:WPS AI锚定AIGC(内容创作)、C…...
将控制台内容输出到文本文件
示例代码: Imports System.IO Module Module1Sub Main()Dim fs As New FileStream("D:\Desktop\test\输出结果.txt", FileMode.Create, FileAccess.Write, FileShare.None)Dim sw As New StreamWriter(fs)Console.SetOut(sw)Console.SetError(sw)For i …...
380. O(1) 时间插入、删除和获取随机元素【 力扣(LeetCode) 】
一、题目描述 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。bool remove(int val) 当元素 val 存…...
【每日刷题】Day91
【每日刷题】Day91 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 面试题 05.07. 配对交换 - 力扣(LeetCode) 2. 面试题 08.05. 递归乘法 - 力…...
数据库索引的创建和使用
数据库索引数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度。索引优化是数据库优化的最重要手段。 如果查询语句使用索引(通常是where条件匹配索引)就会利用…...
光流传感器 - 从零开始认识各种传感器【第二十二期】
光流传感器|从零开始认识各种传感器 1、什么是光流传感器 光流传感器是一种用于测量物体相对于周围环境的运动的设备。它通过检测周围光线的变化来计算出物体的运动方向和速度,广泛应用于机器人导航、无人机飞行控制、虚拟现实等领域。 2、光流传感器是如何工作的…...
爬虫:jsonpath模块及腾讯招聘数据获取
目录 jsonpath模块 腾讯招聘数据获取 jsonpath模块 # pip install jsonpath -i https://pypi.tuna.tsinghua.edu.cn/simple import jsonpathdata {"store": {"book":[{"category": "reference","author": "Nigel Ree…...
透明屏幕的显示原理与特点
透明屏幕,特别是透明LED显示屏,以其独特的显示效果和通透性在现代建筑和广告领域中逐渐崭露头角。它既能提供视觉显示,又不影响采光效果,成为建筑立面和商场橱窗等场景的理想选择。那么,透明屏幕的显示原理是什么&…...
[Day 41] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
去中心化金融(DeFi)是一個利用區塊鏈技術來構建去中心化的金融系統的運動。它旨在通過智能合約和去中心化應用(DApps)來提供傳統金融系統中的各種服務,如貸款、儲蓄、保險、交易等,而不依賴於中心化的機構。…...
PHP表单验证
PHP 表单验证是确保用户输入数据符合特定要求的关键步骤,它有助于维护数据的完整性和准确性,同时提高应用的安全性。以下是一个详细的 PHP 表单验证教程: 一、表单的创建 首先,你需要在 HTML 文档中创建一个表单。表单包含输入字…...
英文文献翻译软件有哪些?知道这5款工具就够了
对于那些致力于科研、教育或国际业务的人来说,英文文献往往是获取前沿知识的关键。 然而,语言的障碍往往成为一道难以逾越的鸿沟。幸运的是,科技的进步带来了众多翻译工具,它们不仅能够帮助我们理解外语内容,还能直接…...
单线程 和多线程区别,看打印输出1000个数字效果
执⾏过程: 加载func() -> 执⾏main -> 创建⼦线程t -> ⼦线程t启动 -> 执⾏func中的内容 |-> 继续执⾏main from threading import Thread #此线程不用安装自带。T是大写注意哟 def func():for i in range(1000):print(func,i) #定义一个函数打印 if __name__ …...
新疆建设监理公司网站/成都疫情最新消息
上图是LPC1114系统滴答定时器(SysTick)的结构图。系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器。其存在的主要目的是为嵌入式操作系统提供100Hz(即10ms)的定时节…...
新闻文章网站源码/如何设计企业网站
服务器宕机排查记录 标签: 服务器宕机 调优 0006272016年06月13日 09:36:301479人阅读 评论(0) 收藏 举报分类:weblogic运维(7) 问题症状:服务器内存占用持续增长,性能低下,并发上不去ÿ…...
响应式网站的优缺点/关键词怎样做优化排名
原理图 二话不说,直接上图 总结 主Reactor通过Selector监听连接事件,收到通知后。通过Acceptor处理连接事件 当Acceptor处理连接事件之后,MainReactor将事件分配给SubReactor SubReactor将这个事件加入到队列中,并且创建Han…...
做外贸需要关注国外哪些网站/吉林seo排名公司
china_xuhua 原文地址 1、方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线 程,如果不采用多线程控制进度条,…...
好用的免费建站网站/企业网络营销顾问
前言 俗话说“生于忧患,死于安乐”,其实大部分中年危机,就是在安乐中产生的。 有的人或许会反驳,“照你这么说,我还必须奋斗了,不奋斗就要死,难道选择安逸的生活就不对吗?我就没有…...
完整网站开发视频教程/学电脑办公软件培训班
直线振动筛是采用专用振动电机来产生振动的,直线振动筛振源有电动机带动激振器,激振器有两个轴,每个轴上有一个偏心重和专用振动电机激振器两端自带的偏心甩块而且以相反方向旋转,所产生的激振力,多余的震动力相互抵消…...