linux中断编程 中断:是指cpu在运行过程中,出现了某种异常事件,需要cpu先暂停当前工作,转而去处理新产生的异常事件,处理完后再返回暂停的事件继续往下执行。就例如我们正在使用手机进行微信视频聊天,这时突然有人打电话过来,这时手机的处理方式是手机来来电铃声响起,通知用户电话来了。
中断,就是来处理未来时间内可能会发生的事件, 中断事件也称为异常事件。有了中断处理,则可大大提高cpu处理效率。
在单片机中,我们也常用中断方式来处理一些紧急事件,帮我们实现快速响应一些实时性的事件。因此我们在编写中断服务函数时都是代码尽可能简洁、一定不能处理死循环、若需要处理的事情比较多则应在中断中设定标志位,然后将逻辑代码放到主函数中去实现。
在linux内核中,我们一般会将中断分为顶半部分和底半部分。顶半部分主要是处理耗时短的代码(像单片机中设置标志位),启动底半部分代码;底半部分主要是处理耗时比较长的代码,完成中断响应后的事件处理。
1. linux下外部中断 要使用外部中断,则需要完成中断三要素的配置:中断号(irq)、中断服务函数、中断触发方式(电平触发、边沿触发)。
1.1 相关接口函数 获取中断号gpio_to_irq 在linux内核中提供了方便函数获取引脚中断号
int gpio_to_irq(unsigned gpio)函数功能: 获取中断号返回值: 成功返回对应gpio的中断号irq 注册中断request_irqint request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)函数功能: 注册中断形 参: irq --中断号,gpio_to_irq函数返回值。 handler --中断服务函数。 服务函数原型:typedef irqreturn_t (*irq_handler_t)(int, void *); flags --中断触发方式。 #define irqf_trigger_rising 0x00000001 //上升沿 #define irqf_trigger_falling 0x00000002 //下升沿 #define irqf_trigger_high 0x00000004//高电平 #define irqf_trigger_low 0x00000008//低电平 #define irqf_shared 0x00000080 //共享中断 name --中断注册标志。 dev --传给中断服务函数的参数。返回值: 成功返回0,失败返回其它值。 中断服务函数typedef irqreturn_t (*irq_handler_t)(int, void *);函数功能: 中断服务函数形 参: 第一个参数为中断号;第二个参数为注册函数传入的参数dev返回值: enum irqreturn { irq_none = (0 << 0), //如果不是本中断的则返回这个值,只在共享中断中使用 irq_handled = (1 << 0), //正确执行中断程序返回这个值,常用 irq_wake_thread = (1
key_num); } else { printk( key%d 松开n,key_p->key_num); } key_val=key_p->key_num;}/*中断服务函数*/static irqreturn_t key_irq_handler(int irq, void *dev){ key_p=(struct _key *)dev; schedule_work(&key_work);/*调度工作*/ return irq_handled;/*中断正常处理*/}static int key_open(struct inode *inode, struct file *file){ printk(设备打开成功n); return 0;}static ssize_t key_read(struct file *file, char __user *buf, size_t cnt, loff_t *seek){ int res=copy_to_user(buf,&key_val, 4); key_val=0; return 4-res;}static int key_release(struct inode *inode, struct file *file){ printk(设备关闭成功n); return 0;}/*文件操作集合*/static struct file_operations key_fops={ .owner= this_module, /*当前模块文件操作集合所有者*/ .open=key_open,/*open函数接口*/ .read=key_read,/*read函数接口*/ .release=key_release,/*close函数接口*/};/*字符设备注册:主设备+次设备号主设备 --用来区分类(杂项设备、输入设备)次设备号 --对应哪个设备杂项设备的主设备号固定为:10*/static struct miscdevice key_miscdev = { .minor = misc_dynamic_minor,/*次设备号255由内核分配*/ .name = tiny4412_key,/*设备节点名字,会在/dev下生成*/ .fops = &key_fops,/**/};static int __init tiny4412_key_module_init(void){ int i=0; int res; printk(hello,驱动注册成功n); /*初始化工作*/ init_work(&key_work,key_work_func); /*注册中断*/ for(i=0;i(key_gpio_pin)>
印度斯坦推出自主研发的新型无人直升机全尺寸模型
瑞丰Mini LED车尾灯概念,未来趋势之选
可满足多样化应用需求的相机用透镜驱动器IC
当居住空间被智能包裹:OTA智能社区改变了什么
手术机器人怎样技术融合赋能
Linux中断编程
多功能智能遥测终端机 5G/4G+北斗多信道 视频采集传输
哪吒汽车、高通公司和车联天下达成战略合作
CAN与CAN FD的区别是什么?
未来五年每年投1950亿元才有机会超越台积电和三星?
汽车六大先进安全技术盘点
基于分布式光纤温度传感器实现井温测量系统的设计
中兴通讯携手中国联通在前海蛇口自贸片区展示了多个5G网络应用成果
谷歌将停用设计工具Material Theme Editor
如何采用TI MAXCharge技术实现快速充电
碎片化对物联网发展是挑战也是机遇
通信专家:5G拉动经济产值真的可实现吗
IR推出第三代大电流SupIRBuck负载点稳压器IR3847
人脸识别开启“无接触式”智能门锁新体验
NTT推出新一代流程银行解决方案