中断处理方法及装置制造方法

文档序号:6489963阅读:216来源:国知局
中断处理方法及装置制造方法
【专利摘要】本发明公开了一种中断处理方法及装置。该方法包括:步骤1,在系统进行初始化时,对中断及其驱动程序进行初始化,在执行当前任务时发生中断的情况下,将中断现场的上下文信息保存到预先设置的中断堆栈中,并判断是否为中断嵌套,步骤2,将当前任务现场的上下文信息保存到预先设置的任务堆栈中,并将堆栈指针SP移到中断堆栈;步骤3,通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理,并判断是否处于中断嵌套;步骤4,恢复保存的当前中断现场的上下文信息,并返回上层中断;步骤5,恢复保存的当前任务现场的上下文信息,并返回当前任务。
【专利说明】中断处理方法及装置【技术领域】
[0001 ] 本发明涉及移动通讯领域,特别是涉及一种中断处理方法及装置。
【背景技术】
[0002]在现有技术中,嵌入式系统对实时性和响应速度上有比较高的要求,支持不同优先级的中断控制器,对软件也提出了支持中断嵌套的要求。随着嵌入式系统的复杂性越来越高,实时操作系统的引入也越来越普遍,如何在实时操作系统中支持中断嵌套成为一个难题。
[0003]μ COS-1I是一个基于抢占式的实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性。它总是运行最高优先级的就绪任务。μ COS-1I支持的中断嵌套层数可以高达255层。
[0004]在嵌入式方面,无互锁流水级微处理器(Microcomputer withoutinterlockedpipeline stages,简称为MIPS) 32系列微处理器是目前仅次于ARM用得最多的处理器之一,其应用领域覆盖游戏机、路由器、激光打印机、掌上电脑等各个方面。其中,MIPS32处理器支持的中断方式有以下三种:
[0005]普通中断:支持八个独立的中断位,中断之间不区分优先级,所有中断拥有同一个中断入口。
[0006]向量中断:支持八个独立的中断位,中断之间不区分优先级,每个中断拥有自己的中断入口。
[0007]外部向量(EIC)中断:支持最多64个中断,中断之间可以设置优先级,每个中断拥有自己的中断入口。
[0008]普通中断和向量中断支持的中断个数有限,且不区分优先级,限制了在实际中的使用,因此,下述的中断均为EIC中断。
[0009]现有的实现方案中,已经出现了将μ COS-1I移植到MIPS的相关技术,现有的这些技术中,对于中断处理都是不支持嵌套中断的,所用的做法都是在处理中断的过程中,关闭全局中断使能位,禁止中断,处理完成之后,在打开中断。这样存在一个问题,当高优先级的中断来临时,由于中断禁止,而CPU不能及时进行处理,从而影响了中断的实时性。
[0010]此外,μ COS-1I中有自己的中断处理机制,但它的中断处理都是在任务堆栈上进行的。而EIC支持64级中断,而且允许中断嵌套,如果按照μ COS-1I本身的中断处理流程,每个任务堆栈都必须预留允许64级中断嵌套的空间,这大大增加了任务堆栈占用的RAM空间,影响了 RAM的使用效率。

【发明内容】

[0011]本发明提供一种中断处理方法及装置,以解决现有技术中将μ COS-1I移植到MIPS后不能够支持嵌套中断的问题。
[0012]本发明提供一种中断处理方法,适用于基于MIPS32作为处理器并且以μ COS-1I作为操作系统的平台,包括:步骤1,在系统进行初始化时,对中断及其驱动程序进行初始化,在执行当前任务时发生中断的情况下,将中断现场的上下文信息保存到预先设置的中断堆栈中,并判断是否为中断嵌套,如果判断为否,执行步骤2,否则,执行步骤3 ;步骤2,将当前任务现场的上下文信息保存到预先设置的任务堆栈中,并将堆栈指针SP移到中断堆栈,执行步骤3;步骤3,通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理,并判断是否处于中断嵌套,如果判断为是,执行步骤4,否则,执行步骤5 ;步骤4,从中断堆栈中恢复保存的当前中断现场的上下文信息,并返回上层中断继续执行;步骤5,从任务堆栈中恢复保存的当前任务现场的上下文信息,并返回被打断的当前任务继续执行。
[0013]优选地,在系统进行初始化时,对中断及其驱动程序进行初始化具体包括:配置所有中断的优先级和触发模式,并禁用所有中断,其中,触发模式包括:电平触发或者边缘触发;获取所有中断的中断号,将相应的中断处理程序与中断号相对应;在使能中断之前将中断处理程序拷贝到其对应的中断向量入口地址上,其中,中断向量之间的间隔为32字节。
[0014]优选地,将中断现场的上下文信息保存到预先设置的中断堆栈中具体包括:将中断现场的无内部互锁流水级的微处理器MIPS通用寄存器、状态寄存器SR、以及例外程序寄存器EPC中的信息保存到预先设置的中断堆栈中。
[0015]优选地,将当前任务现场的上下文信息保存到预先设置的任务堆栈中具体包括:依次将当前任务现场的程序计数器PC、SP、相关寄存器中的信息、以及中断返回地址保存到预先设置的任务堆栈中,其中相关寄存器包括SR和其他相关通用寄存器;将指向最后一个压栈内容的当前任务现场指针保存到预定函数中,其中,当前任务现场指针在恢复当前任务时出栈使用。
[0016]优选地,通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理具体包括:跳转至操作系统中断进入0S_IntEnter函数,通知系统开始进入中断处理;读取原因CAUSE寄存器的请求中断优先级RIPL位,获取中断的优先级,并将中断的优先级设置到SR的中断优先级IPL位上;将SR中的KSU位、ERL位、以及EXL位清零;将SP递减,分配中断堆栈给中断处理程序的参数;从SR的IPL位上获取中断的优先级,根据该优先级跳转到中断处理程序进行处理;修改SR的IPL位,并将SR的ERL位和EXL位设置为零,同时打开中断,使能中断嵌套;释放中断堆栈,并将SR的EXL位置为1,禁止中断;跳转至系统中断退出0S_IntExit函数,通知系统退出中断处理。
[0017]本发明还提供了一种中断处理装置,适用于基于MIPS32作为处理器并且以μ COS-1I作为操作系统的平台,包括:初始化模块,用于在系统进行初始化时,对中断及其驱动程序进行初始化;第一中断处理模块,用于在执行当前任务时发生中断的情况下,将中断现场的上下文信息保存到预先设置的中断堆栈中,并判断是否为中断嵌套,如果判断为否,调用第二中断处理模块,否则,调用第三中断处理模块;第二中断处理模块,用于将当前任务现场的上下文信息保存到预先设置的任务堆栈中,并将堆栈指针SP移到中断堆栈,调用第三中断处理模块;第三中断处理模块,用于通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理,并判断是否处于中断嵌套,如果判断为是,调用中断恢复模块,否则,调用任务恢复模块;中断恢复模块,用于从中断堆栈中恢复保存的当前中断现场的上下文信息,并返回上层中断继续执行;任务恢复模块,用于从任务堆栈中恢复保存的当前任务现场的上下文信息,并返回被打断的当前任务继续执行。
[0018]优选地,初始化模块具体用于:配置所有中断的优先级和触发模式,并禁用所有中断,其中,触发模式包括:电平触发或者边缘触发;获取所有中断的中断号,将相应的中断处理程序与中断号相对应;在使能中断之前将中断处理程序拷贝到其对应的中断向量入口地址上,其中,中断向量之间的间隔为32字节。
[0019]优选地,第一中断处理模块具体用于:将中断现场的无内部互锁流水级的微处理器MIPS通用寄存器、状态寄存器SR、以及例外程序寄存器EPC中的信息保存到预先设置的中断堆栈中。
[0020]优选地,第二中断处理模块具体用于:依次将当前任务现场的程序计数器PC、SP、相关寄存器中的信息、以及中断返回地址保存到预先设置的任务堆栈中,其中相关寄存器包括SR和其他相关通用寄存器;将指向最后一个压栈内容的当前任务现场指针保存到预定函数中,其中,当前任务现场指针在恢复当前任务时出栈使用。
[0021]优选地,第三中断处理模块具体用于:跳转至操作系统中断进入0S_IntEnter函数,通知系统开始进入中断处理;读取原因CAUSE寄存器的请求中断优先级RIPL位,获取中断的优先级,并将中断的优先级设置到SR的中断优先级IPL位上;将SR中的KSU位、ERL位、以及EXL位清零;将SP递减,分配中断堆栈给中断处理程序的参数;从SR的IPL位上获取中断的优先级,根据该优先级跳转到中断处理程序进行处理;修改SR的IPL位,并将SR的ERL位和EXL位设置为零,同时打开中断,使能中断嵌套;释放中断堆栈,并将SR的EXL位置为1,禁止中断;跳转至系统中断退出0S_IntExit函数,通知系统退出中断处理。
[0022]本发明有益效果如下:
[0023]通过在内存中专门开辟出一块区域,作为中断堆栈使用,发生中断嵌套时的压栈和出栈操作都只使用中断堆栈,从而将任务堆栈与中断堆栈分离,使得在计算任务堆栈大小时,不需要把中断处理(包括中断嵌套)中的内存占用计算到任务堆栈中,只需考虑任务本身及首次中断时所占用的RAM空间大小,提高了 RAM的使用效率,进而给上层预留了更多的RAM空间。此外,将所有的中断嵌套中的寄存器压栈都压在中断堆栈中,这样对于任务堆栈内存大小的要求大大降低。
[0024]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【专利附图】

【附图说明】
[0025]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0026]图1是本发明实施例的中断处理方法的流程图;
[0027]图2是本发明实施例的任务堆栈初始化的示意图;[0028]图3是本发明实施例的中断堆栈与任务堆栈分开后任务执行过程中首次中断时堆栈变化情况示意图;
[0029]图4是本发明实施例的中断嵌套时中断堆栈变化情况的示意图;
[0030]图5是本发明实施例的中断堆栈与任务堆栈分开设计时中断处理流程图;
[0031]图6是本发明实施例的中断处理装置的结构示意图。
【具体实施方式】
[0032]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0033]为了解决现有技术中将μ COS-1I移植到MIPS后不能够支持嵌套中断的问题,本发明提供了一种中断处理方法及装置,以下结合附图以及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不限定本发明。
[0034]方法实施例
[0035]根据本发明的实施例,提供了一种中断处理方法,适用于基于MIPS32作为处理器并且以μ COS-1I作为操作系统的平台,图1是本发明实施例的中断处理方法的流程图,如图1所示,根据本发明实施例的中断处理方法包括如下处理:
[0036]步骤101,在系统进行初始化时,对中断及其驱动程序进行初始化,在执行当前任务时发生中断的情况下,将中断现场的上下文信息保存到预先设置的中断堆栈中,并判断是否为中断嵌套,如果判断为否,执行步骤102,否则,执行步骤103 ;
[0037]具体地,在步骤101中,在系统进行初始化时,对中断及其驱动程序进行初始化具体包括:配置所有中断的优先级和触发模式,并禁用所有中断,其中,触发模式包括:电平触发或者边缘触发;获取所有中断的中断号,将相应的中断处理程序与中断号相对应;在使能中断之前将中断处理程序拷贝到其对应的中断向量入口地址上,其中,中断向量之间的间隔为32字节。
[0038]将中断现场的上下文信息保存到预先设置的中断堆栈中具体包括:将中断现场的无内部互锁流水级的微处理器MIPS通用寄存器、状态寄存器SR、以及例外程序寄存器EPC中的信息保存到预先设置的中断堆栈中。
[0039]步骤102,将当前任务现场的上下文信息保存到预先设置的任务堆栈中,并将堆栈指针SP移到中断堆栈,执行步骤103 ;
[0040]在步骤102中,将当前任务现场的上下文信息保存到预先设置的任务堆栈中具体包括:依次将当前任务现场的程序计数器PC、SP、相关寄存器中的信息、以及中断返回地址保存到预先设置的任务堆栈中,其中相关寄存器包括SR和其他相关通用寄存器;将指向最后一个压栈内容的当前任务现场指针保存到预定函数中,其中,当前任务现场指针在恢复当前任务时出栈使用。
[0041]步骤103,通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理,并判断是否处于中断嵌套,如果判断为是,执行步骤104,否则,执行步骤105 ;[0042]步骤103具体包括如下处理:1、跳转至操作系统中断进入0S_IntEnter函数,通知系统开始进入中断处理;2、读取原因CAUSE寄存器的请求中断优先级RIPL位,获取中断的优先级,并将中断的优先级设置到SR的中断优先级IPL位上;3、将SR中的KSU位、ERL位、以及EXL位清零;4、将SP递减,分配中断堆栈给中断处理程序的参数;5、从SR的IPL位上获取中断的优先级,根据该优先级跳转到中断处理程序进行处理;6、修改SR的IPL位,并将SR的ERL位和EXL位设置为零,同时打开中断,使能中断嵌套;7、释放中断堆栈,并将SR的EXL位置为1,禁止中断;8、跳转至系统中断退出0S_IntExit函数,通知系统退出中断处理。
[0043]步骤104,从中断堆栈中恢复保存的当前中断现场的上下文信息,并返回上层中断继续执行;
[0044]步骤105,从任务堆栈中恢复保存的当前任务现场的上下文信息,并返回被打断的当前任务继续执行。
[0045]以下结合附图,对本发明实施例的上述技术方案进行详细的说明。
[0046]图2是本发明实施例的任务堆栈初始化的示意图,如图2所示,在任务堆栈在初始化时,主要进行如下处理:1、准备好将来任务运行开始时CPU寄存器应处的状态(正确值);2、定位好程序计数器(PC),如果数据设计合理,任务被执行时,CPU便会按照预设计划运行。
[0047]在任务首次运行时,PC指针(即任务函数指针)将定位到任务代码的第一行,由于任务代码尚未被执行过,故代码中的变量与CPU的其它寄存器没有关系,简单的方法是将其赋为O ;经过入栈和出栈,此时堆栈指针(StackPointer,简称为SP)指向任务堆栈的最底端(就是已经定义好的任务堆栈数组的最后一个元素)。
[0048]通过在内存中专门开辟出一块区域,作为中断堆栈使用,发生中断嵌套时的压栈和出栈操作都只使用它。从而将任务堆栈与中断堆栈分离,使得在计算任务堆栈大小时,不需要把中断处理(包括中断嵌套)中的内存占用计算到任务堆栈中,只需考虑任务本身及首次中断时所占用的RAM空间大小,提高了 RAM的使用效率,进而给上层预留了更多的RAM空间。
[0049]图3是本发明实施例的中断堆栈与任务堆栈分开后任务执行过程中首次中断时堆栈变化情况示意图,如图3所示,中断堆栈与任务堆栈分开后,当任务执行过程中发生中断时,首先,在任务堆栈中,PC和SP被系统压栈,然后将CPU的相关寄存器压栈,同时将CPU的状态寄存器(Staus Register,简称为SR)以及中断返回地址压栈,任务堆栈压栈后任务现场指针指向最后一个压栈内容,并将该值赋值给OSTCBCur,以便出栈使用,然后把SP调整到中断堆栈处。在中断处理过程中,可能会出现压栈的操作(中断处理的函数调用),那么这种情况下SP的指针会随之移动。
[0050]图4是本发明实施例的中断嵌套时中断堆栈变化情况的示意图,如图4所示,当中断发生嵌套时,SP已经被移到中断堆栈中,只有到中断退出时(中断嵌套最外层)才把SP移到任务堆栈。所以在中断嵌套时,对于中断的处理和第一次产生中断是一样的,所不同的是:保存在堆栈中的不是任务运行中的寄存器,而是中断处理中的寄存器,而且不是保存在任务堆栈而是中断堆栈中。MIPS的EIC模式支持64个中断源,O级不能用,因此最多有62层的中断嵌套。考虑最深嵌套时所需的堆栈大小为:62*(32*4)=8K,如果用任务堆栈保存,则需要任务数Ν*8Κ,从这里可以看出优化内存的效果:所有的中断嵌套中的寄存器压栈都压在中断堆栈中,这样对于任务堆栈内存大小的要求大大降低。
[0051]从上面描述可以看出,本发明实施例针对原有的MIPS32下移植μ COS-1I的不足进行改进,提供了一种新的中断处理方法,提高了中断的响应速度和减少了 RAM的使用。
[0052]图5是本发明实施例的中断堆栈与任务堆栈分开设计时中断处理流程图,如图5所示,具体包括如下处理:
[0053]步骤1,定义一个中断堆栈数组,用于后续在进行中断处理时,保存嵌套中断的上下文。
[0054]步骤2,在操作系统初始化时,驱动程序初始化之前,先对中断进行初始化,配置所有中断的优先级,以及触发模式(电平触发或者边缘触发),并禁用所有中断。
[0055]步骤3,在驱动程序的初始化中,取得相关的中断号,然后将相关的中断处理程序与中断号相对应。在EIC模式下,每个中断对应的入口地址都不同,因此,必须在使能中断之前将中断处理程序拷贝到其对应的向量入口地址去。设置中断向量间隔为32字节,处理代码为跳转指令,让所有的中断都跳转到同一个通用处理流程中。
[0056]步骤4,当中断发生时,首先保存现场:保存MIPS通用寄存器和SR、EPC寄存器等到堆栈上。可以使用KO和Kl这两个保留给中断的专用寄存器,根据ABI规范,t(Tt9寄存器在使用前不需保存,可以不用保存它们。
[0057]步骤5,读取OSIntNesting的数值,判断当前是否处于中断嵌套状态,如果是首次进入中断,则保存任务现场到任务堆栈中。
[0058]步骤6,更新堆栈指针,使其指向到步骤I定义的中断堆栈。这样后续在发生中断的时候,就把前面中断的上下文保存在该中断堆栈上。
[0059]步骤7,跳转至0S_IntEnter函数,通知操作系统开始中断处理。
[0060]步骤8,读取Cause寄存器的请求中断优先级(Requested Interrupt Priority,简称为RIPL)数值,获取该中断的优先级,将该值设置到SR的IPL位上,这样只有高于此优先级的中断才会被CPU识别。
[0061 ] 步骤9,将SR中的KSU位、ERL位、以及EXL位清零。
[0062]步骤10,将堆栈指针递减,分配堆栈给中断处理程序的参数。
[0063]步骤11,获取当前中断优先级,跳转到中断处理程序进行处理。
[0064]步骤12,修改SR中的IPL位,进入kernel模式:ERL位、EXL位为0,同时打开中断,允许中断嵌套。
[0065]步骤13,释放堆栈。
[0066]步骤14,修改SR中的EXL位,使其置1,禁止中断。
[0067]步骤15,调用0S_IntExit函数,通知操作系统退出中断处理,如果是嵌套中断最外层,则触发一次任务调度。
[0068]步骤16,通过读取OSIntNesting来判断中断是否还在嵌套,如果没有中断嵌套,则进行步骤17处理,如果是中断嵌套,则进行步骤18处理。
[0069]步骤17,从任务堆栈中恢复现场,通过eret指令,退出中断,返回被打断的任务继续执行。
[0070]步骤18,从中断堆栈中恢复CPU状态寄存器。
[0071]步骤19,从中断堆栈中恢复CPU的异常返回地址寄存器EPC。[0072]步骤20,从中断堆栈中恢复CPU的通用寄存器。
[0073]步骤21,通过eret指令,从中断返回。
[0074]综上所述,借助于本发明实施例的技术方案,通过在内存中专门开辟出一块区域,作为中断堆栈使用,发生中断嵌套时的压栈和出栈操作都只使用中断堆栈,从而将任务堆栈与中断堆栈分离,使得在计算任务堆栈大小时,不需要把中断处理(包括中断嵌套)中的内存占用计算到任务堆栈中,只需考虑任务本身及首次中断时所占用的RAM空间大小,提高了 RAM的使用效率,进而给上层预留了更多的RAM空间。此外,将所有的中断嵌套中的寄存器压栈都压在中断堆栈中,这样对于任务堆栈内存大小的要求大大降低。
[0075]装置实施例
[0076]根据本发明的实施例,提供了 一种中断处理装置,适用于基于MIPS32作为处理器并且以μ COS-1I作为操作系统的平台,图6是本发明实施例的中断处理装置的结构示意图,如图6所示,根据本发明实施例的中断处理装置包括:初始化模块60、第一中断处理模块61、第二中断处理模块62、第三中断处理模块63、中断恢复模块64、以及任务恢复模块65以下对本发明实施例的各个模块进行详细的说明。
[0077]初始化模块60,用于在系统进行初始化时,对中断及其驱动程序进行初始化;
[0078]初始化模块60具体用于:配置所有中断的优先级和触发模式,并禁用所有中断,其中,触发模式包括:电平触发或者边缘触发;获取所有中断的中断号,将相应的中断处理程序与中断号相对应;在使能中断之前将中断处理程序拷贝到其对应的中断向量入口地址上,其中,中断向量之间的间隔为32字节。
[0079]第一中断处理模块61,用于在执行当前任务时发生中断的情况下,将中断现场的上下文信息保存到预先设置的中断堆栈中,并判断是否为中断嵌套,如果判断为否,调用第二中断处理模块62,否则,调用第三中断处理模块63 ;
[0080]第一中断处理模块61具体用于:将中断现场的无内部互锁流水级的微处理器MIPS通用寄存器、状态寄存器SR、以及例外程序寄存器EPC中的信息保存到预先设置的中断堆栈中。
[0081]第二中断处理模块62,用于将当前任务现场的上下文信息保存到预先设置的任务堆栈中,并将堆栈指针SP移到中断堆栈,调用第三中断处理模块63 ;
[0082]第二中断处理模块62具体用于:依次将当前任务现场的程序计数器PC、SP、相关寄存器中的信息、以及中断返回地址保存到预先设置的任务堆栈中,其中相关寄存器包括SR和其他相关通用寄存器;将指向最后一个压栈内容的当前任务现场指针保存到预定函数中,其中,当前任务现场指针在恢复当前任务时出栈使用。
[0083]第三中断处理模块63,用于通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理,并判断是否处于中断嵌套,如果判断为是,调用中断恢复模块64,否则,调用任务恢复模块65 ;
[0084]第三中断处理模块63具体用于:跳转至操作系统中断进入0S_IntEnter函数,通知系统开始进入中断处理;读取原因CAUSE寄存器的请求中断优先级RIPL位,获取中断的优先级,并将中断的优先级设置到SR的中断优先级IPL位上;将SR中的KSU位、ERL位、以及EXL位清零;将SP递减,分配中断堆栈给中断处理程序的参数;从SR的IPL位上获取中断的优先级,根据该优先级跳转到中断处理程序进行处理;修改SR的IPL位,并将SR的ERL位和EXL位设置为零,同时打开中断,使能中断嵌套;释放中断堆栈,并将SR的EXL位置为1,禁止中断;跳转至系统中断退出OS_IntExit函数,通知系统退出中断处理。
[0085]中断恢复模块64,用于从中断堆栈中恢复保存的当前中断现场的上下文信息,并返回上层中断继续执行;
[0086]任务恢复模块65,用于从任务堆栈中恢复保存的当前任务现场的上下文信息,并返回被打断的当前任务继续执行。
[0087]以下结合附图,对本发明实施例的上述技术方案进行详细的说明。
[0088]图2是本发明实施例的任务堆栈初始化的示意图,如图2所示,在任务堆栈在初始化时,主要进行如下处理:1、准备好将来任务运行开始时CPU寄存器应处的状态(正确值);
2、定位好程序计数器(PC),如果数据设计合理,任务被执行时,CPU便会按照预设计划运行。
[0089]在任务首次运行时,PC指针(即任务函数指针)将定位到任务代码的第一行,由于任务代码尚未被执行过,故代码中的变量与CPU的其它寄存器没有关系,简单的方法是将其赋为O ;经过入栈和出栈,此时堆栈指针(StackPointer,简称为SP)指向任务堆栈的最底端(就是已经定义好的任务堆栈数组的最后一个元素)。
[0090]通过在内存中专门开辟出一块区域,作为中断堆栈使用,发生中断嵌套时的压栈和出栈操作都只使用它。从而将任务堆栈与中断堆栈分离,使得在计算任务堆栈大小时,不需要把中断处理(包括中断嵌套)中的内存占用计算到任务堆栈中,只需考虑任务本身及首次中断时所占用的RAM空间大小,提高了 RAM的使用效率,进而给上层预留了更多的RAM空间。
[0091]图3是本发明实施例的中断堆栈与任务堆栈分开后任务执行过程中首次中断时堆栈变化情况示意图,如图3所示,中断堆栈与任务堆栈分开后,当任务执行过程中发生中断时,首先,在任务堆栈中,PC和SP被系统压栈,然后将CPU的相关寄存器压栈,同时将CPU的状态寄存器(Staus Register,简称为SR)以及中断返回地址压栈,任务堆栈压栈后任务现场指针指向最后一个压栈内容,并将该值赋值给OSTCBCur,以便出栈使用,然后把SP调整到中断堆栈处。在中断处理过程中,可能会出现压栈的操作(中断处理的函数调用),那么这种情况下SP的指针会随之移动。
[0092]图4是本发明实施例的中断嵌套时中断堆栈变化情况的示意图,如图4所示,当中断发生嵌套时,SP已经被移到中断堆栈中,只有到中断退出时(中断嵌套最外层)才把SP移到任务堆栈。所以在中断嵌套时,对于中断的处理和第一次产生中断是一样的,所不同的是:保存在堆栈中的不是任务运行中的寄存器,而是中断处理中的寄存器,而且不是保存在任务堆栈而是中断堆栈中。MIPS的EIC模式支持64个中断源,O级不能用,因此最多有62层的中断嵌套。考虑最深嵌套时所需的堆栈大小为:62*(32*4)=8K,如果用任务堆栈保存,则需要任务数Ν*8Κ,从这里可以看出优化内存的效果:所有的中断嵌套中的寄存器压栈都压在中断堆栈中,这样对于任务堆栈内存大小的要求大大降低。
[0093]从上面描述可以看出,本发明实施例针对原有的MIPS32下移植μ COS-1I的不足进行改进,提供了一种新的中断处理方法,提高了中断的响应速度和减少了 RAM的使用。
[0094]图5是本发明实施例的中断堆栈与任务堆栈分开设计时中断处理流程图,如图5所示,具体包括如下处理:[0095]步骤1,定义一个中断堆栈数组,用于后续在进行中断处理时,保存嵌套中断的上下文。
[0096]步骤2,在操作系统初始化时,驱动程序初始化之前,先对中断进行初始化,配置所有中断的优先级,以及触发模式(电平触发或者边缘触发),并禁用所有中断。
[0097]步骤3,在驱动程序的初始化中,取得相关的中断号,然后将相关的中断处理程序与中断号相对应。在EIC模式下,每个中断对应的入口地址都不同,因此,必须在使能中断之前将中断处理程序拷贝到其对应的向量入口地址去。设置中断向量间隔为32字节,处理代码为跳转指令,让所有的中断都跳转到同一个通用处理流程中。
[0098]步骤4,当中断发生时,首先保存现场:保存MIPS通用寄存器和SR、EPC寄存器等到堆栈上。可以使用KO和Kl这两个保留给中断的专用寄存器,根据ABI规范,t(Tt9寄存器在使用前不需保存,可以不用保存它们。
[0099]步骤5,读取OSIntNesting的数值,判断当前是否处于中断嵌套状态,如果是首次进入中断,则保存任务现场到任务堆栈中。
[0100]步骤6,更新堆栈指针,使其指向到步骤I定义的中断堆栈。这样后续在发生中断的时候,就把前面中断的上下文保存在该中断堆栈上。
[0101]步骤7,跳转至0S_IntEnter函数,通知操作系统开始中断处理。
[0102]步骤8,读取Cause寄存器的请求中断优先级(Requested Interrupt Priority,简称为RIPL)数值,获取该中断的优先级,将该值设置到SR的IPL位上,这样只有高于此优先级的中断才会被CPU识别。
[0103]步骤9,将SR中的KSU位、ERL位、以及EXL位清零。
[0104]步骤10,将堆栈指针递减,分配堆栈给中断处理程序的参数。
[0105]步骤11,获取当前中断优先级,跳转到中断处理程序进行处理。
[0106]步骤12,修改SR中的IPL位,进入kernel模式:ERL位、EXL位为0,同时打开中断,允许中断嵌套。
[0107]步骤13,释放堆栈。
[0108]步骤14,修改SR中的EXL位,使其置1,禁止中断。
[0109]步骤15,调用0S_IntExit函数,通知操作系统退出中断处理,如果是嵌套中断最外层,则触发一次任务调度。
[0110]步骤16,通过读取OSIntNesting来判断中断是否还在嵌套,如果没有中断嵌套,则进行步骤17处理,如果是中断嵌套,则进行步骤18处理。
[0111]步骤17,从任务堆栈中恢复现场,通过eret指令,退出中断,返回被打断的任务继续执行。
[0112]步骤18,从中断堆栈中恢复CPU状态寄存器。
[0113]步骤19,从中断堆栈中恢复CPU的异常返回地址寄存器EPC。
[0114]步骤20,从中断堆栈中恢复CPU的通用寄存器。
[0115]步骤21,通过eret指令,从中断返回。
[0116]综上所述,借助于本发明实施例的技术方案,通过在内存中专门开辟出一块区域,作为中断堆栈使用,发生中断嵌套时的压栈和出栈操作都只使用中断堆栈,从而将任务堆栈与中断堆栈分离,使得在计算任务堆栈大小时,不需要把中断处理(包括中断嵌套)中的内存占用计算到任务堆栈中,只需考虑任务本身及首次中断时所占用的RAM空间大小,提高了 RAM的使用效率,进而给上层预留了更多的RAM空间。此外,将所有的中断嵌套中的寄存器压栈都压在中断堆栈中,这样对于任务堆栈内存大小的要求大大降低。
[0117]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0118]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0119]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。
[0120]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0121]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0122]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
【权利要求】
1.一种中断处理方法,其特征在于,适用于基于MIPS32作为处理器并且以μ COS-1I作为操作系统的平台,所述方法包括: 步骤1,在系统进行初始化时,对中断及其驱动程序进行初始化,在执行当前任务时发生中断的情况下,将中断现场的上下文信息保存到预先设置的中断堆栈中,并判断是否为中断嵌套,如果判断为否,执行步骤2,否则,执行步骤3 ; 步骤2,将当前任务现场的上下文信息保存到预先设置的任务堆栈中,并将堆栈指针SP移到所述中断堆栈,执行步骤3 ; 步骤3,通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理,并判断是否处于中断嵌套,如果判断为是,执行步骤4,否则,执行步骤5 ; 步骤4,从所述中断堆栈中恢复保存的所述当前中断现场的上下文信息,并返回上层中断继续执行; 步骤5,从所述任务堆栈中恢复保存的所述当前任务现场的上下文信息,并返回被打断的所述当前任务继续执行。
2.如权利要求1所述的方法,其特征在于,在系统进行初始化时,对中断及其驱动程序进行初始化具体包括: 配置所有中断的优先级和触发模式,并禁用所有中断,其中,所述触发模式包括:电平触发或者边缘触发; 获取所有中断的中断号,将相应的中断处理程序与所述中断号相对应; 在使能中断之前将中断处理程序拷贝到其对应的中断向量入口地址上,其中,所述中断向量之间的间隔为32字节。
3.如权利要求1所述的方法,其特征在于,将中断现场的上下文信息保存到预先设置的中断堆栈中具体包括:将中断现场的无内部互锁流水级的微处理器MIPS通用寄存器、状态寄存器SR、以及例外程序寄存器EPC中的信息保存到预先设置的中断堆栈中。
4.如权利要求1所述的方法,其特征在于,将当前任务现场的上下文信息保存到预先设置的任务堆栈中具体包括: 依次将当前任务现场的程序计数器PC、SP、相关寄存器中的信息、以及中断返回地址保存到预先设置的任务堆栈中,其中所述相关寄存器包括SR和其他相关通用寄存器; 将指向最后一个压栈内容的当前任务现场指针保存到预定函数中,其中,所述当前任务现场指针在恢复当前任务时出栈使用。
5.如权利要求1所述的方法,其特征在于,通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理具体包括: 跳转至操作系统中断进入0S_IntEnter函数,通知系统开始进入中断处理; 读取原因CAUSE寄存器的请求中断优先级RIPL位,获取所述中断的优先级,并将所述中断的优先级设置到SR的中断优先级IPL位上; 将SR中的KSU位、ERL位、以及EXL位清零; 将SP递减,分配所述中断堆栈给所述中断处理程序的参数; 从所述SR的IPL位上获取所述中断的优先级,根据该优先级跳转到所述中断处理程序进行处理; 修改所述SR的IPL位,并将所述SR的ERL位和EXL位设置为零,同时打开中断,使能中断嵌套; 释放所述中断堆栈,并将所述SR的EXL位置为1,禁止中断; 跳转至系统中断退出OS_IntExit函数,通知系统退出中断处理。
6.一种中断处理装置,其特征在于,适用于基于MIPS32作为处理器并且以μ COS-1I作为操作系统的平台,所述装置包括: 初始化模块,用于在系统进行初始化时,对中断及其驱动程序进行初始化; 第一中断处理模块,用于在执行当前任务时发生中断的情况下,将中断现场的上下文信息保存到预先设置的中断堆栈中,并判断是否为中断嵌套,如果判断为否,调用第二中断处理模块,否则,调用 第三中断处理模块; 第二中断处理模块,用于将当前任务现场的上下文信息保存到预先设置的任务堆栈中,并将堆栈指针SP移到所述中断堆栈,调用第三中断处理模块; 第三中断处理模块,用于通知系统开始进入中断处理,读取中断优先级,打开中断,使能中断嵌套,并在执行中断处理程序后,禁止中断,通知系统退出中断处理,并判断是否处于中断嵌套,如果判断为是,调用中断恢复模块,否则,调用任务恢复模块; 中断恢复模块,用于从所述中断堆栈中恢复保存的所述当前中断现场的上下文信息,并返回上层中断继续执行; 任务恢复模块,用于从所述任务堆栈中恢复保存的所述当前任务现场的上下文信息,并返回被打断的所述当前任务继续执行。
7.如权利要求6所述的装置,其特征在于,所述初始化模块具体用于: 配置所有中断的优先级和触发模式,并禁用所有中断,其中,所述触发模式包括:电平触发或者边缘触发; 获取所有中断的中断号,将相应的中断处理程序与所述中断号相对应; 在使能中断之前将中断处理程序拷贝到其对应的中断向量入口地址上,其中,所述中断向量之间的间隔为32字节。
8.如权利要求6所述的装置,其特征在于,所述第一中断处理模块具体用于: 将中断现场的无内部互锁流水级的微处理器MIPS通用寄存器、状态寄存器SR、以及例外程序寄存器EPC中的信息保存到预先设置的中断堆栈中。
9.如权利要求6所述的装置,其特征在于,所述第二中断处理模块具体用于: 依次将当前任务现场的程序计数器PC、SP、相关寄存器中的信息、以及中断返回地址保存到预先设置的任务堆栈中,其中所述相关寄存器包括SR和其他相关通用寄存器; 将指向最后一个压栈内容的当前任务现场指针保存到预定函数中,其中,所述当前任务现场指针在恢复当前任务时出栈使用。
10.如权利要求6所述的装置,其特征在于,所述第三中断处理模块具体用于: 跳转至操作系统中断进入0S_IntEnter函数,通知系统开始进入中断处理; 读取原因CAUSE寄存器的请求中断优先级RIPL位,获取所述中断的优先级,并将所述中断的优先级设置到SR的中断优先级IPL位上; 将SR中的KSU位、ERL位、以及EXL位清零;将SP递减,分配所述中断堆栈给所述中断处理程序的参数; 从所述SR的IPL位上获取所述中断的优先级,根据该优先级跳转到所述中断处理程序进行处理; 修改所述SR的IPL位,并将所述SR的ERL位和EXL位设置为零,同时打开中断,使能中断嵌套; 释放所述中断堆栈,并将所述SR的EXL位置为1,禁止中断; 跳转至系统中断退出OS_IntExit函数,通知系统退出中断处理。
【文档编号】G06F9/48GK103778009SQ201210397619
【公开日】2014年5月7日 申请日期:2012年10月18日 优先权日:2012年10月18日
【发明者】韩美卿, 于光海 申请人:深圳市中兴微电子技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1