0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于Linux的GPIO中断知识

CHANBAEK 来源:头条号科G栈 作者:头条号科G栈 2023-03-24 11:27 次阅读

嵌入式系统中,经常会用到gpio外部中断来获取外部事件,比如按键、传感器网络通信等等。一般中断都会绑定一个中断回调函数,来执行产生中断后的一些任务。Linux的中断是操作系统管理的资源,需要在内核层配置中断以及绑定回调函数。

内核编程可以直接修改内核源码,也可以使用Linux提供的模块编程方式。使用模块很方便,编译很快而且可以很方便的插入和移除。当然插入和移除操作需要管理员权限,与模块相关的命令有lsmod、insmod和rmmod。

详细的模块编程的方法网上和书上一大堆,很容易找到。

主要结构

1、init函数

2、exit函数

3、module_init和module_exit

4、作者、版权声明等。

注意:模块的编译需要用到源码,就是安装一个以headers结尾的东西。

poYBAGQdGJOAP9qqAAD0Ym67QpQ900.jpg

在/usr/src下会有对应的目录,使用uname -r看看版本是否一致,如果不一样一般是当前系统的要比较旧,可以使用apt-get upgrade升级系统。不同的版本编译的模块不能加载,会提示格式无法识别之类的错误。

pYYBAGQdGJSAdUBnAAF2kME8ls0819.jpg

另外,内核编程用到的头文件和应用编程用到的头文件也不是一个系统的,内核编程用的是

/usr/src/linux-headers-xxx/include下的头文件,而应用编程用的是/usr/include/下的头文件。

ok,回到gpio中断。

在init函数里,使用gpio需要先请求一个并配置它的模式,使用gpio_request_one()函数,三个参数分别是gpio号、模式和名称。

poYBAGQdGJWAfVv-AACp1VnnvMs411.jpg

使用函数enable_irq()使能中断,参数是中断号,gpio对应的中断号可以使用gpio_to_irq()获取。

pYYBAGQdGJaAH3iaAAB2ZmRG79I535.jpg

调用request_irq()配置中断的回调函数、触发方式、名称和传入参数。

poYBAGQdGJeAcQCVAAETXnuL9Fc086.jpg

在exit函数中,对应的我们需要释放中断和对应的gpio。

pYYBAGQdGJiAD4tyAACGmt4nrYs482.jpg

编写中断回调函数。中断回调函数的格式定义如下:

pYYBAGQdGJmAWQIJAABX5SG6nkM389.jpg

Linux的中断函数分为了两个部分:顶半部和底半部。 顶半部是真正的回调函数,执行在中断上下文中,一般是不能被打断的,所以这里要尽可能短,只做非做不可的事。

poYBAGQdGJmAJ9VqAABgGMcbJzk901.jpg

底半部由顶半部触发,执行中断回调的其他不太紧急的事务。底半部的机制由软中断、tasklet、工作队列等(不知道是否有其它新技术了)。底半部的程序会参与内核的调度,可以被中断。

pYYBAGQdGJqAK6XBAADaLTZC1Cw446.jpg

一些必要的头文件:

poYBAGQdGJuAFtnIAABoIJoFLQo753.jpg

编译模块我看大家都用make,还好写个简单的Makefile也不复杂。小写的makefile有时候make不认识,不知道什么原因,如果遇到改成大写就好。

pYYBAGQdGJyAN5bwAAB--6K7yvI558.jpg

make然后插入模块

poYBAGQdGJ6AYI5PAATRfq80Ci0435.jpg

查看模块lsmod

pYYBAGQdGJ6AMRHqAAEDZnzp8mE054.jpg

使用dmesg查看log信息。如果init函数有printk打印可以看到信息。

poYBAGQdGJ-AfL8aAAOw2PNrkxE689.jpg

在/proc/interrupts中可以看到中断比较详细的信息,红框就是我们的gpio中断。

pYYBAGQdGKKAWyJpAALl5Dg6Ggo332.jpg

在/proc/stat中也有关于中断的信息。intr(黄框)就是所有的中断统计情况,最后四个(红线)就是gpio中断的次数。

poYBAGQdGKOAXwRNAAFBFjdAc4w110.jpg

在proc/irq/下有以中断号命名的目录,目录下有跟中断相关的文件。

poYBAGQdGKOANHv8AAFTjwi30bA297.jpg

关于Linux的gpio中断目前就知道这么多了,欢迎大家补充交流。 限于个人水平,肯定会有遗漏和错误的地方,还望大家海涵。 在另一篇关于字符设备的专栏里,我会讲如何通过创建字符设备把内核的数据(比如中断处理的结果)传给用户空间,欢迎大家阅读。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3397

    浏览量

    128185
  • Linux
    +关注

    关注

    87

    文章

    10981

    浏览量

    206673
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41020
  • 函数
    +关注

    关注

    3

    文章

    3859

    浏览量

    61297
  • GPIO
    +关注

    关注

    16

    文章

    1129

    浏览量

    50482
收藏 人收藏

    评论

    相关推荐

    每一个GPIO如何配置成一个外部中断触发源

    1STM32中断分组STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之
    的头像 发表于 01-25 08:44 1.5w次阅读
    每一个<b class='flag-5'>GPIO</b>如何配置成一个外部<b class='flag-5'>中断</b>触发源

    一文搞懂Linux pinctrl/gpio子系统

    注: 所有文章基于linux-3.13以上,本系列主要介绍 GPIO的一些基本知识,驱动操作GPIO的接口,应用层通过sysfs操作GPIO
    发表于 06-09 09:52 1495次阅读

    浅析linux gpio中断

    最近用到gpio中断gpio中断也是嵌入式系统用的比较多的。对于GPIO操作 linux 有一
    发表于 07-26 08:15

    如何配置嵌入式LinuxGPIO中断

    做个STM32开发的都知道,通过程序配置让普通的GPIO口具有中断功能。这样对于设备检测某些硬件的自动设备要方便的多。那么在嵌入式的Linux是否具有这样的功能呢?答案是肯定的,下面我们就来介绍一下
    发表于 11-04 07:18

    linux gpio中断

    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。今天主要以linux gpio中断源而做出的程
    发表于 11-17 15:50 5390次阅读

    GPIO中断和事件:为ARM初学者导航(6)

    第六讲:GPIO中断和事件--《为ARM初学者导航》
    的头像 发表于 07-02 00:22 4402次阅读
    <b class='flag-5'>GPIO</b>、<b class='flag-5'>中断</b>和事件:为ARM初学者导航(6)

    嵌入式Linux下使用GPIO中断功能

    GPIO应用是嵌入式设备最基本的应用之一, 本文就基于Embedded Linux系统演示开发GPIO中断以及输出相关的基本应用示例.
    发表于 04-29 15:48 2310次阅读
    嵌入式<b class='flag-5'>Linux</b>下使用<b class='flag-5'>GPIO</b><b class='flag-5'>中断</b>功能

    嵌入式Linux中断驱动

    用过STM32的大概都知道,基本每个GPIO管脚都支持中断模式,这样在检测外部插入一个硬件设备时,通过GPIO管脚电平中断就非常方便。那么AM3354的片子是否支持
    发表于 11-01 16:57 4次下载
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>中断</b>驱动

    嵌入式Linux LED GPIO

    文章目录前言LED终端脚本C语言GPIO子系统微信公众号前言这是前2篇:嵌入式Linux i.MX开发板嵌入式Linux NFS嵌入式Linux 交叉编译工具链
    发表于 11-01 17:05 11次下载
    嵌入式<b class='flag-5'>Linux</b> LED <b class='flag-5'>GPIO</b>

    嵌入式LinuxGPIO中断

    做个STM32开发的都知道,通过程序配置让普通的GPIO口具有中断功能。这样对于设备检测某些硬件的自动设备要方便的多。那么在嵌入式的Linux是否具有这样的功能呢?答案是肯定的,下面我们就来介绍一下
    发表于 11-01 17:37 6次下载
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>GPIO</b><b class='flag-5'>中断</b>

    esp32学习之按键检测gpio中断

    esp32学习之gpio中断前言流程选定gpiogpio配置设置回调函数注册中断处理程序前言最近在做一个按键检测,按键检测有两种方法,一种是轮询法,即在rtos中建立一个任务,然后在死循环中判断按键
    发表于 12-04 16:21 14次下载
    esp32学习之按键检测<b class='flag-5'>gpio</b><b class='flag-5'>中断</b>

    深度剖析GPIO中断

    本文介绍 GPIO 中断,包括中断示例及其各种功能。这是上一篇文章的延续,该文章解释了微控制器的并发和中断的概念。
    的头像 发表于 04-27 16:11 8036次阅读
    深度剖析<b class='flag-5'>GPIO</b><b class='flag-5'>中断</b>

    关于GPIO外设访问及中断设计

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计。
    的头像 发表于 09-05 10:00 830次阅读

    如何配置GPIO中断功能呢?

    如何配置GPIO中断功能呢? GPIO在嵌入式系统中经常用于控制外设,如LED、摄像头、传感器等。除此之外,GPIO还可以被配置为中断功能
    的头像 发表于 10-30 09:57 3025次阅读

    RK3568外部IO中断示例

    ​外部IO中断介绍本篇文章以万象奥科HD-RK3568-IOT评估板中GPIO30为例,介绍Linux内核中断的注册方法,使用中断的方式检测
    的头像 发表于 11-03 13:56 570次阅读
    RK3568外部IO<b class='flag-5'>中断</b>示例