一、Linux下中断的简单使用步骤
1.包含相关的头文件
#include <linux/irq.h>
#include <linux/interrupt.h>
2. 申请中断号
int gpio_to_irq(unsigned gpio)
3.注册中断服务函数
int __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
函数参数
irq: 中断号
irq_handler_t:
irqreturn_t (*irq_handler_t)(int, void *)
函数参数
int: 产生中断的中断号
void *: 传递给中断服务函数的参数
函数返回值
我们不用, 给个 0 即可
flags: 中断触发标志
IRQ_TYPE_EDGE_RISING --- 上升沿触发
IRQ_TYPE_EDGE_FALLING --- 下降沿触发
IRQ_TYPE_EDGE_BOTH --- 双边沿
因为后续会学到输入子系统 --- 如果用上升沿触发, 判断条件可能有问题
name: 无所谓, 尽可能有意义
dev: 传递给中断服务函数的参数
不传参填 NULL
函数返回值
成功返回 0, 失败返回负数
注意: 返回值需要承接, 不承接会报警告
5.释放中断
void *free_irq(unsigned int irq, void *dev_id)
二、等待队列
等待队列用于解决内核阻塞问题
等待队列的使用
第一步: 等待队列的申请
第二步: 阻塞
第三步: 释放
1.包含相关头文件
#include <linux/wait.h>
#include <linux/sched.h>
2.等待队列的申请
DECLARE_WAIT_QUEUE_HEAD(name);
name: 表示等待队列的名字
3.等待队列的阻塞
wa