CN112433835A - 一种基于Linux系统的中断处理方法及装置 - Google Patents
一种基于Linux系统的中断处理方法及装置 Download PDFInfo
- Publication number
- CN112433835A CN112433835A CN202011318921.4A CN202011318921A CN112433835A CN 112433835 A CN112433835 A CN 112433835A CN 202011318921 A CN202011318921 A CN 202011318921A CN 112433835 A CN112433835 A CN 112433835A
- Authority
- CN
- China
- Prior art keywords
- interrupt
- mvb
- irq
- identifier
- preset
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4812—Task transfer initiation or dispatching by interrupt, e.g. masked
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Bus Control (AREA)
Abstract
本发明公开一种基于Linux系统的中断处理方法及装置,包括:判断是否将中断注册申请发送给函数request_mvb_irq;若为是,则设置中断号对应的中断处理程序的关键属性,关键属性包括非线程化属性和非共享属性;设置中断号对应的非线程化标识符和非共享标识符;判断中断号对应的标识符是否包括非线程化标识符和非共享标识符;若为是,则取消针对中断处理程序的线程化处理,以及取消对中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,在中断上下文中,执行所述中断处理程序。本发明能够保证实时硬件设备发起的中断处理程序被立即执行,避免由于这类中断处理程序被延迟执行而造成系统损害。
Description
技术领域
本发明涉及计算机技术领域,具体而言,涉及一种基于Linux系统的中断处理方法及装置。
背景技术
在Linux系统中,为了避免中断处理程序出现后会打断实时进程的正常运行,可以将中断处理程序加入中断线程,也即实现中断线程化处理,进而再将中断线程加入实时调度队列。实时调度队列中包括中断线程和其他任务,且实时调度队列是先进先出的队列,实时调度队列中的中断线程或任务按时间先后顺序进行执行。
但是,在基于Linux系统的列车通信网络中,实时硬件设备发起的中断处理程序需要立即被执行。若实时硬件设备发起的中断处理程序加入中断线程,且该中断线程的前面排有其他中断线程或任务,则实时硬件设备发起的中断处理程序需要等待前面的中断线程或任务执行完毕后才能被执行。这样会造成系统延迟,导致数据丢失甚至系统崩溃。
发明内容
本发明提供一种基于Linux系统的中断处理方法及装置,用以克服现有技术中存在的至少一个技术问题。
根据本发明实施例的第一方面,提供一种基于Linux系统的中断处理方法,包括:函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq;若为是,则所述函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,所述关键属性包括非线程化属性和非共享属性;预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,所述非共享标识符用于标识取消针对中断描述符数组 irq_desc的遍历处理;内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符;判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;若为是,则通过预设的函数handle_mvb_irq_percpu,取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc 中的中断处理程序描述符irqaction的遍历处理,其中,所述中断描述符数组 irq_desc与所述硬件设备连接的中断请求线对应;在中断上下文中,执行所述中断处理程序。
根据本发明实施例的第二方面,提供一种基于Linux系统的中断处理装置,所述装置包括:第一判断模块、第一设置模块、第二设置模块、查询模块、第二判断模块、取消模块和第一执行模块;所述第一判断模块,用于由函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数 request_mvb_irq;所述第一设置模块,用于若将所述中断注册申请发送给预设的函数request_mvb_irq,则所述函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,所述关键属性包括非线程化属性和非共享属性;所述第二设置模块,用于由预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,所述非共享标识符用于标识取消针对中断描述符数组irq_desc的遍历处理;所述查询模块,用于由内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符;所述第二判断模块,用于判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;所述取消模块,用于若查询到的所述中断号对应的标识符包括所述非线程化标识符和所述非共享标识符,则通过预设的函数handle_mvb_irq_percpu,取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,其中,所述中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应;所述第一执行模块,用于在中断上下文中,执行所述中断处理程序。
本发明实施例的创新点包括:
1、并行中断机制。在Linux系统中,针对不同硬件设备发起的中断处理程序,并行两种中断处理方式:一是针对实时性要求不高的普通硬件设备发起的中断处理程序,仍使用现有的线程化处理流程;二是针对实时性要求较高的硬件设备发起的中断处理程序,在Linux系统原有中断处理流程的基础上,分出一个特殊的处理子流程,通过新建函数request_mvb_irq、 setup_mvb_irq和handle_mvb_irq_percpu,实现对这类中断处理程序的实时处理,使得这类中断处理程序不再被线程化处理,也就是说,实时硬件设备发起的中断处理程序不再进入实时调度队列,保证这类中断处理程序能够被立即执行,避免由于这类中断处理程序被延迟执行而造成系统损害,是本发明实施例的创新点之一。
2、新建函数request_mvb_irq,能够设置中断号对应的关键属性,关键属性包括非线程化属性和非共享属性,以及构建中断处理程序描述符irqaction 结构体,以便后续函数基于中断号对应的关键属性设置标识符,以及在执行中断处理程序时能够从中断处理程序描述符irqaction中获取中断执行信息,是本发明实施例的创新点之一。
3、新建函数setup_mvb_irq,能够根据新建函数request_mvb_irq设置的中断号对应的关键属性,设置中断号对应的非线性化标识符和非共享标识符,以便后续函数能够根据非线性化标识符和非共享标识符,对中断处理程序进行非线程化和非共享处理,是本发明实施例的创新点之一。
4、新建函数handle_mvb_irq_percpu,能够根据新建函数setup_mvb_irq 设置的非线性化标识符和非共享标识符,对实时性要求较高的硬件设备发起的中断处理程序进行实时处理。
5、实时性要求较高的硬件设备通过一根独立的中断请求线与中断控制器连接,也就是说,一根中断请求线中只传输一个硬件设备发起的中断处理请求;因此,所述中断请求线对应的预设的中断描述符数组irq_desc中,只保存有唯一一个中断处理程序描述符irqaction,所述中断处理程序描述符 irqaction保存所述硬件设备发起的中断处理请求的中断执行信息;这样,在执行中断处理请求时,无需遍历预设的中断描述符数组irq_desc,可以从预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction中,获取中断处理程序的中断执行信息,是本发明实施例的创新点之一。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一个实施例的示意图;
图2为本发明中函数request_mvb_irq处理流程的示意图;
图3为本发明中函数setup_mvb_irq处理流程的示意图;
图4为本发明又一个实施例的示意图;
图5为本发明的整体处理流程的示意图;
图6为本发明的基于Linux系统的中断处理装置的示意图;
图7为本发明再一个实施例的示意图;
图8为本发明中的双状态分时示意图;
图9为本发明中MVB调度类的预设方法的流程示意图;
图10为本发明中添加MVB调度类后的结构示意图;
图11为本发明再一个实施例的示意图;
图12为本发明再一个实施例的示意图;
图13为本发明再一个实施例的示意图;
图14为本发明再一个实施例的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,本发明实施例及附图中的术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
在Linux系统中,为了避免中断处理程序出现后会打断实时进程的正常运行,可以将中断处理程序加入中断线程,也即实现中断线程化处理,进而再将中断线程加入实时调度队列。实时调度队列中包括中断线程和其他任务,且实时调度队列是先进先出的队列,实时调度队列中的中断线程或任务按时间先后顺序进行执行。
但是,在基于Linux系统的列车通信网络中,实时硬件设备发起的中断处理程序需要立即被执行。若实时硬件设备发起的中断处理程序加入中断线程,且该中断线程的前面排有其他中断线程或任务,则实时硬件设备发起的中断处理程序需要等待前面的中断线程或任务执行完毕后才能被执行。这样会造成系统延迟,导致数据丢失甚至系统崩溃。
其中,列车通信网络(Train Communication Network)是国际电工委员会与国际铁路联盟与1988年制定的列车通讯协议。列车通信网络中的网络数据需要实时及准确传输,以保证列车的正常运行。实时硬件设备可以包括多功能车辆总线(MultifunctionVehicle Bus,MVB)板卡和绞线式列车总线(Wire Train Bus,WTB)板卡。
为了解决上述问题,本发明提出了一种基于Linux系统的中断处理方法及装置,通过并行中断机制,保证实时硬件设备发起的中断处理程序能够被立即执行。
下面对本发明提出的一种基于Linux系统的中断处理方法进行说明。
参考图1,图1为本发明一个实施例的示意图。如图1所示,基于Linux 系统的中断处理方法包括如下处理步骤:
步骤101,函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq;若为是,则执行步骤103。
在本步骤中,函数request_irq在接收到硬件设备发起的中断注册申请之后,可以根据中断注册申请携带的中断号,判断发起中断注册申请的硬件设备是否为预设的实时硬件设备。
若硬件设备为预设的实时硬件设备,则可以将中断注册申请发送给预设的函数request_mvb_irq,以便通过后续步骤实现非线程化处理。
若硬件设备不为预设的实时硬件设备,则按照Linux系统中现有的针对中断处理程序的处理流程进行处理。
步骤103,所述函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,执行步骤105。
其中,所述关键属性包括非线程化属性和非共享属性。
在本步骤中,函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,具体包括非线程化属性和非共享属性,以便后续步骤根据关键属性对该中断处理程序。
需要说明的是,函数request_mvb_irq是本发明新建的,是申请非线程化中断的实际执行函数。除了设置中断号对应的中断处理程序的关键属性,函数request_mvb_irq还执行如下处理:
1)检查中断号是否是为分配的中断号,若不是,则返回错误值。
具体的,可以检测接收到的中断注册申请携带的中断号是否是预先分配给实时中断设备的,若为是,则继续后续流程,若为否,则处理中断,返回错误值。
2)根据中断注册申请携带的参数构建irqaction结构体。
其中,中断注册申请携带的主要参数包括中断号irq和执行中断处理程序的函数handler。
具体的,可以为中断注册申请创建irqaction结构体,将从中断注册申请中获取的irq和handler等参数,赋值给irqaction结构体中相应的字段。
3)调用函数setup_mvb_irq来设置中断的回调过程。
具体的,当发生指定中断时,将会回调被设置的过程。
4)根据函数setup_mvb_irq的返回结果来判断申请中断是否成功。
函数request_mvb_irq的处理流程可以参考图2,图2为本发明中函数 request_mvb_irq处理流程的示意图。
步骤105,预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,执行步骤107。
其中,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,所述非共享标识符用于标识取消针对中断描述符数组irq_desc 的遍历处理。
在本步骤中,在函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性之后,预设的函数setup_mvb_irq根据关键属性中的非线程化属性,设置所述中断号对应的非线程化标识符,以及根据关键属性中的非共享属性,设置所述中断号对应的非共享标识符,以便后续步骤中根据上述两个标识符,对该中断号对应的中断处理程序进行非线程化处理。
需要说明的是,函数setup_mvb_irq是本发明新建的。除了设置中断号对应的两个标识符,函数setup_mvb_irq还执行如下处理:
1)irq_desc结构体进行验证,以确定参数正确性。
2)判断irq_desc结构体上是否有irqaction结构体,若有,则返回失败。
具体的,表明所述中断请求线对应的预设的中断描述符数组irq_desc 中已经设置了中断处理程序描述符irqaction。
3)设置irq对cpu的亲和性(affinity),以使进程在给定的CPU上尽量长时间地运行而不被迁移到其他处理器。
4)将irqaction结构体放在irq_desc结构体链表最后,以设置所述中断号对应的非线程化标识符。
5)注册相关的proc文件系统节点,以便获取系统内核数据。
函数setup_mvb_irq的处理流程可以参考图3,图3为本发明中函数setup- _mvb_irq处理流程的示意图。
步骤107,内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符,执行步骤 109。
在本步骤中,当硬件设备发起中断处理程序后,内核可以调用函数 do_IRQ进行处理,具体的,可以查询所述中断处理程序携带的中断号对应的标识符,以便后续步骤可以根据标识符,判断是否对中断处理程序进行非线程化处理。
步骤109,判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;若为是,则执行步骤111。
在本步骤中,函数do_IRQ可以判断查询到的中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符,若为是,则可以确定所述中断处理程序的由实施硬件设备发起的,可以对所述中断处理程序进行非线程化处理。
步骤111,通过预设的函数handle_mvb_irq_percpu,取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,执行步骤113。
其中,所述中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应。
在本步骤中,由于所述中断号对应的标识符包括所述非线程化标识符,说明携带该中断号的中断处理程序是实时硬件设备,因此,函数 handle_mvb_irq_percpu取消针对所述中断处理程序的线程化处理,以便该中断处理程序能够被立即执行。
由于所述中断号对应的标识符包括所述非共享标识符,因此函数 handle_mvb_irq_percpu取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理。
需要说明的是,一个中断请求线由一个中断描述符数组irq_desc来表示,中断描述符数组irq_desc中的中断处理程序描述符irqaction用于保存硬件设备的中断执行信息,一个中断处理程序描述符irqaction存储一个硬件设备的中断执行信息。
当一个中断请求线连接多个硬件设备时,该中断请求线对应的中断描述符数组irq_desc中存在多个中断处理程序描述符irqaction,每个中断处理程序描述符irqaction保存有一个硬件设备的中断执行信息。因此,当需要获取其中一个硬件设备的中断执行信息时,需要遍历中断描述符数组irq_desc中的多个中断处理程序描述符irqaction。
当一个中断请求线连接一个硬件设备时,该中断请求线对应的中断描述符数组irq_desc中只存在一个中断处理程序描述符irqaction,这个中断处理程序描述符irqaction保存有中断请求线连接的唯一一个硬件设备的中断执行信息,因此,当需要获取其中一个硬件设备的中断执行信息时,无需遍历中断描述符数组irq_desc中的多个中断处理程序描述符irqaction就能够找到这个硬件设备的中断执行信息。
在本发明中,一根中断请求线连接一个实时硬件设备,那么,该中断请求线对应的中断描述符数组irq_desc中只存在一个中断处理程序描述符 irqaction,因此,可以取消对中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,可以从预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction中,获取中断处理程序的中断执行信息。
步骤113,在中断上下文中,执行所述中断处理程序。
在本步骤中,非线程化的中断处理程序可以通过调用action->handler,相当于在中断上下文执行中断处理程序,若返回值为IRQ_HANDLED,则表示中断处理程序已经处理结束,直接结束函数。
其中,若返回值为IRQ_NONE,则表示中断处理程序不存在;若返回值为IRQ_HANDLED,则表示中断处理程序已经被正确处理;若返回值为 IRQ_WAKE_THREAD,则表示中断处理程序已经被线程化处理,需要唤醒对应的中断线程。
可见,本发明提出的基于Linux系统的中断处理方法中,通过并行中断机制,对实时硬件设备和普通硬件设备发起的中断处理程序,执行不同的处理方式,不再对实时硬件设备发起的中断处理程序进行中断线程化处理,也就是说,实时硬件设备发起的中断处理程序不再进入实时调度队列,避免实时调度队列存在其他中断线程或任务,导致实时硬件设备发起的中断处理程序需要等待前面的中断线程或任务执行完毕后才能被执行,保证实时硬件设备发起的中断处理程序能够被立即执行,保证系统的稳定运行。
又一种实施例中,本发明又提出的一种基于Linux系统的中断处理方法。参考图4,图4为本发明又一个实施例的示意图。如图4所示,基于Linux 系统的中断处理方法包括如下处理步骤:
步骤401,函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断所述中断注册申请携带的中断号,是否为预设的非线程化中断号;若为是,则执行步骤403,若为否,则执行步骤406。
需要说明的是,可以对实时硬件设备分配预设的非线程化中断号,这样,根据硬件设备发起的中断注册申请所携带的中断号,就能够判断出发起中断注册申请的硬件设备是否为实时硬件设备,进而确定是否需要进行非线程化处理,若要进行非线程化处理,就需要将中断注册申请发送给预设的函数 request_mvb_irq来处理。
步骤403,将所述中断注册申请发送给预设的函数request_mvb_irq,通过所述函数request_mvb_irq,设置所述中断号对应的中断处理程序的关键属性,执行步骤405。
其中,所述关键属性包括非线程化属性和非共享属性。
步骤405,预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,执行步骤407。
其中,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,所述非共享标识符用于标识取消针对中断描述符数组irq_desc 的遍历处理。
步骤406,将所述中断注册申请发送给函数request_threaded_irq,通过所述函数request_threaded_irq,设置所述中断号对应的线程化标识符和共享标识符,执行步骤407。
在本步骤,若所述中断注册申请携带的中断号不为预设的非线程化中断号,则说明发起中断注册申请的硬件设备为普通设备,不为实时硬件设备,可以对中断处理程序进行现有的线程化处理,并且,通常情况下,多个普通设备共享一条中断请求线。因此,可以将所述中断注册申请发送给函数 request_threaded_irq,通过所述函数request_threaded_irq,设置所述中断号对应的线程化标识符和共享标识符,以便后续步骤对中断处理程序进行线程化处理,以及遍历中断描述符数组irq_desc中的多个中断处理程序描述符irqaction。
步骤407,内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符,执行步骤 409。
步骤409,判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;若为是,则执行步骤411,若为否,则执行步骤415。
步骤411,通过预设的函数handle_mvb_irq_percpu,根据所述中断号对应非线程化标识符,不将所述中断处理程序放入预设的中断线程;以及根据所述中断号对应非共享标识符,从预设的中断描述符数组唯一一个中断处理程序描述符irqaction中,读取所述中断处理程序的中断执行信息,执行步骤 413。
其中,所述预设的中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应。
在本步骤中,若查询到所述中断号对应标识符包括非线程化标识符和非共享标识符,则可以根据标识符,通过预设的函数handle_mvb_irq_percpu,根据所述中断号对应非线程化标识符,不将所述中断处理程序放入预设的中断线程,以便对中断处理程序进行非线程化处理;以及根据所述中断号对应非共享标识符,从预设的中断描述符数组irq_desc唯一一个中断处理程序描述符irqaction中,读取所述中断处理程序的中断执行信息,免去遍历中断描述符数组irq_desc的处理过程。
步骤413,根据所述中断执行信息,在中断上下文中执行所述中断处理程序。
步骤415,确定查询到所述中断号对应标识符包括线程化标识符和共享标识符;通过预设的函数handle_irq_event_percpu,对所述中断处理程序进行线程化处理,以及对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction进行遍历处理,获取待执行的中断处理程序的中断执行信息,执行步骤417。
其中,所述预设的中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应。
在本步骤中,由于中断处理程序是普通设备发起的,且所述中断号对应标识符包括线程化标识符和共享标识符,可以按照现有的线程化流程对中断处理程序进行处理。
步骤417,根据所述中断执行信息,在线程上下文中执行所述中断处理程序。
在本步骤中,对于线程化的中断处理程序,可以根据中断执行信息,在线程上下文中执行所述中断处理程序。
需要说明的是,在现有的Linux系统中,实际是由函数handle_irq_event 对中断处理程序进行处理,函数handle_irq_event将接收到的中断处理程序设置为正在处理过程中(IRQD_IRQ_INPROGRESS),然后调用函数 handle_irq_event_percpu函数来执行中断处理程序。函数 handle_irq_event_percpu会找到该中断处理程序对应的irq_desc结构体,通过遍历irq_desc结构体中的每一个irqaction结构体找到发起该中断处理程序的硬件设备对应的irqaction结构体,根据该中断处理程序的硬件设备对应的 irqaction结构体中保存的信息,唤醒该中断处理程序所在的中断线程进行调度。
还需要说明的是,并行中断机制的技术效果如下:
1)保证实时硬件设备发起的中断处理程序的执行属于硬件中断上下文,不被线程化,这样避免设备中断的等待。
2)保证实时硬件设备发起的中断处理程序不会被屏蔽。
3)提供单独的IRQ线给实时硬件设备,不与其它设备驱动程序进行共享。
4)保证实时硬件设备发起的中断处理程序会被立即执行。
并行中断机制本质是为实时硬件设备提供另外一套中断申请和执行程序,保证基于Linux系统的列车通信网络中,实时硬件设备发起的中断处理程序的执行满足入表1所示的条件:
表1
其中,原中断机制是指现有的Linux系统中的中断机制。
在针对实时硬件设备发起的中断处理程序的处理中,使用函数 request_mvb_irq来作为新的申请接口,进行非线程化中断的设置与申请。并且内部会调用函数setup_mvb_irq来进行更深层次的设置。在中断处理过程中,并行中断机制采用handle_mvb_event_percpu函数来处理实时硬件设备发起的中断处理程序。
基于本发明的针对中断处理程序的整体处理流程可以参考图5,图5为本发明的整体处理流程的示意图。如图5所示,左边是针对普通设备发起的中断处理程序的处理流程,右边是针对实时硬件设备发起的中断处理程序的处理流程。
再一种实施例中,本发明提出的一种基于Linux系统的中断处理装置。参考图6,图6为本发明的基于Linux系统的中断处理装置的示意图。如图6 所示,基于Linux系统的中断处理装置60包括:
第一判断模块601、第一设置模块602、第二设置模块603、查询模块604、第二判断模块605、取消模块606和第一执行模块607;
所述第一判断模块601,用于由函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq;
所述第一设置模块602,用于若将所述中断注册申请发送给预设的函数 request_mvb_irq,则所述函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,所述关键属性包括非线程化属性和非共享属性;
所述第二设置模块603,用于由预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,所述非共享标识符用于标识取消针对中断描述符数组irq_desc的遍历处理;
所述查询模块604,用于由内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符;
所述第二判断模块605,用于判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;
所述取消模块606,用于若查询到的所述中断号对应的标识符包括所述非线程化标识符和所述非共享标识符,则通过预设的函数 handle_mvb_irq_percpu,取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,其中,所述中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应;
所述第一执行模块607,用于在中断上下文中,执行所述中断处理程序。
可选的,所述第一判断模块601,具体用于判断所述中断注册申请携带的中断号,是否为预设的非线程化中断号;所述第一设置模块,具体用于若所述中断注册申请携带的中断号是预设的非线程化中断号,则将所述中断注册申请发送给预设的函数request_mvb_irq,通过所述函数request_mvb_irq,设置所述中断号对应的中断处理程序的关键属性。
可选的,所述取消模块606,具体用于根据所述中断号对应非线程化标识符,不将所述中断处理程序放入预设的中断线程;以及根据所述中断号对应非共享标识符,从预设的中断描述符数组唯一一个中断处理程序描述符 irqaction中,读取所述中断处理程序的中断执行信息;所述第一执行模块,具体用于根据所述中断执行信息,在中断上下文中执行所述中断处理程序。
可选的,所述装置还包括:第三设置模块,用于若不将所述中断注册申请发送给预设的函数request_mvb_irq,则将所述中断注册申请发送给函数 request_threaded_irq,通过所述函数request_threaded_irq,设置所述中断号对应的线程化标识符和共享标识符。
可选的,所述装置还包括:处理模块和第二执行模块;
所述处理模块,用于若所述中断号对应的标识符包括所述非线程化标识符和所述非共享标识符,则确定查询到所述中断号对应标识符包括线程化标识符和共享标识符;通过预设的函数handle_irq_event_percpu,对所述中断处理程序进行线程化处理,以及对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction进行遍历处理,获取待执行的中断处理程序的中断执行信息,其中,所述预设的中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应;所述第二执行模块,用于根据所述中断执行信息,在线程上下文中执行所述中断处理程序。
可见,本发明提出的基于Linux系统的中断处理装置中,通过并行中断机制,对实时硬件设备和普通硬件设备发起的中断处理程序,执行不同的处理方式,不再对实时硬件设备发起的中断处理程序进行中断线程化处理,也就是说,实时硬件设备发起的中断处理程序不再进入实时调度队列,避免实时调度队列存在其他中断线程或任务,导致实时硬件设备发起的中断处理程序需要等待前面的中断线程或任务执行完毕后才能被执行,保证实时硬件设备发起的中断处理程序能够被立即执行,保证系统的稳定运行。
实际应用中,对于基于Linux系统的列车通信网络中的MVB板卡,除了 MVB板卡发起的中断处理程序必须立即执行以外,MVB板卡发出的其他 MVB任务,也必须在每个预设的基本周期开始的时候执行完成,比如,MVB 板卡发起的数据采集任务,若MVB任务没有按时完成,则也会影响系统的正常运行。
而在现有的Linux系统中,是有调度器按照各调度类的优先级,选取待执行的调度类,进而由待执行的调度类执行自身就绪队列中的任务。这样, MVB任务可能与调度类安排执行的其他任务发生冲突,导致MVB任务无法按时完成,影响系统的正常运行。
为了解决上述问题,本发明再提出一种基于Linux系统的调度处理方法,能够在基于Linux系统的列车通信网络中,保证MVB任务能够被按时稳定的执行。
结合基于Linux系统的中断处理方法及装置,本发明能够保证在基于Linux系统的列车通信网络中,MVB板卡发出的指令,包括中断处理程序和 MVB任务能够被及时和按时完成,以便维护列车通信网络的稳定性,保证列车通信网络的稳定运行。
下面对本发明提出的一种基于Linux系统的调度处理方法进行详细说明。
参考图7,图7为本发明再一个实施例的示意图。如图7所示,基于Linux 系统的调度处理方法包括如下处理步骤:
步骤1001,在内核启动后,对预设的标记变量MVB_hrtimer_started进行初始化设置。
在步骤中,在内核启动之后,在kernel/sched/core.c文件中,对预设的标记变量MVB_hrtimer_started进行初始化设置,其中,所述标记变量 MVB_hrtimer_started的初始值不为启动标识符。
步骤1003,当预设的高精度定时器函数MVB_hrtimer启动时,将所述标记变量MVB_hrtimer_started置为启动标识符。
在本步骤中,当Linux系统中预设的高精度定时器函数MVB_hrtimer启动时,可以将预设的标记变量MVB_hrtimer_started置为启动标识符,以便可以根据预设的标记变量MVB_hrtimer_started的值,确定预设的高精度定时器函数MVB_hrtimer是否启动。
其中,hrtimer是高精度时钟技术手段,可以在内核中提供高达纳秒级的精度,以满足对时间有较高要求的应用或者驱动程序。
步骤1005,判断所述标记变量MVB_hrtimer_started是否为所述启动标识符;若为是,则执行步骤1007,若为否,则执行步骤1006。
在本步骤中,主调度器函数通过判断所述标记变量MVB_hrtimer_started 是否为所述启动标识符,来确定高精度定时器函数MVB_hrtimer是否启动。
若所述标记变量MVB_hrtimer_started为所述启动标识符,则主调度器函数可以确定高精度定时器函数MVB_hrtimer已经启动,可以执行后续步骤。
步骤1006,调用函数hrtimer_init对预设的高精度定时器函数 MVB_hrtimer进行初始化设置,执行步骤1007。
在本步骤中,若所述标记变量MVB_hrtimer_started不为所述启动标识符,则主调度器函数可以确定高精度定时器函数MVB_hrtimer尚未启动,可以调用函数hrtimer_init对高精度定时器函数MVB_hrtimer进行初始化处理,以启动高精度定时器函数MVB_hrtimer。
步骤1007,运行所述高精度定时器函数MVB_hrtimer的回调函数,设置所述回调函数中的MVB定时器的超时时长为第一超时时长,以及将预设的状态变量MVB_status置为MVB时段标识符,执行步骤1009。
其中,所述第一超时时长小于预设的基本周期。
在本步骤中,若确定高精度定时器函数MVB_hrtimer已经启动,则可以运行所述高精度定时器函数MVB_hrtimer的回调函数,以及设置所述回调函数中的MVB定时器的超时时长为第一超时时长。
此外,还可以将预设的状态变量MVB_status置为MVB时段标识符。当预设的状态变量MVB_status为MVB时段标识符时,表示当前处于基本周期中划分给MVB任务的MVB时段。调度器在调度任务时,可以根据MVB时段标识符,确定当前处于基本周期中的MVB时段,进而只会对MVB任务进行调度。
其中,MVB时段标识符具体可以由具体的数值表示,比如,MVB时段标识符为1,后文中提到的Linux时段标识符为0。MVB定时器基于高精度定时器函数MVB_hrtimer,精度较高。
需要说明的是,MVB定时器的第一超时时长小于预设的基本周期。可以理解的,第一超时时长就是一个基本周期中MVB时段的长度。
可选的,所述第一超时时长的预设步骤包括:
计算预设的基本周期与预设的第一超时时长占比的第二乘积,其中,所述第一超时时长占比包括0.3;
将所述第二乘积预设为所述第一超时时长。
具体的,首先,将基本周期与预设的第一超时时长占比相乘,将得到的乘积记为第二乘积,然后,将第二乘积预设为第一超时时长。其中,可以根据MVB任务的运行时间在整个基本周期中的比例,设置第一超时时长占比。
比如,MVB任务的运行时间为整个基本周期的30%,基本周期为2毫秒,可以设置第一超时时长占比为0.3毫秒;那么,计算第一超时时长占比与基本周期的第二乘积0.3×2=0.6毫秒,也即第一超时时长为0.6毫秒。
步骤1009,判断所述MVB定时器是否触发;若为是,执行步骤1011。
其中,所述MVB定时器的超时时长为所述第一超时时长。
在本步骤中,当MVB定时器的超时时长为第一超时时长,且MVB定时器超时,可以认为基本周期中的MVB时段结束,在当前基本周期的接下来的时间中,不再允许执行MVB任务。
由于MVB任务均在MVB时段执行,MVB时段内不允许执行Linux系统中除MVB任务以外的其他普通任务,因此,可以避免MVB任务,与Linux 系统中的其他普通任务发生冲突,保证MVB任务能够被按时完成。
步骤1011,将所述状态变量MVB_status置为Linux时段标识符,以及设置所述回调函数中的MVB定时器的超时时长为第二超时时长。
其中,所述第二超时时长小于所述基本周期,且所述第一超时时长与所述第二超时时长之和等于所述基本周期。
在本步骤中,当MVB定时器的超时时长为第一超时时长,且MVB定时器超时,可以认为基本周期中的MVB时段结束,将所述状态变量MVB_status 置为Linux时段标识符。
当状态变量MVB_status为Linux时段标识符时,表示当前处于基本周期中的Linux时段,Linux时段是指基本周期中划分给Linux系统中的除MVB 任务以外的普通任务执行的时段。调度器在调度任务时,可以根据Linux时段标识符,确定当前处于基本周期中的Linux时段,进而只会对除MVB任务以外的普通任务进行调度。
Linux系统的双状态分时指的就是上述将基本周期划分为MVB时段和 Linux时段,两个时段分别对应两种状态,MVB时段对应MVB状态,由状态变量MVB_status为MVB时段标识符表示,Linux时段对应Linux状态,由状态变量MVB_status为Linux时段标识符表示。在MVB时段,也即MVB 状态中,只允许执行MVB任务,同样的,在Linux时段中,也即Linux状态中,只允许执行Linux系统中的其他普通任务。这样,MVB任务和Linux系统中的其他普通任务能够分时段执行,可以避免MVB任务和Linux系统中的其他普通任务发生冲突,保证MVB任务能够按时完成。
可以参考图8,图8为本发明中的双状态分时示意图。如图8所示,在 Linux系统的双状态分时状态下,基础周期T均划分为MVB时段和Linux时段,每个基础周期T的MVB时段和Linux时段循环交替。
此外,还可以设置所述回调函数中的MVB定时器的超时时长为第二超时时长。
需要说明的是,MVB定时器的第二超时时长小于预设的基本周期,且第一超时时长和第二超时时长加起来为一个完整的基本周期。可以理解的,第二超时时长就是一个基本周期中Linux时段的长度。
具体实施中,可以从一个基本周期中,减掉已确定的第一超时时长,就可以得到第二超时时长。
比如,MVB任务的运行时间为整个基本周期的30%,可以设置基本周期 T中的MVB时段为0.3T,那么,第二超时时长可以为0.7T。
可选的,在步骤1011中,在所述将所述状态变量MVB_status置为Linux 时段标识符的步骤之前,所述方法还包括:
等待一个预设的误差时长,其中,所述误差时长包括1微秒。
在具体实施中,由于MVB定时器在运行过程中存在一定延迟,导致每个MVB时段存在1~2微秒的延迟,进而导致每个基本周期均有1~2微秒的延迟误差。这样,多个基本周期之后,会有1个基本周期被累计的误差时长完全覆盖,造成任务的执行缺少一个基本周期。
比如,每个基本周期都有2微秒的延迟,经过500个基本周期后,会有 1个基本周期被累计的误差时长完全覆盖。
为了解决上述延迟误差的问题,本发明提出了累计误差消除算法。累计误差消除算法是利用拆借的思想,从Linux时段中借出1~2微秒,补充到MVB 时段中。这样既可以保证基本周期的长度不变,也能够保证MVB时段的长度不变。
具体的,在MVB定时器的超时时长为第一超时时长且MVB定时器超之后,在所述将所述状态变量MVB_status置为Linux时段标识符的步骤之前,等待1~2微秒,也就是说,在MVB定时器超时(超时时长为第一超时时长) 之后,将MVB时段延长1~2微秒,然后再将状态变量MVB_status置为Linux 时段标识符。
这样,可以将MVB定时器引起的延迟误差包含在MVB时段中,保证基本周期的时长不变,避免出现在多个基本周期后导致一个基本周期被累计的延迟误差完全覆盖,任务的执行缺少一个基本周期的问题,保证MVB任务能够按时完成。
步骤1013,判断所述MVB定时器是否触发;若为是,则返回执行步骤 1007。
其中,所述MVB定时器的超时时长为所述第二超时时长。
在本步骤中,判断MVB定时器是否超时;若为是,则当MVB定时器的超时时长为第二超时时长,且MVB定时器超时,可以认为基本周期中的Linux 时段结束,在当前基本周期的接下来的时间中,不再允许执行Linux系统中除MVB任务以外的普通任务,Linux时段结束也就是当前基本周期结束,接下来,可以返回执行步骤1007,设置新一个基本周期的MVB时段;若为否,则继续等待,直到MVB定时器超时。
可见,在本发明提出的一种基于Linux系统的调度处理方法中,将基本周期划分为MVB时段和Linux时段,由于Linux系统中除MVB任务以外的普通任务均在Linux时段执行,Linux时段内不允许执行MVB任务,因此,可以避免Linux系统中的其他普通任务,与MVB任务发生冲突,保证MVB 任务能够按时完成。
在系统进行双状态分时后,需要保证在各时段下运行对应的任务。而由于linux系统的调度器在挑选调度任务的时候是按照优先级的顺序,从调度类中选取任务,这样无法保证在MVB状态下,找到MVB任务。
为了解决上述问题,本发明又提出一种基于Linux系统的调度处理方法,可以在内核中为MVB任务添加一个新的调度类,即MVB调度类,将MVB 任务放在MVB调度类的就绪队列中,这样,当在MVB状态下需要调用MVB 任务,只需要从MVB调度类中选取即可。
可选的,参考图9,图9为本发明中MVB调度类的预设方法的流程示意图。如图9所示,MVB调度类的预设方法,包括如下步骤:
步骤2001,构建预设的MVB调度类,以及执行所述MVB调度类的调度操作。
在本步骤中,可以通过新建mvb.c构建预设的MVB调度类,以及执行 MVB调度类的相关调度操作,具体的,调度操作包括:选择MVB调度类的就绪队列中的待执行任务,周期性调度方法,以及将任务入队和出队等。
需要说明的是,MVB调度类的就绪队列为红黑树,可以利用红黑树对任务进行排序,将最早的截止期限的任务放在树的左下方,当选取待执行任务的时候,直接取树的左下方的任务即可。
步骤2003,函数sched_init_smp通过调用函数init_sched_mvb_class,对所述MVB调度类执行初始化处理。
在本步骤中,对MVB调度类的初始化可以在sched/core.c文件中进行,具体的,由函数sched_init_smp调用init_sched_mvb_class函数实现对MVB 调度类的初始化处理。
步骤2005,通过函数sched_setscheduler将MVB任务放入所述MVB调度类的就绪队列。
在本步骤中,可以调用函数sched_setscheduler将任务放进MVB调度类的就绪队列中。
添加MVB调度类后的结构可以参考图10,图10为本发明中添加MVB 调度类后的结构示意图。由图10可知,Linux调度类有5类,MVB调度类只有一类。
参考图11,图11为本发明再一个实施例的示意图。如图11所示,基于 MVB调度类的任务处理流程如下:
步骤4001,判断所述状态变量MVB_status为所述MVB时段标识符,还是所述Linux时段标识符;若所述状态变量MVB_status为所述MVB时段标识符,则执行步骤4003,若所述状态变量MVB_status为所述Linux时段标识符,则执行步骤4007。
在本步骤中,当主调度器需要调度任务时,可以先判断状态变量 MVB_status当前为MVB时段标识符还是Linux时段标识符;若为MVB时段标识符,则说明当前处于MVB状态,可以调度MVB任务,若为Linux时段标识符,则说明当前处于Linux状态,可以调度Linux系统中除MVB任务以外的普通任务。
具体的,在主调度器中,函数pick_next_task负责对任务进行挑选。在未进行双状态分时,只需要遍历调度类确定待执行的调度类,然后将挑选任务的工作交给待执行的调度类去做。而在双状态分时之后,函数pick_next_task 需要判断当前处于哪个状态,再去选择该状态对应的调度类。
步骤4003,选取预设的MVB调度类。
在本步骤中,若所述状态变量MVB_status为所述MVB时段标识符,则说明当前处于MVB状态,可以选取新增的MVB调度类,以便由MVB调度类从自身的就绪队列中,选取MVB任务作为待执行任务,这样可以保证在 MVB状态下只选取MVB调度类,保证MVB任务在MVB时段内按时完成。
步骤4005,所述MVB调度类采用预设的最早截止时间优先(Earliest DeadlineFirst,EDF)算法,从所述MVB调度类的就绪队列中选取待执行的任务。
在本步骤中,MVB调度类采用EDF算法,从自身的就绪队列中的多个 MVB任务中,选取待执行的任务。
可以理解的,MVB任务均放在MVB调度类的就绪队列中,当MVB调度类被选取时,可以从自身的就绪队列中选取MVB任务来执行,保证MVB 任务在MVB时段内按时完成。
步骤4007,从Linux系统中原有的多个调度类中,根据优先级选取一个待执行的调度类,以及从所述待执行的调度类的就绪队列中选取待执行的任务。
在本步骤中,若所述状态变量MVB_status为所述Linux时段标识符,则说明当前处于Linux状态,那么,可以按照Linux系统中原有的选取规则,根据各调度类的优先级顺序,选取一个调度类为待执行调度类,进而从选取的待执行调度类的就绪队列中选取待执行的任务。
Linux系统中原有的调度类为5类,按照优先级顺序,从高到低排序分别为stop_sched_class、dl_sched_class、rt_sched_class、fair_sched_class和 idle_sched_class。
可以理解的,在Linux状态下,只允许上述5类调度类执行任务,不允许MVB调度类执行任务,这样可以保证在只在MVB状态下选取MVB调度类,保证MVB任务在MVB时段内按时完成。
可见,在本发明中,调度器在调度任务时,可以根据状态变量MVB_status 标识的当前状态,选取对应的调度类进行任务执行,MVB状态下选取MVB 调度类,由MVB调度类执行MVB任务,Linux状态下选取Linux调度类,由Linux调度类执行Linux系统中的普通任务;这样,可以保证在MVB状态下选取MVB调度类,由MVB调度类按时执行MVB任务,保证MVB任务在MVB时段内按时完成。
在具体实施中,当MVB任务较为固定时,可以按照固定比例分时,其中,分时在本发明中指的就是将基本周期划分为MVB时段和Linux时段。但是,在系统运行一段时间后,MVB任务可能会发生变化,比如,添加新的 MVB任务,或者替换原有的MVB任务,或者删除某些MVB任务。
具体的,若MVB任务减少,则MVB时段中就会出现较多的空闲时间,导致CPU的利用率降低;若MVB任务增加,则可能造成MVB任务在MVB 时段中无法完成,需要进入下一个基本周期的MVB时段才能继续运行,造成采集数据等MVB任务不能在基本周期内的固定时间完成,会给系统带来难以想象的后果。
可以理解的,在MVB任务可能发生变化的场景下,若仍按照固定比例进行分时,则会降低系统的执行效率,以及影响系统的正常运行。
为了解决上述问题,本发明提出了一种动态分时调整算法,能够根据 MVB调度类的就绪队列中的任务情况,动态调整系统的基本周期,以及所述基本周期中MVB时段的时长,保证MVB任务的按时完成,以及提高CPU 利用率。
参考图12,图12为本发明再一个实施例的示意图。如图12所示,针对图7所示的基于Linux系统的调度处理方法中的基本周期,预设步骤如下:
步骤5001,通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的周期参数。
在本步骤中,可以通过遍历所述MVB调度类的就绪队列中的每个任务,获取每个任务的周期period参数。
需要说明的是,MVB任务的运行是具有一定特点的,均是以周期运行,并且各MVB任务的周期都相同或互为倍数。周期period参数就是MVB任务的周期长度,MVB任务每隔一周期执行一次。
步骤5003,判断所述各MVB任务的周期参数是否相等或存在倍数关系;若为是,则执行步骤5005。
在本步骤中,判断各MVB任务的周期period参数是否相等或存在倍数关系,也就是判断各MVB任务的周期长度是否相等或存在倍数关系,以便根据各MVB任务的周期长度,确定Linux系统的基本周期。
比如,MVB任务A的周期period参数为2毫秒,MVB任务B的周期period参数为4毫秒,MVB任务C的周期period参数为8毫秒;那么,这三个MVB任务的周期period参数存在倍数关系。
步骤5003,判断所述各MVB任务的周期参数是否相等或存在倍数关系;若为是,则执行步骤5005。
在本步骤中,判断各MVB任务的周期period参数是否相等或存在倍数关系,也就是判断各MVB任务的周期长度是否相等或存在倍数关系,以便根据各MVB任务的周期长度,确定Linux系统的基本周期。
比如,MVB任务A的周期period参数为2毫秒,MVB任务B的周期 period参数为4毫秒,MVB任务C的周期period参数为8毫秒;那么,这三个MVB任务的周期period参数存在倍数关系。
步骤5005,将所述各MVB任务的周期参数中的最小值,确定为所述基本周期。
在本步骤中,可以将各MVB任务的周期period参数中的最小值,确定为Linux系统的基本周期。
比如,在步骤5003的例子上继续说明,MVB任务A、MVB任务B和 MVB任务C的周期period参数存在倍数关系,其中,MVB任务A的周期 period参数2毫秒为最小值;那么,可以确定Linux系统的基本周期为2毫秒。
这样,可以根据用户需要,设置调整基本周期的频率,进而实现通过动态调整Linux系统的基本周期,使基本周期与各MVB任务的周期长度相匹配,从而减少空闲等待,提高系统运行效率。
参考图13,图13为本发明再一个实施例的示意图。如图13所示,针对图7所示的基于Linux系统的调度处理方法中的第一超长时长,预设步骤如下,其中,第一超时时长即为MVB时段的长度:
步骤6001,通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的运行时长。
在本步骤中,可以遍历MVB调度类的就绪队列中的每个MVB任务,以获取各MVB任务的运行时长。
比如,MVB调度类的就绪队列中有3个MVB任务,其中,MVB任务A 的运行时长为0.3毫秒,MVB任务B的运行时长为0.2毫秒,MVB任务C 的运行时长为0.4毫秒。
步骤6003,计算所述各MVB任务的运行时长之和。
在本步骤中,将步骤6001获取的各MVB任务的运行时长加起来,得到运行时长之和。
比如,在步骤6001的例子基础上进行说明,MVB任务A,MVB任务B 和MVB任务C的运行时长之和为0.3+0.2+0.4=0.9毫秒。
步骤6005,计算所述运行时长之和,与预设的保护系数的第一乘积;将所述第一乘积预设为所述第一超时时长。
其中,所述保护系数大于1。
在本步骤中,计算MVB调度类的就绪队列中各MVB任务的运行时长之和,与预设的保护系数的乘积,将所述乘积记为第一乘积。
需要说明的是,为了保证各MVB任务能够按时完成,MVB调度类的就绪队列中各MVB任务的运行时长之和,是基础周期中的MVB时段,也即第一超时时长的最小值。
但是,在实际应用中,由于各种原因难免出现延迟,保险起见可以设置一个保护系数,且所述保护系数大于1,将运行时长之和乘以所述保护系数,得到一个稍有余地的MVB时段时长,也即第一超时时长。
比如,在步骤6003的基础上继续说明,MVB调度类的就绪队列的所有 MVB任务的运行时长之和为0.9毫秒,且预设的保护系数为1.2,那么,第一超时时长为0.9×1.2=1.08毫秒。
可见,本发明可以根据MVB调度类的就绪队列中的任务情况,动态调整系统的基本周期,以及所述基本周期中MVB时段的时长,这样,在MVB 任务的任务量可能会发生变化,导致执行MVB任务所需的MVB时段的时长也会发生变化的场景下,基本周期和MVB时段的时长均可以进行适应性调整,保证MVB任务的按时完成,以及提高CPU利用率。
具体实施中,MVB定时器的准确触发是保证MVB任务能够按时完成的前提。通常情况下,可以通过遍历各CPU的三个时间基准的红黑树,查找超时的MVB定时器并触发对应的动作,但是,在特殊情况下,比如有些定时器的超时时长过长,可能导致未能查找到已超时的MVB定时器,也无法触发这些已超时的MVB定时器对应的动作。
为了解决上述问题,本发明提出一种时钟冗余触发机制。参考图14,图 14为本发明再一个实施例的示意图。如图14所示,时钟冗余触发机制的流程如下:
步骤7001,函数hrtimer_interrupt通过遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树中是否存在定时器超时;若为否,则执行步骤 7003,若为是,则执行步骤7007。
在本步骤中,函数hrtimer_interrupt可以通过遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树的最左下方的节点是否存在定时器超时;若为否,则执行步骤7003;若为是,则执行步骤7007。
步骤7003,将预设的延误次数加1;判断所述延误次数是否小于或等于预设的阈值次数;若为是,则执行步骤7007,若为否,则执行步骤7013。
在本步骤中,若所述红黑树中不存在定时器超时,则将预设的延误次数加1,其中,预设的延误次数的初始值为0,以及判断当前的延误次数是否小于或等于预设的阈值次数,其中,阈值次数包括3。
若所述延误次数小于或等于阈值次数,则返回执行步骤7001,再次遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树中是否存在定时器超时。
若所述延误次数大于阈值次数,则退出函数。
步骤7007,函数run_hrtimer根据参数start_pid,判断超时定时器是否为所述高精度定时器函数MVB_hrtimer的所述MVB定时器;若为是,则执行步骤7009;若为否,则执行步骤7013。
步骤7009,判断所述延误次数是否为0;若为否,则执行步骤7011。
在本步骤中,判断延误次数是否为0,若延误次数为0,则表示没有其他定时器延误MVB定时器的执行,流程结束;若延误次数不为0,则表示有其他定时器的回调函数特别长,延误MVB定时器的执行。
步骤7011,查找延误所述MVB定时器的普通定时器,函数hrtimer_cancel 取消所述普通定时器。
需要说明的是,由于系统分时是系统最重要的性质,所以若MVB定时器存在延误,则通过函数hrtimer_cancel取消导致MVB定时器出现延误的普通定时器,以保证MVB定时器的稳定触发。
步骤7013,退出函数。
可见,本发明可以通过多次遍历各CPU的三个时间基准的红黑树,以及将超时时长过长的定时器取消,来保证MVB定时器被稳定触发。
本领域普通技术人员可以理解:附图只是一个实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
本领域普通技术人员可以理解:实施例中的装置中的模块可以按照实施例描述分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围。
Claims (10)
1.一种基于Linux系统的中断处理方法,其特征在于,包括:
函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq;
若为是,则所述函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,所述关键属性包括非线程化属性和非共享属性;
预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,所述非共享标识符用于标识取消针对中断描述符数组irq_desc的遍历处理;
内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符;
判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;
若为是,则通过预设的函数handle_mvb_irq_percpu,取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,其中,所述中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应;
在中断上下文中,执行所述中断处理程序。
2.根据权利要求1所述的方法,其特征在于,所述根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq的步骤,包括:
判断所述中断注册申请携带的中断号,是否为预设的非线程化中断号;
所述若为是,则通过所述函数request_mvb_irq,设置所述中断号对应的中断处理程序的关键属性的步骤,包括:
若所述中断注册申请携带的中断号是预设的非线程化中断号,则将所述中断注册申请发送给预设的函数request_mvb_irq,通过所述函数request_mvb_irq,设置所述中断号对应的中断处理程序的关键属性。
3.根据权利要求1所述的方法,其特征在于,所述取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理的步骤,包括:
根据所述中断号对应非线程化标识符,不将所述中断处理程序放入预设的中断线程;以及根据所述中断号对应非共享标识符,从预设的中断描述符数组唯一一个中断处理程序描述符irqaction中,读取所述中断处理程序的中断执行信息;
所述在中断上下文中,执行所述中断处理程序的步骤,包括:
根据所述中断执行信息,在中断上下文中执行所述中断处理程序。
4.根据权利要求1所述的方法,其特征在于,在所述根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq的步骤之后,所述方法还包括:
若为否,则将所述中断注册申请发送给函数request_threaded_irq,通过所述函数request_threaded_irq,设置所述中断号对应的线程化标识符和共享标识符。
5.根据权利要求4所述的方法,其特征在于,在所述判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符的步骤之后,所述方法还包括:
若为否,则确定查询到所述中断号对应标识符包括线程化标识符和共享标识符;通过预设的函数handle_irq_event_percpu,对所述中断处理程序进行线程化处理,以及对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction进行遍历处理,获取待执行的中断处理程序的中断执行信息,其中,所述预设的中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应;
根据所述中断执行信息,在线程上下文中执行所述中断处理程序。
6.一种基于Linux系统的中断处理装置,其特征在于,所述装置包括:第一判断模块、第一设置模块、第二设置模块、查询模块、第二判断模块、取消模块和第一执行模块;
所述第一判断模块,用于由函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq;
所述第一设置模块,用于若将所述中断注册申请发送给预设的函数request_mvb_irq,则所述函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,所述关键属性包括非线程化属性和非共享属性;
所述第二设置模块,用于由预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,所述非共享标识符用于标识取消针对中断描述符数组irq_desc的遍历处理;
所述查询模块,用于由内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符;
所述第二判断模块,用于判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;
所述取消模块,用于若查询到的所述中断号对应的标识符包括所述非线程化标识符和所述非共享标识符,则通过预设的函数handle_mvb_irq_percpu,取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,其中,所述中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应;
所述第一执行模块,用于在中断上下文中,执行所述中断处理程序。
7.根据权利要求6所述的装置,其特征在于,
所述第一判断模块,具体用于判断所述中断注册申请携带的中断号,是否为预设的非线程化中断号;
所述第一设置模块,具体用于若所述中断注册申请携带的中断号是预设的非线程化中断号,则将所述中断注册申请发送给预设的函数request_mvb_irq,通过所述函数request_mvb_irq,设置所述中断号对应的中断处理程序的关键属性。
8.根据权利要求6所述的装置,其特征在于,
所述取消模块,具体用于根据所述中断号对应非线程化标识符,不将所述中断处理程序放入预设的中断线程;以及根据所述中断号对应非共享标识符,从预设的中断描述符数组唯一一个中断处理程序描述符irqaction中,读取所述中断处理程序的中断执行信息;
所述第一执行模块,具体用于根据所述中断执行信息,在中断上下文中执行所述中断处理程序。
9.根据权利要求6所述的装置,其特征在于,所述装置还包括:
第三设置模块,用于若不将所述中断注册申请发送给预设的函数request_mvb_irq,则将所述中断注册申请发送给函数request_threaded_irq,通过所述函数request_threaded_irq,设置所述中断号对应的线程化标识符和共享标识符。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括:处理模块和第二执行模块;
所述处理模块,用于若所述中断号对应的标识符包括所述非线程化标识符和所述非共享标识符,则确定查询到所述中断号对应标识符包括线程化标识符和共享标识符;通过预设的函数handle_irq_event_percpu,对所述中断处理程序进行线程化处理,以及对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction进行遍历处理,获取待执行的中断处理程序的中断执行信息,其中,所述预设的中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应;
所述第二执行模块,用于根据所述中断执行信息,在线程上下文中执行所述中断处理程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011318921.4A CN112433835B (zh) | 2020-11-23 | 2020-11-23 | 一种基于Linux系统的中断处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011318921.4A CN112433835B (zh) | 2020-11-23 | 2020-11-23 | 一种基于Linux系统的中断处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112433835A true CN112433835A (zh) | 2021-03-02 |
CN112433835B CN112433835B (zh) | 2023-01-13 |
Family
ID=74693508
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011318921.4A Active CN112433835B (zh) | 2020-11-23 | 2020-11-23 | 一种基于Linux系统的中断处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112433835B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101211323A (zh) * | 2006-12-28 | 2008-07-02 | 联想(北京)有限公司 | 一种硬件中断的处理方法和处理装置 |
CN102117223A (zh) * | 2011-02-22 | 2011-07-06 | 哈尔滨工业大学 | 利用异步通知实现lxi载板应用程序对m模块中断响应的方法 |
CN103634230A (zh) * | 2013-11-29 | 2014-03-12 | 华中科技大学 | 一种基于动态预测的网络驱动层数据包接收方法和系统 |
-
2020
- 2020-11-23 CN CN202011318921.4A patent/CN112433835B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101211323A (zh) * | 2006-12-28 | 2008-07-02 | 联想(北京)有限公司 | 一种硬件中断的处理方法和处理装置 |
CN102117223A (zh) * | 2011-02-22 | 2011-07-06 | 哈尔滨工业大学 | 利用异步通知实现lxi载板应用程序对m模块中断响应的方法 |
CN103634230A (zh) * | 2013-11-29 | 2014-03-12 | 华中科技大学 | 一种基于动态预测的网络驱动层数据包接收方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN112433835B (zh) | 2023-01-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6687257B1 (en) | Distributed real-time operating system providing dynamic guaranteed mixed priority scheduling for communications and processing | |
US7809876B2 (en) | Distributed real-time operating system | |
US6633942B1 (en) | Distributed real-time operating system providing integrated interrupt management | |
CN107291547B (zh) | 一种任务调度处理方法、装置及系统 | |
Koren et al. | Skip-over: Algorithms and complexity for overloaded systems that allow skips | |
CN103197968B (zh) | 一种融合同步异步特点的线程池处理方法及系统 | |
US7831980B2 (en) | Scheduling threads in a multi-processor computer | |
US8522250B2 (en) | Managing access to a shared resource in a data processing system | |
CN110795254A (zh) | 一种基于php处理高并发io的方法 | |
CN110018892A (zh) | 基于线程资源的任务处理方法及相关装置 | |
CN111897637B (zh) | 作业调度方法、装置、主机及存储介质 | |
US6820263B1 (en) | Methods and system for time management in a shared memory parallel processor computing environment | |
CN112783659A (zh) | 一种资源分配方法、装置、计算机设备及存储介质 | |
CN112860387A (zh) | 分布式任务调度方法、装置、计算机设备及存储介质 | |
CN111597044A (zh) | 任务调度方法、装置、存储介质及电子设备 | |
CN112433835B (zh) | 一种基于Linux系统的中断处理方法及装置 | |
CN112433834B (zh) | 一种基于Linux系统的调度处理方法及装置 | |
Horowitz | A run-time execution model for referential integrity maintenance | |
CN114661415A (zh) | 调度方法及计算机系统 | |
WO2000063776A2 (en) | Object-oriented system having anonymous scheduler design pattern | |
CN107301085B (zh) | 一种基于队列的云平台任务分配方法 | |
CN111427673A (zh) | 一种负载均衡方法、装置及设备 | |
Ramasubramanian et al. | Studies on Performance Aspect of Scheduling Algorithms on Multicore Platform | |
CN115167973B (zh) | 一种云计算数据中心的数据处理系统 | |
US20060048150A1 (en) | Task management methods and related devices |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |