【Linux】内核线程创建 kthread_run 函数和内核中断

kthread_run函数详解

以PCIE的热插拔内核线程创建为例说明
注意:内核线程和RTOS的线程略有不同,这里Linux上创建以后直接运行,RTOS上有的是需要加入到调度队列中后才会执行,比如RT-Thread的系统
在这里插入图片描述

kthread_run 是 Linux 内核中的一个函数,用于创建和运行内核线程(Kernel Thread)。

在 Linux 内核中,线程是一种轻量级的执行单位,可以独立运行并共享进程资源。与用户空间线程(User Space Thread)不同,内核线程运行在内核态,具有更高的特权级别和更广泛的系统资源访问权限。

kthread_run 函数的作用是创建一个新的内核线程,并自动将其添加到内核线程调度器中进行调度。它接受两个参数:threadfn 和 data。

threadfn 是一个函数指针,表示要在新线程中执行的函数。这个函数应该没有任何参数,并且返回类型为 int。通常,开发者会在 threadfn 函数中编写新线程需要执行的代码逻辑。

data 是一个指针,表示传递给 threadfn 函数的参数。开发者可以使用 data 参数来传递自定义的数据结构或其他信息给新线程。

kthread_run 函数会创建一个新的内核线程,并将指定的 threadfn 函数作为新线程的入口点。然后,新线程会开始执行 threadfn 函数中的代码。开发者可以在 threadfn 中编写自定义的逻辑,例如执行某些任务、处理中断、驱动硬件等。

kthread_run 是用于创建并运行内核线程的一个函数,它接受一个函数指针作为线程的入口,并可以传递参数给线程函数。通过使用 kthread_run,开发者可以在 Linux 内核中创建和管理自己的线程,实现各种类型的异步任务处理和并发操作。

schedule_timeout_idle 空闲状态下执行超时调度函数

作用

通常情况下,当一个任务调用 schedule_timeout 函数进行休眠时,它将被视为负载贡献者,即会对系统的负载平均值(load average)产生影响。然而,有些特定的任务可能希望在休眠期间不被计算为系统负载的一部分;

/*
 * Like schedule_timeout_uninterruptible(), except this task will not contribute
 * to load average.
 */
signed long __sched schedule_timeout_idle(signed long timeout)
{
	__set_current_state(TASK_IDLE);
	return schedule_timeout(timeout);
}

schedule_timeout_idle 函数中,首先调用 __set_current_state 函数将当前任务的状态设置为 TASK_IDLE,表示该任务处于空闲状态。然后,通过调用 schedule_timeout 函数,在指定的超时时间内进行休眠。

schedule_timeout 函数会将当前任务挂起,并根据指定的超时时间(以嘀嗒数为单位)来决定任务何时被唤醒。当超时时间到达或者有其他引起任务唤醒的事件发生时,被挂起的任务将被重新调度执行。

schedule_timeout_idle 函数是一个特殊的休眠函数,它将当前任务的状态设置为 TASK_IDLE,使得任务在休眠期间不会被计算为系统负载的一部分。然后,它与标准的 schedule_timeout 函数一起使用,实现在指定超时时间内进行休眠并重新调度的功能。

request_threaded_irq 请求线程中断

用于请求一个带有线程化处理的中断

在这里插入图片描述

 */
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
			 irq_handler_t thread_fn, unsigned long irqflags,
			 const char *devname, void *dev_id)
{

参数说明如下:

irq:要请求的中断号。 handler:指向顶半部(top half)中断处理程序的函数指针。当中断被触发时,由内核调用此处理程序来进行快速的中断处理操作。
thread_fn:指向底半部(bottom half)中断处理程序的函数指针。当中断被触发时,内核将创建一个内核线程,并调度执行该处理程序。这个线程会在中断上下文之外运行,可以执行一些较长或需要睡眠的处理操作。
irqflags:中断标志,用于指定中断请求的属性和行为。可以使用预定义的中断标志宏来设置。
devname:设备名称,用于标识请求中断的设备。 dev_id:设备ID,将传递给中断处理程序的参数。
request_threaded_irq 函数用于请求一个带有线程化处理的中断,并将中断处理函数 handler 和底半部处理函数
thread_fn分别关联到该中断上。这样,在中断触发时,首先会调用顶半部处理程序进行快速的中断响应,然后内核会创建一个内核线程,并调度执行底半部处理程序,以完成较长或需要睡眠的处理操作。

这种线程化中断处理机制可以提高中断处理的实时性和可伸缩性,使得中断处理函数能够更灵活地执行复杂的操作而不阻塞其他重要任务的执行。

共享中断的限制和注意事项

在这里插入图片描述

1、 共享中断需要传递一个真正的设备ID(dev-ID)作为参数。如果没有提供真实的设备ID,后续将难以确定哪个中断对应于哪个设备,可能会导致中断释放逻辑等出现问题。

2、 禁用自动使能(auto enable)与共享中断不兼容。在禁用状态下,共享中断可能会请求启用,然后永远等待中断的到来,从而导致问题。

3、 IRQF_COND_SUSPEND 只有在共享中断时才有意义,并且不能与 IRQF_NO_SUSPEND 同时设置。IRQF_COND_SUSPEND 是用于中断在挂起(suspend)期间的条件处理,它表示仅当某些条件满足时,中断才会被挂起。而 IRQF_NO_SUSPEND 表示中断不会挂起。

以上注释说明了共享中断的一些限制和使用注意事项。要确保共享中断的正确性和可靠性,需要满足这些要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/58809.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac端口扫描工具

端口扫描工具 Mac内置了一个网络工具 网络使用工具 按住 Command 空格 然后搜索 “网络实用工具” 或 “Network Utility” 即可 域名/ip转换Lookup ping功能 端口扫描 https://zhhll.icu/2022/Mac/端口扫描工具/ 本文由 mdnice 多平台发布

关于win11 debian wsl 子系统安装启动docker一直starting,无法启动

首先我先说明,我的步骤都是按照官网步骤来的 通过官网的操作步骤 通过测试命令 sudo docker run hello-world得到下面的命令,我们通过启动命令 sudo service docker start 执行结果如下图 也就是说无法启动,一直显示在启动中 遇到这种情况…

基于ARM+FPGA的驱控一体机器人控制器设计

目前市场上工业机器人,数控机床等多轴运动控制系统普遍采用运动控制器加 伺服驱动器的分布式控制方式。在这种控制方式中,控制器一方面完成人机交互,另 一方面进行 NC 代码的解释执行,插补运算,继而将计算出来的位…

Go项目实现日志按时间及文件大小切割并压缩

关于日志的一些问题: 单个文件过大会影响写入效率,所以会做拆分,但是到多大拆分? 最多保留几个日志文件?最多保留多少天,要不要做压缩处理? 一般都使用 lumberjack[1]这个库完成上述这些操作 lumberjack //info文件wr…

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务 em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目…

弱监督语义分割伪标签可视化(把单通道灰度图转为voc格式语义分割标签的彩色形式)

一、目的 以图片2007_001960为例,voc数据集中的原图和对应的语义分割标签分别如下: 图1 图2 图像级标签WSSS任务第一阶段最后生成的pseudo mask如下: 图3 我们的…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报3

天气(自然现象) 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象,即某瞬时内大气中各种气象要素(如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

react中PureComponent的理解与使用

一、作用 它是一个纯组件,会做一个数据的浅比较,当props和state没改变的时候,不会render重新渲染, 改变后才会render重新渲染,提高性能。 二、使用 三、注意 它不能和shouldComponentUpdate生命周期同时使用。因为它…

如何获取最新的底图边线数据(高德)

由于近期的大屏项目需要地图的边界线的数据,找了很多方式,都有局限性,就是不能保证是最新的,所以使用高德地图提供的边线数据,那就肯定是最新的了,之前仔细看文档,现在仔细看了,才发…

【云原生】k8s中Contrainer 生命周期回调/策略/指针学习

个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 容器生命周期 2 容器生命周期回调/事件/钩子 3 容器重启策略 4 自定义容器启动命令 5 容器探针 1 容器生命周期 Kubernetes 会跟踪 Pod 中每个容器的状态&am…

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件,替换某个值 直接上代码,替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…

【Spring练习项目】博客系统

目录 1.项目展示2.项目结构设计3.项目功能设计4 数据库准备4.1 建表4.2 DB相关数据 5.项目模块6.添加项目公共模块6.1 common6.2 实现前端界面 7.功能实现7.1实现博客列表约定前后端交互接口实现服务器代码实现客户端代码 7.2实现博客详情约定前后端交互接口实现服务器代码实现…

基于图片、无人机、摄像头拍摄进行智能检测功能

根据要求进行无人机拍摄的视频或图片进行智能识别,开发过程需要事项 1、根据图片案例进行标记,进行模型训练 2、视频模型训练 开发语言为python 根据需求功能进行测试结果如下 根据车辆识别标记进行的测试结果截图 测经过查看视频 8月1日

opencv-33 图像平滑处理-中值滤波cv2.medianBlur()

中值滤波是一种常见的图像处理滤波技术,用于去除图像中的噪声。它的原理是用一个滑动窗口(也称为卷积核)在图像上移动,对窗口中的像素值进行排序,然后用窗口中像素值的中值来替换中心像素的值。这样,中值滤…

【二等奖方案】Web攻击检测与分类识别赛题「机器学习」团队解题思路

2022 CCF BDCI 数字安全公开赛 赛题「Web攻击检测与分类识别」 地址:http://go.datafountain.cn/4Zj 机器学习战队 获奖方案 团队简介 我们团队由五名成员组成,对机器学习都非常感兴趣,同时在机器学习领域有着丰富的实战经验&#xff0c…

LeetCode 42. 接雨水(动态规划 / 单调栈)

题目: 链接:LeetCode 42. 接雨水 难度:困难 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2…

爆肝整理,Postman接口测试-参数关联实战(详细步骤)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试什么时候…

ES6及以上新特性

ES6(ECMAScript 2015)及以上版本引入了许多新特性,每个版本都有不同的增强和改进。以下是 ES6 及以上版本的新特性的详细描述: ES6(ECMAScript 2015): let 和 const 声明:引入块级作…

瑞吉外卖实战-笔记

软件开发的流程 角色分工 软件环境 开发环境的搭建 数据库环境 maven环境 1.创建完成后&#xff0c;需要检查一下编码、maven仓库、jdk等 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</a…

pytorch 中 view 和reshape的区别

在 PyTorch&#xff08;一个流行的深度学习框架&#xff09;中&#xff0c; reshape 和 view 都是用于改变张量&#xff08;tensor&#xff09;形状的方法&#xff0c;但它们在实现方式和使用上有一些区别。下面是它们之间的主要区别&#xff1a; 实现方式&#xff1a; reshap…