IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 十八、中断之独立按键 -> 正文阅读

[嵌入式]十八、中断之独立按键

一、简介

中断:是指 CPU 在执行程序的过程中, 出现突发事件去处理, CPU 需要停止当前程序的执行, 转去处理突发 事件, 处理完成之后再返回原程序部分。
?

中断源:是指引发中断的原因。
?

硬件中断:一般指外设发出的中断请求以及内部硬件产生的中断(计算溢出, 除数为 0, 掉电等)


软件中断:?典型的是中断处理程序的下半部操作.
?

硬件中断的分类
内部中断: 内部硬件产生的中断(例如: 除数为 0)
外部中断: 外设产生的中断(重点)
?

外部中断的触发方式
上升沿触发和下降沿触发电平触发
?

中断优先级
系统根据中断事件的重要性和紧迫程度, 将中断源分为若干个等级, 优先级高的先执行。

中断处理函数
中断产生之后执行的一段代码。

中断向量号
中断源的识别标志, 是跳往中断程序的“入口地址”。

中断向量和非中断向量
硬件提供中断处理函数的地址
软件通过判断之后, 提供中断处理函数的最终地址

向量中断和非向量中断的判断方法
一般一个中断号对应一个中断函数就是向量中断(独立按键) 多个中断函数共用一个中断号(矩阵键盘)
?

中断处理程序架构
操作系统中会产生很多中断, 如果每一个中断都全部处理完之后再向后执行, 是不可能的, 所以就将中断处理程序分解为上半部和下半部。上半部一般是和硬件紧密相关的代码, 下半部一般是耗时的一些操作。
例如给 PC 插入 U 盘会产生中断, 接收之后, 硬件会马上响应, 中断操作会很快执行上半部分, 然后就向上半部分通知系统调用对应的驱动程序。 后面调用驱动的这个过程可以称之为下半部分。


二、按键原理图

?三、驱动代码

中断申请函数
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
有下面几个参数。
参数 unsigned int irq: irq 是中断号
参数 irq_handler_t handler: handler 是向系统登记的处理函数
参数 unsigned long flags: irqflags 是触发标志位(

????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_EDGE_RISING(上升沿)

????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_EDGE_BOTH(上升、下降沿)

????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_LEVEL_HIGH(高电平)

????????????????????????????????????????????????????????????????????????????????/?IRQ_TYPE_LEVEL_LOW(低电平)

????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_SIMPLE(Simple中断)

????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_PERCPU(Per CPU中断):

参数 const char *name: devname 是中断名称, 可以通过注册之后可以通过“cat /proc/interrupts”查看
参数 void *dev: dev_id 是设备
和上面中断申请函数对应的就是中断释放函数 free_irq, 卸载驱动的时候需要调用, 如下图所示, 也是在头文件“include/linux/interrupt.h”中。

#include <linux/init.h>
#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/fs.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
//#include <mach/gpio-bank.h>
#include <mach/regs-gpio.h>
#include <asm/io.h>
#include <linux/regulator/consumer.h>
//#include "gps.h"
#include <linux/delay.h>

//中断头文件
#include <linux/irq.h>
#include <linux/interrupt.h>

#define DPRINTK(x...) printk("keyirq DEBUG:" x)

#define DRIVER_NAME "keyirq"

static irqreturn_t eint9_interrupt(int irq,void *dev_id)
{
	printk("receive a interrupt 9!\n");
	return IRQ_HANDLED;
}

static irqreturn_t eint10_interrupt(int irq,void *dev_id)
{
	printk("receive a interrupt 10!\n");
	return IRQ_HANDLED;
}

static int keyirq_probe(struct platform_device *pdev)
{
	//int ret, i;
	char *banner = "keyirq Initialize\n";
	printk(banner);
	//注册中断
	request_irq(IRQ_EINT(9),eint9_interrupt,IRQ_TYPE_EDGE_FALLING,"my_eint9",pdev);
	request_irq(IRQ_EINT(10),eint10_interrupt,IRQ_TYPE_EDGE_FALLING,"my_eint10",pdev);
	
	return 0;
}

static int keyirq_remove (struct platform_device *pdev)
{
	free_irq(IRQ_EINT(9),pdev);
	free_irq(IRQ_EINT(10),pdev);
	
	return 0;
}

static int keyirq_suspend (struct platform_device *pdev, pm_message_t state)
{
	DPRINTK("keyirq suspend:power off!\n");
	return 0;
}

static int keyirq_resume (struct platform_device *pdev)
{
	DPRINTK("keyirq resume:power on!\n");
	return 0;
}

static struct platform_driver keyirq_driver = {
	.probe = keyirq_probe,
	.remove = keyirq_remove,
	.suspend = keyirq_suspend,
	.resume = keyirq_resume,
	.driver = {
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
	},
};

static void __exit keyirq_exit(void)
{
	platform_driver_unregister(&keyirq_driver);
}

static int __init keyirq_init(void)
{
	return platform_driver_register(&keyirq_driver);
}

module_init(keyirq_init);
module_exit(keyirq_exit);
MODULE_LICENSE("Dual BSD/GPL");

四、添加设备

vim arch/arm/mach-exynos/mach-itop4412.c

?

?五、运行

??cat /proc/interrupts (查看中断)

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 09:00:42  更:2021-11-26 09:01:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:37:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码