一种将中断处理程序底半部搬移到应用层的方法及应用的制作方法

文档序号:6492677阅读:403来源:国知局
一种将中断处理程序底半部搬移到应用层的方法及应用的制作方法
【专利摘要】本发明涉及一种将中断处理程序底半部搬移到应用层的方法,以及基于所述方法的一种在应用层对中断处理程序底半部进行处理的方法。本发明的有益效果如下:(1)对中断处理程序的修改变得简单,只需在应用层修改应用程序即可,不涉及到内核层的修改,对研发人员的要求比较低;(2)对中断处理程序的修改调试工作变得灵活,开销小。只需要应用开发人员参与即可,不需要驱动开发人员和应用开发人员协同工作;(3)中断产生后,应用程序设置的中断事件回调函数被调用,该回调函数进行中断处理,在形式上与内核层的中断处理函数完全一致,从应用程序的角度来讲,就像在应用层直接开发中断处理程序一样。
【专利说明】一种将中断处理程序底半部搬移到应用层的方法及应用
【技术领域】
[0001]本发明涉及Iinux下的中断处理机制,更具体地说,涉及一种将中断处理程序底半部搬移到应用层的方法,以及基于所述方法的一种在应用层对中断处理程序底半部进行处理的方法。
【背景技术】
[0002]Linux将中断处理程序分解为两个半部:顶半部(top half)和底半部(bottomhalf)。顶半部完成尽可能少的比较紧急的功能,它往往只是简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。这样,顶半部执行的速度就会很快,可以服务更多的中断请求。接下来比较费时的任务就可以交给底半部来完成,可以说,中断处理的底半部完成中断事件的绝大多数任务,几乎做了中断处理程序所有的事情。Linux下中断处理底半部的实现机制主要有tasklet,工作队列和软中断。
[0003]不管底半部采用什么机制实现,他都是在驱动程序中实现的,也就是说在内核模式下实现的。如果需要对中断处理程序进行修改,譬如因为车辆环境的不同对里程脉冲统计的方法的修改,因为车辆环境的不同对传感器信号去抖方法的修改等,则需要在内核模式下修改和调试驱动程序。这样带来的问题是,一是修改难度大,需要在内核层修改,对研发人员的要求高;二是不够灵活、开销大,因为驱动程序处于操作系统和应用程序的中间层,每次修改都需要涉及到驱动程序开发人员和应用开发人员的配合联调,花费的人力资源多。
[0004]中国发明专利申请200810117341.1提供一种实现中断底半部机制的方法及嵌入式系统,其中,方法包括:嵌入式操作系统收到中断请求后,执行中断操作,转到中断处理顶半部模块;所述中断处理顶半部模块执行中断处理程序后,转到底半部中断管理任务模块;所述管理任务模块执行底半部管理任务,所述底半部管理任务为嵌入式操作系统的具有高于常规任务的优先级的系统任务,所述底半部管理任务调用中断处理底半部模块;所述中断处理底半部模块执行中断处理底半部程序。本发明通过嵌入式操作系统的具有最高任务优先级的系统任务来完成中断顶半部和底半部的衔接,简单易行、响应快速、代码量很少,更适合于嵌入式应用领域。
[0005]上述发明专利申请的技术方案主要用于解决了中断顶半部和底半部衔接效果差的问题,但仍使用现有的中断处理机制,同样存在不足:一、修改难度大,需要在内核层修改,对研发人员的要求高;二、不够灵活、开销大,因为驱动程序处于操作系统和应用程序的中间层,每次修改都需要涉及到驱动程序开发人员和应用开发人员的配合联调,花费的人力资源多。

【发明内容】

[0006]本发明的目的在于克服现有技术的不足,提供一种对中断处理程序的修改变得简单,对中断处理程序的修改调试工作变得灵活,开销小的一种Linux下将中断处理程序底半部搬移到应用层的方法,并将其用于在应用层处理中断底半部的应用中。
[0007]本发明的技术方案如下:
[0008]一种Linux下将中断处理程序底半部搬移到应用层的方法,步骤如下:
[0009]I)内核层驱动程序完成中断顶半部处理后,对中断事件进行广播通知;
[0010]2)应用层动态库程序接收内核层驱动程序发出的中断事件广播通知;
[0011]3)应用层动态库程序创建全局链表、回调函数注册接口,全局链表用于存储向回调函数注册接口注册的回调函数;
[0012]4)应用层应用程序定义中断底半部处理函数,并向回调函数注册接口进行注册,存储于全局链表,形成中断底半部处理回调函数;
[0013]5)应用层动态库程序取出全局链表中的中断底半部处理回调函数,完成中断底半部处理。
[0014]作为优选,内核层驱动程序位于系统的内核层,应用层动态库程序、应用层应用程序位于系统的应用层。
[0015]作为优选,步骤I)具体为:
[0016]1.1)内核层驱动程序向系统内核注册中断顶半部处理函数,用于接收硬件中断信号并进行顶半部处理;
[0017]1.2)内核层驱动程序创建第一 netlink套接字,用于向系统广播中断事件。
[0018]作为优选,步骤2)具体为:应用层动态库程序创建第二 netlink套接字、广播通知接收线程,用于接收内核层驱动程序发出的中断事件广播通知。
[0019]作为优选,全局链表中存储的是头指针,链表中每个节点存储的是一个函数的调用地址。
[0020]作为优选,回调函数注册接口为系统动态库向应用层提供的接口,通过回调函数注册接口将向其注册的函数加入到全局链表中。
[0021]作为优选,步骤1.1)具体为:将自定义的函数作为request_irq函数的参数传入到系统内核,自定义的函数即可中断顶半部处理函数,并用于接收硬件中断信号并进行中断顶半部处理。
[0022]作为优选,步骤1.2)具体为:利用netlink_kernel_create函数,通过第一netlink套接字对象向系统内核、应用层发送广播通知。
[0023]作为优选,广播通知接收线程的实现具体为:创建自定义线程,并在该自定义线程中循环读取第二 netlink套接字对象实现对中断事件广播通知的接收。
[0024]一种在应用层对中断处理程序底半部进行处理的方法,步骤如下:
[0025]A)中断产生;
[0026]B)将中断处理程序底半部搬移到应用层;
[0027]C)在应用层对中断底半部进行处理;
[0028]步骤B)利用将中断处理程序底半部搬移到应用层的方法进行操作。
[0029]本发明的有益效果如下:
[0030](I)对中断处理程序的修改变得简单,只需在应用层修改应用程序即可,不涉及到内核层的修改,对研发人员的要求比较低;
[0031](2)对中断处理程序的修改调试工作变得灵活,开销小。只需要应用开发人员参与即可,不需要驱动开发人员和应用开发人员协同工作;
[0032](3)中断产生后,应用程序设置的中断事件回调函数被调用,该回调函数进行中断处理,在形式上与内核层的中断处理函数完全一致,从应用程序的角度来讲,就像在应用层直接开发中断处理程序一样。
【专利附图】

【附图说明】
[0033]图1是本发明所述的方法应用的系统框架示意图。
【具体实施方式】
[0034]以下结合附图及实施例对本发明进行进一步的详细说明。
[0035]一种Linux下将中断处理程序底半部搬移到应用层的方法,步骤如下:
[0036]I)内核层驱动程序完成中断顶半部处理后,对中断事件进行广播通知;步骤I)具体为:
[0037]1.1)内核层驱动程序向系统内核注册中断顶半部处理函数,用于接收硬件中断信号并进行顶半部处理;具体为:将自定义的函数作为request_irq函数的参数传入到系统内核,自定义的函数即可中断顶半部处理函数,并用于接收硬件中断信号并进行中断顶半部处理;
[0038]1.2)内核层驱动程序创建第一 netlink套接字,用于向系统广播中断事件;具体为:利用netlink_kernel_create函数,通过第一 netlink套接字对象向系统内核、应用层发送广播通知;
[0039]2)应用层动态库程序接收内核层驱动程序发出的中断事件广播通知;具体为:应用层动态库程序创建第二 netlink套接字、广播通知接收线程,用于接收内核层驱动程序发出的中断事件广播通知;其中,广播通知接收线程的实现具体为:创建自定义线程,并在该自定义线程中循环读取第二 netlink套接字对象实现对中断事件广播通知的接收;
[0040]3)应用层动态库程序创建全局链表、回调函数注册接口,全局链表用于存储向回调函数注册接口注册的回调函数;全局链表中存储的是头指针,链表中每个节点存储的是一个函数的调用地址;回调函数注册接口为系统动态库向应用层提供的接口,通过回调函数注册接口将向其注册的函数加入到全局链表中;
[0041]4)应用层应用程序定义中断底半部处理函数,并向回调函数注册接口进行注册,存储于全局链表,形成中断底半部处理回调函数;
[0042]5)应用层动态库程序取出全局链表中的中断底半部处理回调函数,完成中断底半部处理。
[0043]如图1所示,内核层驱动程序位于系统的内核层,应用层动态库程序、应用层应用程序位于系统的应用层,中断事件来自硬件层的底层硬件。
[0044]内核层驱动程序在内核层运行,主要负责完成中断顶半部的处理和向整个系统发出一个中断事件的广播通知。当一个硬件中断到来时,内核层驱动程序的中断顶半部处理函数被调用,这个部分的处理与普通的驱动程序没有区别,只是在中断顶半部处理函数的最后,多出一个对中断事件进行广播通知的处理,这个广播通知采用net I ink机制实现,在应用层的程序和内核层的程序都可以接收这个广播通知。[0045]应用层动态库程序在应用层运行,主要负责接收内核层驱动程序发出的中断事件广播通知和对应用层应用程序注册的中断底半部处理函数进行回调。
[0046]应用层应用程序在应用层运行,主要利用应用层动态库程序提供的接口函数,注册中断底半部处理回调函数和进行中断底半部函数的业务处理,譬如根据里程脉冲的统计方法进行里程统计,根据传感器信号的特点对信号进行去抖处理和信号的有效性判断等。
[0047]一种在应用层对中断处理程序底半部进行处理的方法,步骤如下:
[0048]A)中断产生;
[0049]B)将中断处理程序底半部搬移到应用层;
[0050]C)在应用层对中断底半部进行处理;
[0051]步骤B)利用将中断处理程序底半部搬移到应用层的方法进行操作。
[0052]实施例
[0053]Linux下将中断处理程序底半部搬移到应用层的方法,具体实施步骤如下:
[0054]I)内核层驱动程序向内核注册一个中断顶半部处理函数,以便接收硬件中断信号并进行顶半部处理;向内核注册中断顶半部处理函数是Iinux内核提供的一个接口,使用request_irq函数来实现,将一个普通的函数作为request_irq函数的参数传入到内核,这个普通函数就变成了中断顶半部处理函数,可以接收硬件中断信号并进行中断顶半部处理;
[0055]2)内核层驱动程序创建一个netlink套接字,以便向系统广播中断事件;创建netlink套接字是Iinux内核提供的一个接口,使用netlink_kernel_create函数来实现,通过创建的netlink套接字对象可以向内核空间和用户空间发送广播通知;
[0056]3)应用层动态库程序创建一个netlink套接字和一个广播通知接收线程,以便接收内核层驱动程序发出的中断事件广播通知;广播通知接收线程是通过创建一个普通的线程并且在该线程中循环读取netlink套接字对象来实现的。如果有广播通知,读取netlink套接字对象的函数就可以返回并获得广播通知的具体内容;
[0057]4)应用层动态库程序创建一个中断底半部处理回调函数的全局链表,以便存储所有利用应用层动态库程序的回调函数注册接口进行注册中断底半部处理回调函数;这个全局链表使用list_head数据结构来定义,它本质上是一个链表的头指针,链表中每个节点存储的是一个函数的调用地址,这些函数我们称之为中断底半部处理回调函数。本来,中断底半部处理函数是针对一个完整中断处理过程的延迟处理部分,是在Iinux内核代码中才能实现的,我们这里将一个完整中断处理过程的延迟处理部分搬移到了应用层,因此也称这个全局链表节点中的函数为中断底半部处理函数。
[0058]list_head数据结构的定义如下:
[0059]struct list_hed{
[0060]struct list—head氺next,氺prev;
[0061]};
[0062]5)应用层动态库程序创建一个回调函数注册接口,以便其他应用层应用程序向他注册中断底半部处理回调函数;这个回调函数注册接口的作用就是将所注册的中断底半部处理函数加入到上文提到的全局链表中,他是一个动态库向应用层提供的接口,具体采用下面的函数定义来实现:[0063]int set_interrupt_event_callback_func(void(*event_calIback)(intevent));
[0064]6)应用层应用程序定义一个中断底半部处理函数,完成对中断事件的延迟处理,譬如根据里程脉冲的统计方法进行里程统计,根据传感器信号的特点对信号进行去抖处理和信号的有效性判断等。
[0065]7)应用层应用程序利用应用层动态库程序的回调函数注册接口注册一个中断底半部处理函数。
[0066]一种在应用层对中断处理程序底半部进行处理的方法,具体实施步骤如下:
[0067]A) 一个硬件中断产生;
[0068]B)内核层驱动程序的中断顶半部处理函数运行,并且发送中断事件广播通知;
[0069]C)应用层动态库程序的广播通知接收线程收到内核层驱动程序发出的中断事件广播通知;
[0070]D)应用层动态库程序从中断底半部处理回调函数的全局链表中逐个取出回调函数,并以一一进行调用;
[0071]E)应用层应用程序中的中断底半部处理回调函数被应用层动态库程序调用,按照该函数的内容进行执行,完成中断底半部的处理。
[0072]上述实施例仅是用来说明本发明,而并非用作对本发明的限定。只要是依据本发明的技术实质,对上述实施例进行变化、变型等都将落在本发明的权利要求的范围内。
【权利要求】
1.一种Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,步骤如下: O内核层驱动程序完成中断顶半部处理后,对中断事件进行广播通知; 2)应用层动态库程序接收内核层驱动程序发出的中断事件广播通知; 3)应用层动态库程序创建全局链表、回调函数注册接口,全局链表用于存储向回调函数注册接口注册的回调函数; 4)应用层应用程序定义中断底半部处理函数,并向回调函数注册接口进行注册,存储于全局链表,形成中断底半部处理回调函数; 5)应用层动态库程序取出全局链表中的中断底半部处理回调函数,完成中断底半部处理。
2.根据权利要求1所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,内核层驱动程序位于系统的内核层,应用层动态库程序、应用层应用程序位于系统的应用层。
3.根据权利要求1所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,步骤I)具体为: 1.1)内核层驱动程序向系统内核注册中断顶半部处理函数,用于接收硬件中断信号并进行顶半部处理; 1.2)内核层驱动程序创建`第一 netlink套接字,用于向系统广播中断事件。
4.根据权利要求1所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,步骤2)具体为:应用层动态库程序创建第二 netlink套接字、广播通知接收线程,用于接收内核层驱动程序发出的中断事件广播通知。
5.根据权利要求1所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,全局链表中存储的是头指针,链表中每个节点存储的是一个函数的调用地址。
6.根据权利要求1所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,回调函数注册接口为系统动态库向应用层提供的接口,通过回调函数注册接口将向其注册的函数加入到全局链表中。
7.根据权利要求3所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,步骤1.0具体为:将自定义的函数作为request_irq函数的参数传入到系统内核,自定义的函数即可中断顶半部处理函数,并用于接收硬件中断信号并进行中断顶半部处理。
8.根据权利要求3所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,步骤1.2)具体为:利用netlink_kernel_create函数,通过第一 netlink套接字对象向系统内核、应用层发送广播通知。
9.根据权利要求4所述的Linux下将中断处理程序底半部搬移到应用层的方法,其特征在于,广播通知接收线程的实现具体为:创建自定义线程,并在该自定义线程中循环读取第二 netlink套接字对象实现对中断事件广播通知的接收。
10.一种在应用层对中断处理程序底半部进行处理的方法,其特征在于,步骤如下: A)中断产生; B)将中断处理程序底半部搬移到应用层; C)在应用层对中断底半部进行处理;步骤B)利用权利要求1至9任一项所述的将中断处理程序底半部搬移到应用层的方法进行操作。`
【文档编号】G06F9/48GK103870326SQ201210532215
【公开日】2014年6月18日 申请日期:2012年12月11日 优先权日:2012年12月11日
【发明者】彭勇, 许宁, 任赋, 郑福弟 申请人:厦门雅迅网络股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1