关于Linux的GPIO中断知识

在嵌入式系统中,经常会用到gpio外部中断来获取外部事件,比如按键、传感器、网络通信等等。一般中断都会绑定一个中断回调函数,来执行产生中断后的一些任务。linux的中断是操作系统管理的资源,需要在内核层配置中断以及绑定回调函数。
内核编程可以直接修改内核源码,也可以使用linux提供的模块编程方式。使用模块很方便,编译很快而且可以很方便的插入和移除。当然插入和移除操作需要管理员权限,与模块相关的命令有lsmod、insmod和rmmod。
详细的模块编程的方法网上和书上一大堆,很容易找到。
主要结构
1、init函数
2、exit函数
3、module_init和module_exit
4、作者、版权声明等。
注意:模块的编译需要用到源码,就是安装一个以headers结尾的东西。
在/usr/src下会有对应的目录,使用uname -r看看版本是否一致,如果不一样一般是当前系统的要比较旧,可以使用apt-get upgrade升级系统。不同的版本编译的模块不能加载,会提示格式无法识别之类的错误。
另外,内核编程用到的头文件和应用编程用到的头文件也不是一个系统的,内核编程用的是
/usr/src/linux-headers-xxx/include下的头文件,而应用编程用的是/usr/include/下的头文件。
ok,回到gpio中断。
在init函数里,使用gpio需要先请求一个并配置它的模式,使用gpio_request_one()函数,三个参数分别是gpio号、模式和名称。
使用函数enable_irq()使能中断,参数是中断号,gpio对应的中断号可以使用gpio_to_irq()获取。
调用request_irq()配置中断的回调函数、触发方式、名称和传入参数。
在exit函数中,对应的我们需要释放中断和对应的gpio。
编写中断回调函数。中断回调函数的格式定义如下:
linux的中断函数分为了两个部分:顶半部和底半部。 顶半部是真正的回调函数,执行在中断上下文中,一般是不能被打断的,所以这里要尽可能短,只做非做不可的事。
底半部由顶半部触发,执行中断回调的其他不太紧急的事务。底半部的机制由软中断、tasklet、工作队列等(不知道是否有其它新技术了)。底半部的程序会参与内核的调度,可以被中断。
一些必要的头文件:
编译模块我看大家都用make,还好写个简单的makefile也不复杂。小写的makefile有时候make不认识,不知道什么原因,如果遇到改成大写就好。
make然后插入模块
查看模块lsmod
使用dmesg查看log信息。如果init函数有printk打印可以看到信息。
在/proc/interrupts中可以看到中断比较详细的信息,红框就是我们的gpio中断。
在/proc/stat中也有关于中断的信息。intr(黄框)就是所有的中断统计情况,最后四个(红线)就是gpio中断的次数。
在proc/irq/下有以中断号命名的目录,目录下有跟中断相关的文件。
关于linux的gpio中断目前就知道这么多了,欢迎大家补充交流。 限于个人水平,肯定会有遗漏和错误的地方,还望大家海涵。 在另一篇关于字符设备的专栏里,我会讲如何通过创建字符设备把内核的数据(比如中断处理的结果)传给用户空间,欢迎大家阅读。

三星星曜PenPro雪域白开启预售 起售价10199元
烙铁头的使用寿命
使用一维位置传感器测量第二个轴
Σ-Δ调制器基本结构、原理及非线性误差校正方法
在设计时如何选择适合的MCU开发套件
关于Linux的GPIO中断知识
区块链用于食品供应链中,供应链运输中的任何时候能够监控和检查货物
基于SoPC的参数化TFT-LCD控制器IP核设计
智能电话机器人的优势是什么
每日分享:光纤布线小技巧
工程师感悟:如何正确寻找自己的定位
入选新一代人工智能试验区 这四个城市迎来大利好
Profibus-DP总线技术及其在BWS伺服传动应用方案
诺基亚重现神坛!马上发布诺基亚3、诺基亚5、诺基亚6(国际版)、诺基亚3310糯粉们怎么看?
最顶尖高端的精密仪器技术及一些相关技术都在哪一些国家呢?
计算机天才1个月写了个操作系统
戴森成就专业造型无限可能,先锋科技引领行业
电流反馈型OPA SC7508,压摆率5500V/μs,兼容AD8009
如何消除电磁干扰
5G版开启了下一个时代 接下来苹果该怎么继续增长?