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

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

    关注

    41

    文章

    3563

    浏览量

    129203
  • Linux
    +关注

    关注

    87

    文章

    11219

    浏览量

    208872
  • 中断
    +关注

    关注

    5

    文章

    895

    浏览量

    41384
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62411
  • GPIO
    +关注

    关注

    16

    文章

    1196

    浏览量

    51896
收藏 人收藏

    评论

    相关推荐

    STM32 GPIO的外部中断设计

    在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的方式访问
    发表于 04-14 10:51 2027次阅读
    STM32 <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 2612次阅读

    浅析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 5503次阅读

    如何在嵌入式Linux中使用GPIO

    了解如何在嵌入式Linux中使用GPIO,特别强调Zynq-7000系列。 我们介绍了基本的用户和内核空间GPIO使用情况,以及GPIOGPIO
    的头像 发表于 11-26 07:02 4054次阅读

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

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

    关于MPSoC的中断处理介绍

    Intc外设的Device Tree 4. 扩展MIO中断 4.1. GPIO中断控制器 4.2. 外设使用GPIO中断控制器5. 检查
    的头像 发表于 05-07 15:34 3979次阅读

    嵌入式Linux中断驱动

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

    深度剖析GPIO中断

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

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

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

    如何配置GPIO中断功能呢?

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

    RK3568外部IO中断示例

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

    stm32 GPIO中断配置教程

    在嵌入式开发中,STM32微控制器因其高性能和丰富的外设而广受欢迎。GPIO(通用输入/输出)中断是STM32微控制器中常用的功能之一,它允许开发者在特定引脚上检测到外部信号变化时快速响应。 1.
    的头像 发表于 11-19 15:53 132次阅读