驱动基石之_tasklet中断下半部_工作队列_中断线程化处理

2023-11-11 00:36

本文主要是介绍驱动基石之_tasklet中断下半部_工作队列_中断线程化处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tasklet中断下半部

linux的中断分为两个部分:

1.中断上半部:在中断上半部期间,不允许被其他中断打断,直到中断上半部的服务函数执行完。

2.中断下半部:中断下半部,在执行中断下半部服务函数的期间,能被其它更高优先级别的中断打断。

使用流程

1.创建一个strcuct timer_list类型的变量,我把这个变量定义在结构体使是因为我这里使用的了两个按键,我把按键看成一个对象,把需要的属性封装成一个结构体,方便后续的操作。
在这里插入图片描述2.初始化这个变量。在这里插入图片描述
3.调度 tasklet (把 tasklet 放入链表,并且设置它的 TASKLET_STATE_SCHED 状态为1)
在这里插入图片描述
4.删除
在这里插入图片描述

工作队列

使用tasklet中断下半部时,在执行中断服务函数期间,app的其它线程得不到执行,如果中断执行时间过长,这样会影响程序,这时候我们就需要让下半中断变成一个线程,让其它线程也够被调度,这时候工作队列就满足我们的需求。

在内核中,我们并不需要自己去创建线程,可以使用“工作队列”(workqueue)。内核初始化工作队列是,就为它创建了内核线程。以后我们要使用“工作队列”,只需要把“工作”放入“工作队列中”,对应的内核线程就会取出“工作”,执行里面的函数。

使用流程

1.创建一个struct work_struct 类型的变量,把它放结构体里。(面向对象编程)
在这里插入图片描述
2.初始化work_struct 结构体
在这里插入图片描述
3.使用 work (调用 schedule_work 时,就会把 work_struct 结构体放入队列中,并唤醒对应的内核线程。内核线程就会从队列里把 work_struct 结构体取出来,执行
里面的函数)在这里插入图片描述

中断线程化处理

使用工作队列的时候,在单cpu核板子里,因为只有一个内核线程,如果创建了多个struct work_struct,并且 其中对应的线程处理函数都要执行,但是只有一个内核线程,这时这些线程处理函数只能排队,一个一个执行,不能并发的执行,为了解决这一问题,就要对中断进行线程化处理。为每一个中断创建自己的线程,来执行需要时间较长的程序。

使用流程

1.定义一下线程处理函数
在这里插入图片描述
2.调用request_threaded_irq 为对应的中断,注册中断上半部函数(可以不定义)和线程处理函数。当发送对应中断时,会先去执行中断上半部函数(没有的话,内核会默认提供irq_default_primary_handler函数),然后执行线程处理函数。
在这里插入图片描述
注意,自己定义的中断上部函数里,返回值一定要改为IRQ_WAKE_THREAD,否则不会执行线程处理函数。
在这里插入图片描述

3.注销中断

在这里插入图片描述

这篇关于驱动基石之_tasklet中断下半部_工作队列_中断线程化处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386352

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构