自学linux驱动从入门到放弃(十三)中断上下文
2021/12/17 7:24:45
本文主要是介绍自学linux驱动从入门到放弃(十三)中断上下文,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在中断中,分为中断上文和下文(tasklet),在request_irq中注册的函数为中断函数,一般是中断上文,中断下文一般用于处理一些复杂耗时间的程序。
1.中断上下文
1.1 tasklet结构体
struct tasklet_struct { struct tasklet_struct *next; unsigned long state; atomic_t count; void (*func)(unsigned long); unsigned long data; };
成员 | 描述 |
*next | tasklet链表中下一个tasklet |
state | tasklet 的状态 TASKLET_STATE_SCHED 已经被调度,将要运行 TASKLET_STATE_RUN 正在运行 |
count | tasklet的引用计数,如果它不为0,则tasklet被禁止,不允许执行;只有当它为0时,tasklet才被激活,并且在被设置为挂起(TASKLET_STATE_SCHED)状态时,该tasklet才能够被执行。 |
(*func)(unsigned long) | tasklet的处理函数 |
data | tasklet fun的参数 |
1.2 tasklet 初始化
void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data);
参数 | 描述 |
*t | tasklet结构体指针 |
(*func)(unsigned long) | tasklet处理函数 |
data | tasklet参数 |
1.3 tasklet 调度
static inline void tasklet_schedule(struct tasklet_struct *t)
1.4 调用过程
1)定义tasklet结构体
2)初始化tasklet
3)编写tasklet function
4)调度tasklet
5)注销tasklet
1.5 伪代码
struct tasklet_struct key_task; void key_task_fun(unsigned long data) //tasklet function { printk("key tasklet fun is action!\n"); } irqreturn_t key_fun(int irq,void *args) //interrupt function { printk(KERN_ERR "test fun is action!!\n"); tasklet_schedule(&key_task); //开始调度tasklet return IRQ_HANDLED; } int led_probe(struct platform_device *pdev){ int ret; gpio_res = gpiod_get_index(&pdev->dev,"key",0,GPIOD_OUT_LOW); //获取名为key的gpio属性 ret = gpiod_direction_input(gpio_res); //将引脚设置为输入 irq = of_irq_get(pdev->dev.of_node, 0); //通过设备树结点获取中断信息 ret = request_irq(irq, key_fun, IRQF_TRIGGER_RISING, "key_interrupt", NULL); //申请中断号 tasklet_init(&key_task,key_task_fun, 0); //初始化tasklet //注册设备号 //创建class //生成设备节点 return 0; } static void charDev_exit(void) { //释放gpio tasklet_kill(&key_task); //注销tasklet //释放irq //注销设备节点 //注销类 //注销设备号 }
这篇关于自学linux驱动从入门到放弃(十三)中断上下文的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南