欢迎光临散文网 会员登陆 & 注册

【i.MX6ULL】驱动开发8——中断法检测按键

2021-12-26 12:21 作者:码农爱学习-B站  | 我要投稿

上篇,学习GPIO输入功能的使用,本篇,来学习使用中断的方式来检测按键的按下。

1 Linux中断介绍

1.1 中断的上半部与下半部

中断处理函数的执行,越快越好,但实际使用中,某些情况确实需要比较耗时是中断过程,为此,Linux内核将中断分为上半部和下半部两个处理部分

  • 上半部:中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成

  • 下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出

对于一个中断,如何划分出上下两部分呢?

  • 时间敏感,将其放在上半部

  • 硬件相关,将其放在上半部

  • 要求不被其他中断打断,将其放在上半部

  • 其他所有任务,考虑放在下半部

1.2 下半部的3种实现方式

1.2.1 软中断

Linux内核使用softirq_action结构体表示软中断:

一共有 10 个软中断

要使用软中断,必须先使用open_softirq函数注册对应的软中断处理函数:

注册好软中断以后需要通过raise_softirq函数触发:


1.2.2 tasklet

Linux内核使用tasklet_struct结构体来表示tasklet:

要使用 tasklet,必须先定义一个tasklet,然后初始化:

在上半部(中断处理函数)中调用tasklet_schedule函数就能使tasklet在合适的时间运行:


1.2.3 工作队列

工作队列(work queue)是另外一种将中断的部分工作推后的一种方式,它可以实现一些tasklet不能实现的工作,比如工作队列机制可以睡眠。

Linux 内核使用work_struct结构体表示一个工作

这些工作组织成工作队列,工作队列使用workqueue_struct结构体表示。

在工作队列机制中,将推后的工作交给一个称之为工作者线程(worker thread)的内核线程去完成。

1.3 中断API函数

1.3.1 request_irq中断请求函数

flags中断标志,有下面几种类型


1.3.2 free_irq中断释放函数

1.3.3 irq_handler_t中断处理函数

irqreturn_t枚举类型定义:

1.3.4 中断使能/禁用函数

1.3.5 获取中断号

使用中断时,中断信息先写到了设备树里面,然后通过irq_of_parse_and_map函数从interupts属性中提取到对应的中断号


2 软件编写

仍使用上篇按键实验中用到的两个按键:

为了理解简单,本次程序暂不实现中断的下半部逻辑,直接将整个中断处理过程都放到中断的上半部中处理。

2.1 修改设备树文件

在上篇key实验代码的基础上,修改imx6ull-myboard.dts,主要是修改key子节点,添加中断,修改后内容如下:


2.2 按键中断驱动程序

2.2.1 硬件初始化与中断配置

中断检测到按键按下后,为了消除按键抖动,这里使用定时器来进行按键消抖,因为本次实验用到两个按键,所以就先也使用两个定时器。

2.2.2 中断服务函数

中断函数检测到按键按下后,会开启一个10ms的定时器,用来按键消抖。

2.2.3 定时器服务函数

定时器的10ms到达之后,会触发定时器服务函数,此时再次读取按键的值,若仍为按下,则是按键真的按下了,若10ms后又检测不到按键了,则说明是按键抖动导致的按键误触发。

2.2.4 按键读取函数

2.3 按键中断驱动程序

按键中断的应用程序,使用上篇的按键检测的应用程序即可

3 实验

编译设备树与驱动文件(irqkey-BSp.ko),使用上篇的按键应用程序(key-App),按下按键,会打印get key,松开按键,会打印key release。

4 总结

本篇主要介绍了Linux中断的使用方法,通过按键来进行中断实验测试,并使用Linux定时器进行按键去抖。



【i.MX6ULL】驱动开发8——中断法检测按键的评论 (共 条)

分享到微博请遵守国家法律