CN116235143A - 处理装置 - Google Patents
处理装置 Download PDFInfo
- Publication number
- CN116235143A CN116235143A CN202180064832.8A CN202180064832A CN116235143A CN 116235143 A CN116235143 A CN 116235143A CN 202180064832 A CN202180064832 A CN 202180064832A CN 116235143 A CN116235143 A CN 116235143A
- Authority
- CN
- China
- Prior art keywords
- register
- processor
- stack
- value
- push
- 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.)
- Pending
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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30101—Special purpose registers
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
- G06F9/30116—Shadow registers, e.g. coupled registers, not forming part of the register space
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/30123—Organisation of register space, e.g. banked or distributed register file according to context, e.g. thread buffers
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
- Logic Circuits (AREA)
Abstract
一种处理装置(20)具有:处理器(200),其包括多个延迟压入处理器寄存器(214)和处理器寄存器控制电路(220、222、224、226、228)。处理器寄存器控制电路(220、222、224、226、228)包括多个状态寄存器(226),每个状态寄存器(226)对应于各自不同的延迟压入寄存器(214)。处理器寄存器控制电路(220、222、224、226、228)被配置成:检测向延迟压入寄存器(214)中的寄存器(214)写入新值;以及确定延迟压入寄存器(214)的状态寄存器(226)是否具有指示延迟压入寄存器(214)的未保存状态的第一值。处理器控制电路(220、222、224、226、228)被配置成,当状态寄存器(226)具有第一值时:在将新值写入延迟压入寄存器(214)完成之前从延迟压入寄存器(214)读取当前值;将当前值写入存储器(202);以及将延迟压入寄存器(214)的状态寄存器(226)设置为指示延迟压入寄存器(214)的已保存状态的第二值。
Description
背景技术
本发明涉及一种处理装置。
处理器通常包含一组用于存储数字值的处理器寄存器(通常称为寄存器文件)、用于对处理器寄存器中存储的值执行算术和逻辑运算的算术和逻辑单元(ALU)、以及用于将软件指令加载到计算单元中的控制单元。它还具有总线接口,用于将软件指令接收到处理器中并且用于从处理器读取数据值和将数据值写入其他部件,例如随机存取存储器(RAM)和外围设备。处理器通常还会具有用于接收硬件中断信号的接口。
正常的指令周期涉及从由被称为程序计数器(PC)的特殊处理器寄存器表示的存储器地址将下一条指令获取到处理器中。然后处理器执行指令并且更新程序计数器,以便获取适当的下一条指令。
然而,如果处理器接收到中断请求,则处理器必须通过将程序计数器和某些处理器寄存器(例如调用者保存的寄存器)的当前值保存到(压入)RAM中的堆栈结构来执行上下文切换。
一些处理器会在跳转到中断处理程序以服务于中断之前自动进行这种堆栈操作,即作为硬件动作。然后中断处理程序可以在其执行期间自由地使用保存的处理器寄存器值。当中断处理程序返回时,处理器自动从堆栈读取(弹出)保存的寄存器值以及将它们写入对应的处理器寄存器。处理器还设置程序计数器,使得软件从接收到中断的点继续执行。
然而,这样将寄存器值保存到RAM在处理器时间(时钟周期)和总线负载二者上均有代价。因此,它可能会对系统的响应能力或延时产生重大影响。
一些处理器试图通过提供可以在切换上下文时使用的第二寄存器文件来减少将寄存器值压入RAM的需求。然而,这种方法增加了处理器的尺寸和复杂度,并且不支持嵌套中断。
在其他处理器中,处理中断之后必须恢复的处理器寄存器的压入是在软件中实现的,即由处理器执行中断处理程序中的函数序言中包含的指令。然而,由于需要获取和执行这些指令,这也会增加延时。
本发明试图提供一种新方法,其可以实现更高效的处理器上下文切换。
发明内容
从第一方面,本发明提供了一种处理装置,包括处理器,其中:
处理器包括多个延迟压入处理器寄存器;
处理器包括处理器寄存器控制电路;
处理器寄存器控制电路包括多个状态寄存器,每个状态寄存器对应于各自不同的延迟压入寄存器;
处理器寄存器控制电路被配置成检测向延迟压入寄存器中的寄存器写入新值;
处理器寄存器控制电路被配置成确定延迟压入寄存器的状态寄存器是否保存指示延迟压入寄存器的未保存状态的第一值;以及
处理器寄存器控制电路被配置成,当状态寄存器保存第一值时:在将新值写入延迟压入寄存器完成之前,从延迟压入寄存器读取当前值;将当前值写入存储器;以及将延迟压入寄存器的状态寄存器设置为指示延迟压入寄存器的已保存状态的第二值。
从第二方面,本发明提供了一种操作处理装置的方法,其中:
处理装置包括处理器;
处理器包括多个延迟压入处理器寄存器;以及
处理器包括多个状态寄存器,每个状态寄存器对应于各自不同的延迟压入寄存器,
该方法包括:
检测向延迟压入寄存器中的寄存器写入新值;
确定延迟压入寄存器的状态寄存器保存指示延迟压入寄存器的未保存状态的第一值;
在将新值写入延迟压入寄存器完成之前从延迟压入寄存器读取当前值;
将当前值写入存储器;以及
将延迟压入寄存器的状态寄存器设置为指示延迟压入寄存器的已保存状态的第二值。
因此,将看到,根据本发明,处理器设置有:与某些处理器寄存器相关联的附加状态寄存器(为便于参考,本文称为“延迟压入”寄存器)、以及使处理器能够使用状态寄存器来确定每个延迟压入寄存器是否已被压入存储器(例如到RAM堆栈)的电路。这时,处理器不需要在执行上下文切换时立即将这些寄存器压入堆栈,而是可以延迟如此操作,直到诸如每个相应的寄存器在新上下文中被实际写入的时间为止。如果这些延迟压入寄存器中的一个或更多个在新上下文中从未改变,则此机制允许处理器完全避免必须将这些寄存器压入堆栈,从而节省总线事务和/或处理器周期。
因此,与处理器硬件在切换上下文后立即压入在从中断处理程序返回时需要恢复的所有处理器寄存器相比,这种方法可以促进更高的效率。它还可以比要求被调用的例程(例如中断处理程序)借助软件指令压入和弹出这些处理器寄存器更高效,因为其避免了获取和执行这些指令的需求。
在一些实施方式中,状态寄存器是单比特位寄存器。它们可以是单独的触发器。它们可以是多比特位状态寄存器中的标志。第一值和第二值可以是相反的逻辑电平,即逻辑1和逻辑0。相同的第一值可以表示所有状态寄存器中的未保存状态。
延迟压入处理器寄存器可以是调用者保存的寄存器,即通常不会由被调用函数中的软件将其压入堆栈的寄存器。它们可以是多比特位寄存器,例如均为32比特位或64比特位寄存器。处理器可以包括不是延迟压入寄存器的另外的处理器寄存器,诸如被调用者保存的寄存器和特殊寄存器,它们没有对应的状态寄存器并且处理器寄存器控制电路未被布置成检测对其的写入。
处理器可以包括用于接收硬件中断请求的一个或多个硬件中断输入端。处理器寄存器控制电路可以被配置成响应于处理器接收到硬件中断请求而将所有状态寄存器设置为第一(未保存)值。
存储器可以是随机存取存储器,诸如SRAM。处理装置可以包括存储器。它可以包括将处理器连接到存储器的总线。处理器可以被配置成将当前值写入存储器中的堆栈结构。处理器可以包括堆栈指针寄存器,其可用于确定将处理器寄存器值压入和/或弹出到的地址。具体地,它可以使用堆栈指针寄存器中存储的堆栈指针值来确定将不是多个延迟压入处理器寄存器之一的处理器寄存器压入的存储器地址。在一些实施方式中,处理器寄存器控制电路还可以使用堆栈指针寄存器来确定(可能间接地)将延迟压入寄存器的所述当前值压入的存储器地址,但是这在所有实施方式中不是必需的,如下文说明的那样。
处理器寄存器控制电路可以包括寄存器,在本文中称为上下文堆栈指针或CSP,其尺寸优选地被设置为例如在存储器中的堆栈结构中保存存储器中的地址,有时其可以是堆栈指针的当前值的副本。处理器寄存器控制电路可以被配置成使用存储在上下文堆栈指针寄存器中的上下文堆栈指针值来确定将延迟压入寄存器压入或弹出的存储器地址。
在一些实施方式中,处理器寄存器控制电路可以将压入的延迟压入寄存器值与其他压入的处理器寄存器值一起存储在公共堆栈结构中,而在其他实施方式中,它可以维护分离的上下文堆栈以接收压入的延迟压入寄存器值,其不同于用于接收其他压入的处理器寄存器值的主堆栈。
在第一组实施方式中,处理器可以被配置成将延迟压入寄存器值和其他处理器寄存器值存储在公共堆栈结构中。它可以被配置成,响应于接收到硬件中断请求,根据与存储器的至少大到足以保存所有延迟压入寄存器值的一部分相对应的量(在本文中称为堆栈帧尺寸),改变堆栈指针(即堆栈指针寄存器的值)。它可以根据至少足以存储以下各项的量来改变堆栈指针:所有延迟压入寄存器值、程序计数器值、与延迟压入寄存器相关联的状态寄存器、以及上下文堆栈指针。这样,可以在堆栈中预留足够的空间用于接收稍后需要将其压入的任何延迟压入寄存器。
处理器寄存器控制电路可以被配置成,响应于接收到硬件中断请求,将程序计数器和/或状态寄存器(例如通过压入包括状态寄存器的多比特位状态寄存器)和/或上下文堆栈指针压入由堆栈指针寄存器中存储的尺寸的值确定的存储器中的地址。处理器寄存器控制电路可以被配置成,在压入上下文堆栈指针之后,将值(即当前堆栈指针)从堆栈指针寄存器复制到上下文堆栈指针寄存器。在复制之前,堆栈指针可能已根据堆栈帧尺寸改变。通过将状态寄存器和上下文堆栈指针压入堆栈,处理装置可以支持嵌套中断(例如较高优先级中断较低优先级的中断处理程序),可能到达任何深度,仅受可用堆栈空间的限制。
处理器寄存器控制电路可以被配置成使用上下文堆栈指针来确定将延迟压入处理器寄存器的值压入的地址。它可以通过对上下文堆栈指针寄存器中的值施加偏移来确定地址。处理器寄存器控制电路可以包括用于确定地址的硬连线逻辑部。每个延迟压入寄存器可以与各自不同的恒定偏移相关联。这样,每个延迟压入寄存器在预留的堆栈帧内具有各自的预留位置。
在第二组实施方式中,处理器可以被配置成将延迟压入寄存器值存储在上下文堆栈中,该上下文堆栈不同于用于存储一个或更多个其他处理器寄存器的值的堆栈。上下文堆栈指针寄存器可用于独立于堆栈指针寄存器来维护上下文堆栈。处理器寄存器控制电路可以包括多个多比特位位置寄存器,每个位置寄存器对应于各自不同的延迟压入寄存器。处理器寄存器控制电路可以被配置成,在将延迟压入寄存器压入存储器中的地址时,将值存储在对应的位置寄存器中,该值相对于上下文堆栈指针寄存器的值对地址进行编码,例如作为相对于延迟压入寄存器被压入时的CSP中的地址值的偏移。这样,延迟压入寄存器不需要有固定的预定偏移,从而避免即使仅需要压入子集也仍需要预留足够大的堆栈帧来接收所有延迟压入寄存器;相反,压入的值可以更高效地装载在存储器中。处理器寄存器控制电路可以被配置成将延迟压入寄存器的值压入如下地址:该地址取决于其关联的状态寄存器等于第二(已保存)值的延迟压入寄存器的数量。可以将延迟压入寄存器压入存储器中的在预定方向上(即在整个地址空间中递增或递减)在上下文堆栈指针之后的下一个未占用地址。这样,通过将延迟压入寄存器压入连续(即相邻)的存储器地址,而不是在预留的堆栈帧中留下间隙,可以更高效地使用存储器。该地址还可以取决于上下文堆栈指针。在这些实施方式中,上下文堆栈指针可以完全独立于堆栈指针(即永远不设置为等于堆栈指针),并且可以指向存储器中的不同于堆栈指针指向的地址的分离的区域中的地址,即指向与主调用堆栈不同的分离的上下文堆栈。处理器寄存器控制电路可以将程序计数器和/或状态寄存器和/或上下文堆栈指针压入存储器中的地址,该地址由上下文堆栈指针寄存器中存储的值而非堆栈指针确定。
在一些实施方式中,处理器寄存器控制电路被配置成,响应于检测到从中断处理程序例程返回,确定每个延迟压入寄存器的状态寄存器是否保存指示延迟压入寄存器的已保存状态的第二值。它可以被配置成,当状态寄存器保存第二值时:从存储器读取延迟压入寄存器的压入值,以及将压入值写入延迟压入寄存器。通过仅恢复(弹出)其内容实际上被中断处理程序改变的延迟压入寄存器,实施方式可以进一步限制从中断返回时所需的处理器周期和/或总线事务的数量。
处理器寄存器控制电路可以被配置成支持尾链中断处理,即连续处理两个或更多个中断,而在处理连续中断之中不返回接收到第一中断请求时正在执行的过程。处理器可以被配置成,当第二中断挂起时从第一中断处理程序返回时不弹出压入的上下文堆栈指针和寄存器状态值。
处理器寄存器控制电路可以以任何适当的方式检测对延迟压入寄存器的写入。例如,它可以被布置成接收由处理器中的指令解码器输出的多路复用器控制信号。它可以使用该控制信号来检测对延迟压入寄存器的写入。
存储器可以存储由处理器执行的软件。存储器可以存储中断向量表。该软件可以包括一个或更多个中断处理程序,其可以被存储在中断向量表中标识的地址处。处理器可以被配置成响应于接收到硬件中断请求信号而跳转到一个中断处理程序。在一些实施方式中,中断处理程序可以被配置成将一个或更多个另外的处理器寄存器压入存储器。它可以包括改变一个或更多个延迟压入处理器寄存器中的值的指令。
处理装置可以是集成电路设备。它可以是片上系统(SoC)。
本文描述的任何方面或实施方式的特征可以在适当的情况下应用于本文描述的任何其他方面或实施方式。在提及不同实施方式或实施方式组的情况下,应当理解这些不一定不同但可以重叠。
附图说明
现将参考附图仅通过示例的方式描述本发明的某些优选实施方式,其中:
图1是传统的片上系统(SoC)的示意图;
图2是实施本发明的片上系统(SoC)的示意图;
图3是示出在图2的SoC处理中断请求时的不同阶段的时序图;
图4是在处理中断请求的不同阶段的图2的SoC的存储器的内容的示意图;
图5是示出在图2的SoC以抢占方式处理两个中断请求时的不同阶段的时序图;
图6和图7是在以抢占方式处理中断请求的不同阶段的图2的SoC的存储器的内容的示意图;
图8是示出在图2的SoC以快速中断转换处理两个中断的不同阶段的时序图;
图9和图10是在以快速中断转换处理中断请求的不同阶段的图2的SoC的存储器的内容的示意图;
图11是使用寄存器位置比特位来提供更高的存储器空间效率的实施本发明的第二片上系统(SoC)的示意图;
图12是图11的SoC的本地堆栈状态寄存器的示意图;
图13是示出在图11的SoC以高效的存储器使用率处理两个中断时的不同阶段的时序图;以及
图14和图15是以高效的存储器使用率处理中断请求的不同阶段的图11的SoC的存储器的内容的示意图。
具体实施方式
出于参考目的,图1示出了包括耦接到存储器102的处理器100的传统的片上系统(SoC)10的示意图。存储器102可以包括通过系统总线连接到处理器100的SRAM。它还可以包括非易失性存储器,诸如闪存。处理器100可以可选地包括存储器高速缓存(未示出)。SoC10可以包括另外的处理器、外围设备等。
处理器100包括指令解码器104、算术逻辑单元(ALU)106、寄存器文件108、多个多路复用器109-110和多路解复用器112。寄存器文件108包括多个(例如八个)调用者保存的处理器寄存器114、多个被调用者保存的处理器寄存器116、程序计数器(PC)寄存器117和堆栈指针(SP)寄存器118。寄存器文件108还包含其他标准处理器寄存器(为简单起见从图1省略),诸如状态寄存器和链接寄存器。程序计数器(PC)寄存器117包含当前由处理器100执行的指令的地址。寄存器文件108内的每个寄存器包括多个触发器,例如三十二个触发器,用于存储处理器100在执行指令期间需要的值。
调用者保存的寄存器114用于保存临时值。与被调用者保存的寄存器116相反,被调用函数不需要在进入时保存这些值并且在返回前恢复它们。相反,如果调用函数需要保留这些寄存器114,则调用函数负责将它们的值存储在存储器102中。被调用者保存的寄存器116用于保存应该跨函数调用保留的长期值,这些值在存储器102中的存储和恢复由被调用的例程(即被调用者)控制。
在正常操作条件下,ALU 106对寄存器文件108内的寄存器进行写入和读取以便执行指令。为了对寄存器进行写入,ALU 106将值输出到多路复用器109,多路复用器109转而将值输出到多路解复用器112。指令解码器104将期望写入位置(即期望寄存器)输出到多路解复用器112,使多路解复用器112能够将值引导至寄存器文件108内的期望寄存器。为了从寄存器读取数据,数据从期望寄存器输出到多路复用器110。指令解码器104将期望读取位置(即期望寄存器)输出到多路复用器110,使多路复用器能够连接期望寄存器作为ALU 106的输入。使用寄存器文件108中存储的值的所有计算均在ALU 106内执行。
为了执行指令,ALU 106向存储器102传送指令获取总线请求,其包含存储下一期望指令的地址(对应于PC)。存储器102然后将存储在该地址处的指令输出到解码器104,解码器104转而解码指令以便确定要由ALU 106执行的指令。
处理器100还能够向存储器102写入数据值和从存储器102读取数据值。为了将寄存器文件108内的寄存器中存储的值写入存储器102,如前所述,寄存器内存储的值由ALU106读取。该值然后由处理器100连同指向存储该值的位置的地址一起输出到存储器102。为了读取存储器102中存储的值以及将其存储在寄存器中,处理器100向存储器102传送读取请求(包含期望读取位置的地址)。然后存储器转而将期望地址处存储的值传送到多路复用器109,多路复用器109将该值输出到多路解复用器112。如前所述,解码器104控制多路解复用器112设置由多路复用器109输出的值应该存储在哪个寄存器中。
在指令执行期间,处理器100可以接收到例如来自外围设备的硬件中断请求。中断请求通知处理器100暂停执行当前例程,以便执行不同的更紧急的指令集,在中断处理程序完成之后返回到执行原始例程的同一状态。
在软件载入存储器102之后,存储器102将包含中断向量表(IVT)。这包括将中断请求列表与中断处理程序列表相关联的数据结构。当处理器100接收到中断请求时,处理器100使用向量表来确定相关联的中断处理程序的地址(即执行中断所需的指令),以便允许处理器100执行中断处理程序指令。
为了能够在处理中断之后恢复原始例程,处理器100需要将调用者保存的寄存器114中的值恢复到它们在执行指令处理程序之前所处的同一状态。在指令处理程序执行期间,允许覆盖调用者保存的寄存器(例如32比特位ArmTM处理器中的寄存器R0-R3),因此如果存储在其中的数据值未存储在其他地方,则处理器100不能从处理中断之前到达的点恢复执行原始指令。与例程函数调用相反,硬件中断可能随时发生,而不会向当前正在执行的例程发出任何警告。软件因此不能像它在调取例程函数调用之前可以做的那样地执行指令以将调用者保存的寄存器114保存到存储器102。
因此,在接收到中断请求时,处理器100将调用者保存的寄存器114内包含的所有数据自动存储在存储器102的堆栈中。“堆栈”是先入后出的数据结构。与堆栈一起使用的是堆栈指针(SP),其记录最近添加到堆栈的项目的地址;它被存储在堆栈指针(SP)寄存器118中。包含处理器100当前正在执行的指令的存储器地址的程序计数器(PC)寄存器117也被压入堆栈。还可以压入其他寄存器,诸如程序状态寄存器和链接寄存器。处理器100存储在存储器102中的堆栈内的来自调用者保存的寄存器114和特殊寄存器的值在下文中被称为中断的“上下文”数据。上下文数据通常具有固定的、预定的尺寸。
为了将数据存储在堆栈中,处理器100执行“压入”操作,从而将数据存储在堆栈的顶部处(即由堆栈指针指示的下一可用地址),并且SP递增以适应新存储数据的尺寸。(等效地,如果堆栈在地址空间中向下增长,则SP可以递减。)为了从堆栈读取数据,处理器100执行“弹出”操作,从而从存储器读取由SP指向的位置处存储的数据,并且SP递减所读取的数据的尺寸。
在存储上下文数据之后,处理器100从存储器中存储的IVT读取与接收到的中断请求相关联的中断处理程序的地址,以及将其存储在程序计数器寄存器117中。处理器100随后能够开始执行中断处理程序。中断处理程序可以包括将将要改变的任何被调用者保存的寄存器116(例如32比特位ArmTM处理器中的寄存器R4-R11)压入堆栈的函数序言,以及在返回之前将这些值弹回到适当的寄存器116的函数尾声。
一旦中断处理程序的执行完成,处理器100就不再需要在中断处理程序执行期间保存在调用者保存的寄存器114中的值。因此,处理器100通过从堆栈中弹出上下文数据以及将其保存在调用者保存的寄存器114中而将上下文数据从堆栈恢复到调用者保存的寄存器114。这使得处理器100能够从进程100开始执行中断处理程序的点恢复执行被中断的功能。
如果处理器100在执行第一中断处理程序期间接收到第二更高优先级的中断请求,则再次执行与上述完全相同的过程,处理器100将调用者保存的寄存器114中保存的所有值压入堆栈(第二中断的上下文数据)并且开始执行第二中断处理程序。可以通过这种方式处理多个嵌套中断。
图2示出了说明实施本发明的片上系统(SoC)20的示意图,其包括耦接到存储器202的处理器200。存储器202可以包括SRAM,其通过系统总线连接到处理器200。它还可以包括非易失性存储器,诸如闪存。处理器200可以可选地包括存储器高速缓存(未示出)。SoC20可以包括另外的处理器、外围设备等(为简单起见未在图2中示出)。
部件204-218与图1所示的对应的部件104-118相似或相同。
然而,处理器200还包括两个多路复用器220和222、以及逻辑单元228。此外,寄存器文件208还包括上下文堆栈指针(CSP)寄存器224和本地堆栈状态(LSS)寄存器226,其包括多个触发器(即多个比特位标志),用于存储多个单独的状态比特位,每个状态比特位与调用者保存的寄存器214中的一个相关联。状态比特位的数量等于调用者保存的寄存器214的数量(例如八个)。每个状态比特位用于指示自从处理器200接收到最新的硬件中断请求以来相关联的调用者保存的寄存器中保存的值是否已经压入(即保存)到堆栈,如下文将更详细描述的那样。如上文所公开的,这些附加元件一起提供处理器寄存器控制电路。如上文所公开的,调用者保存的寄存器214是“延迟压入”寄存器的示例。
尽管CSP寄存器224和LSS寄存器226在图2中被示出为集成到主寄存器文件208中,但应认识到,它们不必在物理上与寄存器文件208的其余部分相邻,而是可以位于芯片20上的任何位置。
当处理器200接收到中断时,与传统的处理器100不同,处理器200不会自动将调用者保存的寄存器214中保存的所有值(上下文数据)压入存储器202中的堆栈。相反,处理器200压入程序计数器217、上下文堆栈指针寄存器224和本地堆栈状态寄存器226中保存的值,并且通过使堆栈指针寄存器218中存储的堆栈指针递增等于存储所有调用者保存的寄存器114以及PC寄存器217、CSP寄存器224和LSS寄存器226中保存的值将需要的空间量的堆栈帧尺寸而简单地预留存储调用者保存的寄存器114中保存的所有的值所需的空间量。
一旦PC、CSP和LSS已经存储在存储器202中的堆栈中,处理器200就如上文参照图1描述的那样从存储器202中的中断向量表中读取中断处理程序地址。一旦堆栈指针已递增以预留堆栈帧尺寸,处理器200就将上下文堆栈指针(存储在CSP寄存器224内)设置为堆栈指针的值。然后处理器200使用CSP来确定存储中断处理程序的上下文数据的位置。如果在中断处理程序执行期间SP 218递增,则如在正常操作期间常见(因为处理器200可能需要在执行期间将更多项目压入堆栈)的那样,CSP保持不变,指向中断处理程序的上下文数据的位置。
在开始执行中断处理程序之前,处理器200设置LSS内的所有状态比特位的值以指示所有调用者保存的寄存器214中保存的值尚未存储在堆栈中,即指示“未保存”状态。
在中断处理程序执行期间,处理器200可以对一个或更多个调用者保存的寄存器214进行写入。为了做到这一点,ALU 206将要写入期望的调用者保存的寄存器的值输出到多路复用器209,多路复用器209转而将值输出到多路解复用器212。指令解码器204将期望写入位置(即期望的调用者保存的寄存器)发送给多路解复用器212,使多路解复用器212能够将值引导至期望的调用者保存的寄存器214。同时,解码器204将同一写入位置发送给多路复用器220。多路复用器220在接收到写入位置时,将该位置处的寄存器中当前存储的值耦接到逻辑单元228。
同时,逻辑单元228访问LSS寄存器226内存储的对应的单比特位状态值,逻辑单元228基于与寄存器214相关联的状态比特位的值,确定通过多路复用器220正在读取的调用者保存的寄存器是否已被保存到堆栈。如果状态比特位指示寄存器值还没有存储在堆栈中,则逻辑单元228将该值输出到多路复用器222,使得寄存器值被引导至存储器202;它还指示堆栈中应存储值的地址。如果状态比特位指示寄存器值已存储在堆栈中,则逻辑单元228不将该值输出到多路复用器222。
然后,如果多路复用器222从逻辑单元228接收到的信号指示将寄存器值连同期望存储地址一起输出到存储器202内的堆栈,则这样做。在该示例中,堆栈中的期望存储地址由上下文堆栈指针减去由从中读取值的寄存器确定的固定偏移给出。具体地,寄存器值的存储位置由下式给出:
addr=CSP-nreg (1),
其中addr是堆栈中的期望存储地址,CSP是上下文堆栈指针,nreg是从中读取值的寄存器编号。
逻辑单元228然后改变与所读取的寄存器相关联的状态比特位以指示在被覆写之前保存在寄存器中的值现在已存储在堆栈中。这防止将任何其他值写入寄存器触发将先前的值存储在堆栈中。
对于一些处理器设计,将新值写入调用者保存的寄存器214本质上允许在旧值被覆写之前有足够的时间被可靠地读出。然而,在其他处理器设计中,可能需要引入延迟元件来延迟写入,直到读取完成。
在中断处理程序返回之后,逻辑部228再次读取LSS状态比特位以确定调用者保存的寄存器214中的哪一个已被保存到堆栈。它使用当前CSP寄存器值和相关的固定偏移从堆栈弹出保存的寄存器的值。处理器200然后弹出堆栈中的LSS、CSP和PC值,使得执行返回到在接收到中断之前正在执行的原始例程。
现将参照图3至图10更详细地描述图2所示的系统20的操作。
图3示出了说明实施本发明的过程的时序图,处理器200通过该过程在执行线程300的同时处理接收中断请求。
应结合图3查看的图4示出了多个示意图,其示出了在处理器200执行线程300和中断处理程序302期间的各个阶段存储在存储器202中的堆栈的状态。堆栈由处理器200管理,并且在该示例中具有存储器202内的固定的起始地址(起点)。
最初,在阶段304,处理器200执行线程300。在时间312,处理器200接收到硬件中断请求。堆栈状态312'说明在时间312的堆栈。所示为堆栈指针(SP)322、已用堆栈空间324和可用堆栈空间326。SP 322包括最近添加(压入)到堆栈的数据的地址,其限定在其中存储线程300所需的堆栈数据和正常操作所需的任何其他堆栈数据的已用堆栈空间324的限制。已用堆栈空间324的尺寸不限于堆栈状态312'中所示的尺寸,而是可以是任何尺寸。SP 322下方示出的是可用堆栈空间326,其包括可用存储器202中的可用于堆栈的部分。在执行线程300时,SP 322(以及因此已用堆栈空间324和可用堆栈空间326的尺寸)可以随着处理器200按照线程300的需要向堆栈压入和从其弹出数据而改变。
在正常操作下,当处理器200将数据项添加到堆栈时,数据项被写入由SP 322指示的地址之后的下一位置,并且SP 322根据写入的数据项的尺寸而被调整(在图4、图6-图7和图9-图10所示示例的情况下向下,但是它可以同样地递增或递减)。如前所述,将数据项添加到堆栈的过程在本文中称为“压入”操作。当处理器200从堆栈弹出数据项时,由SP 322指向的位置通过将SP 322调整(在图4、图6-图7和图9-图10所示的示例的情况下向上)移除的数据项的尺寸来释放。如前所述,从堆栈清除数据项的过程在本文中称为“弹出”操作。
当在时间312接收到中断请求时,处理器200开始阶段306,其中它从执行线程300转换到处理中断请求。在阶段306期间,处理器200将与线程300相关联的程序计数器(PC)、本地存储状态(LSS)和上下文堆栈指针(CSP)压入堆栈。然后进一步调整SP 322以预留等于堆栈帧尺寸的堆栈部分,以及将CSP 328设置为等于SP 322。然后将与调用者保存的寄存器相关联的状态比特位全部设置为“未保存”。如此处使用的术语“未保存”用于描述状态比特位的状态,其中状态比特位被设置为如下值,其指示相关联的寄存器中存储的值自从开始执行当前程序以来仍未被压入堆栈。一旦执行了以上步骤,处理器200就能够在时间314开始执行中断处理程序302。将理解,这些步骤不限于以上所示的顺序,而是可以以任何合理的顺序执行。在某些实施方式中,假设理想的存储器条件,上述步骤可以在三个时钟周期内完成。
堆栈状态314'说明在阶段306期间完成以上列出的步骤之后堆栈在时间314的状态。SP 322已向下调整十个条目(例如十个32比特位字),从而减小可用堆栈空间326的尺寸。这十个条目中包括PC、LSS和CSP(称为“链接条目”330)和预留条目332。在该示例中,存在七个预留条目332,对应于调用者保存的寄存器的数量,即不包括PC、LSS和CSP的堆栈帧尺寸。然而,预留条目332的数量不限于七个,而是可以是任意数量,因此堆栈帧尺寸也不限于如该示例所示的十个条目。在一些示例中,预留条目332的数量等于八个条目,导致十一个条目的堆栈帧尺寸。如前所述,链接条目330和预留条目332中存储的值在这里被称为中断处理程序302的上下文数据。
CSP 328被设置为等于SP 322。那么要注意,CSP寄存器328中的值与链接条目330中存储的值不同。链接条目330中存储的CSP包括线程300的上下文数据的地址,而CSP 328包括中断处理程序302的上下文数据的地址。
在中断处理程序302执行期间,在阶段308,处理器200更新调用者保存的寄存器中的两个中存储的值。如上所述,当处理器200更新调用者保存的寄存器中存储的值时,它同时将先前的值存储在适当的预留条目332中。如前所述,处理器200将先前的值存储在由CSP328减去由特定寄存器编号指定的偏移指定的地址(假设堆栈指针的值随着堆栈的增长而增加)。在发生这种情况时,与更新的寄存器相关联的状态比特位将更新为“已保存”。如此处使用的术语“已保存”用于描述状态比特位的状态,其中状态比特位被设置为如下值,其指示相关联的寄存器中保存的值已被压入堆栈。
同样,在中断处理程序302执行期间,在阶段308,处理器200使用正常堆栈管理将中断处理程序302所需的另外的数据压入和弹出堆栈。堆栈状态316'说明在中断处理程序302执行期间在时间316的堆栈。可以看出,两个调用者保存的寄存器值334已存储在堆栈中,并且已用堆栈空间336的附加部分包含在中断处理程序302的执行期间已经被压入堆栈的值,SP 322被相应地调整,从而减少可用堆栈空间326的量。
在时间318,处理器200完成中断处理程序302的执行,并且开始阶段310,其中它转换回执行线程300。堆栈状态318'说明在时间318的堆栈。在中断处理程序302的执行已完成之后,处理器200已将附加的已用堆栈空间336中存储的数据从堆栈弹出,并且SP 322已相应地调整回CSP 328的位置。不再需要附加的已用堆栈空间336中存储的数据。
在阶段310期间,处理器200将堆栈中的上下文数据恢复到调用者保存的寄存器214以便继续执行线程300。为此,处理器200使用LSS寄存器226中的状态比特位来确定哪些寄存器值已被处理器200压入堆栈因此需要被恢复,以及哪些寄存器值没有被压入堆栈因此不需要被恢复。根据参照图2概述的调用者保存的寄存器压入过程,尚未被压入堆栈的寄存器(它们相关联的状态比特位如此指示)没有被覆写,因此保持与其在处理器200执行中断处理程序302之前的在时间312的值相同的值。处理器200能够容易地确定压入的寄存器值332在堆栈中的地址,因为地址由CSP和特定寄存器编号给出,如式(1)所示。因此,在为线程300恢复链接条目330(PC、LSS和CSP)并且相应地更新堆栈指针SP之前,处理器200将压入的寄存器值332恢复到它们相关联的调用者保存的寄存器。
一旦上下文数据已被恢复,处理器200就在时间320继续执行线程300。堆栈状态320'说明在时间320的堆栈。可以看出堆栈状态320'与堆栈状态312'相同,说明处理器200继续执行在其暂停执行线程以开始执行中断处理程序302的同一点(时间312)的线程300。不再需要为了执行中断处理程序302而被压入堆栈的上下文数据并且SP 322已相应地调整。处理器200然后在阶段311继续执行线程300。
图5示出了说明实施本发明的相对于时间的过程的示意图,处理器200通过该过程处理第一中断处理程序402被第二中断请求抢占(中断)的执行。
应结合图5查看的图6和图7示出了多个示意图,其示出了在处理器200执行线程400、第一中断处理程序402和第二中断处理程序404期间的各个阶段存储器202中存储的堆栈的状态。
最初,在阶段406,处理器200执行线程400。在时间424,处理器200接收第一中断请求。堆栈状态424'说明在时间424的堆栈。示出了SP 322,在上方并包括其的是已用堆栈空间324,并且下方是可用堆栈空间326。已用堆栈空间324的尺寸(以及因此可用堆栈空间326的尺寸和SP 322的位置)不限于堆栈状态424'中所示的那些,而是可以是任何值。
当在时间424接收到第一中断请求时,处理器200开始阶段408,其中它从执行线程400转换到处理中断请求。处理器200为了从执行线程400转移到第一中断处理程序402而采取的步骤与先前参照图3和图4概述的步骤相同。
在时间426,处理器200开始执行第一中断处理程序402。堆栈状态426'说明在时间426的堆栈。从堆栈状态426'可以看出,与线程相关联的PC、LSS和CSP(链接条目330a)已被压入堆栈,并且SP 322已被调整以预留堆栈帧尺寸,创建预留条目332a。链接条目330a和预留条目332a中存储的值包括第一中断处理程序402的上下文数据,并且CSP 328a已被调整为指向第一中断处理程序402的上下文数据。可用堆栈空间326的尺寸已相应地减小。
在阶段410期间,处理器200执行第一中断处理程序402。在时间428,处理器200接收第二中断请求。堆栈状态428'说明在时间428的堆栈。在阶段410期间,处理器200已将调用者保存的寄存器值334a压入堆栈,将值存储在如式(1)给出的堆栈内的适当位置。同时,保存被压入的值的寄存器被更新为新值,并且LSS寄存器226中保存的和与被压入的寄存器相关联的状态比特位设置为“已保存”。在第一中断处理程序402执行期间,已用堆栈空间336a的附加部分已被压入堆栈,SP 322被相应地调整,从而减少可用堆栈空间326的量。
处理器200在时间428接收到的第二中断请求的优先级高于第一中断,因此在阶段412,处理器200从执行第一中断处理程序402转换到第二中断处理程序404。处理器200为了从执行线程400转移到第一中断处理程序402而采取的步骤与先前参照图3和图4概述的步骤相同。堆栈状态430’说明在时间430的堆栈,此时处理器200已成功地从执行第一中断处理程序402转移到第二中断处理程序404。
从堆栈状态430'可以看出,处理器200已将与第一中断处理程序302相关联的链接条目330b压入堆栈,使与第一中断处理程序336a相关联的已用堆栈空间完好无损。处理器200已预留栈帧尺寸,生成预留条目332b,并且SP 322已被相应地调整。与第二中断处理程序404相关联的CSP 328b已被调整为等于SP 322,并且可用堆栈空间326的尺寸已相应地减小。链接条目330b和预留条目332b中存储的值包括第二中断处理程序404的上下文数据。
处理器200然后在阶段414执行第二中断处理程序404。堆栈状态432'说明在时间432的堆栈。从堆栈状态432'可以看出处理器200已将四个调用者保存的寄存器值334b压入堆栈,将值存储在如式(1)给出的堆栈中的适当位置。在第二中断处理程序404执行期间,已用堆栈空间336a的附加部分已被压入堆栈,SP 322被相应地调整,从而减少可用堆栈空间326的量。
在时间434,处理器200停止执行第二中断处理程序404,并且开始转回到执行第一中断处理程序402。堆栈状态434'说明在时间434的堆栈。从堆栈状态434'可以看出,与第二中断处理程序404相关联的已用堆栈空间336b已从堆栈弹出,并且SP 322已被相应地调整。
在阶段416期间,处理器200将堆栈中与第二中断处理程序404相关联的上下文数据恢复到调用者保存的寄存器214,以便继续执行第一中断处理程序402。为此,处理器200使用LSS寄存器226内的状态比特位来确定哪些寄存器值已被处理器20压入堆栈并且因此需要被恢复,以及哪些寄存器值没有被压入堆栈并且因此不需要被恢复。因此,在恢复第一中断处理程序402的链接条目330b(PC、LSS和CSP)以及将第二中断处理程序404的上下文数据从堆栈移除之前,处理器200将被压入的寄存器值332b恢复到它们相关联的调用者保存的寄存器,相应地调整堆栈指针322。
一旦第二中断处理程序404的上下文数据已被恢复到调用者保存的寄存器214,处理器200就在时间436继续执行第一中断处理程序402。堆栈状态436'说明在时间436的堆栈。可以看出,堆栈状态436'与堆栈状态428'相同,说明处理器200继续执行在其暂停执行第一中断处理程序402以开始执行第二中断处理程序404的同一点(时间428)的第一中断处理程序402。为了执行第二中断处理程序404而被压入堆栈的上下文数据已从堆栈弹出,并且SP 322已被相应地调整。处理器200然后在阶段418继续执行第一中断处理程序402。
在时间438,处理器200停止执行第一中断处理程序402,并且开始转回到执行线程400。堆栈状态438'说明在时间438的堆栈。从堆栈状态438'可以看出,与第一中断处理程序402相关联的已用堆栈空间已从堆栈释放,并且SP 322已被相应地调整。此外,处理器200已将第三调用者保存的寄存器值334a压入堆栈。
在阶段420期间,处理器200将与堆栈中的第一中断处理程序402相关联的上下文数据恢复到调用者保存的寄存器214,以便继续执行线程400。为此,处理器200使用LSS寄存器226内的状态比特位来确定哪些寄存器值已被处理器200压入堆栈并且因此需要被恢复,以及哪些寄存器值没有被压入堆栈并且因此不需要被恢复。因此,在恢复链接条目330b(PC、LSS和CSP)并且通过相应地调整堆栈指针322释放第二中断处理程序404的上下文数据的堆栈之前,处理器200将被压入的寄存器值334b恢复到它们相关联的调用者保存的寄存器。
一旦第一中断处理程序404的上下文数据已被恢复到调用者保存的寄存器214,处理器200就在时间440继续执行线程400。堆栈状态440'说明在时间440的堆栈。可以看出,堆栈状态440'与堆栈状态424'相同,说明处理器200继续执行在其暂停执行线程400以开始执行第一中断处理程序402的同一点(时间424)的线程400。为了执行第一中断处理程序404而被压入堆栈的上下文数据已从堆栈弹出,并且SP 322已被相应地调整。处理器200然后在阶段422继续执行线程400。
图8示出了说明实施本发明的相对于时间的过程的示意图,当一个中断返回并且另一中断挂起时,处理器200通过该过程能够执行快速中断转换(即中断尾链)。
应结合图8查看的图9和图10示出了多个示意图,其示出了在处理器200执行线程500和中断处理程序502期间的各个阶段存储器202中存储的堆栈的状态。
最初,在阶段504,处理器200执行线程500。在时间518,处理器200接收第一中断请求。堆栈状态518'说明在时间518的堆栈。示出了SP 322,在上方并且包括已用堆栈空间324,并且下方是可用堆栈空间326。已用堆栈空间324的尺寸(以及因此可用堆栈空间326的尺寸和SP 322的位置)不限于堆栈状态518'中所示的那些,而是可以是任何值。
当在时间518接收到第一中断请求时,处理器200开始阶段506,其中它从执行线程500转换到处理中断请求。处理器200为了从执行线程500转移到中断处理程序502而采取的步骤与先前参照图3和图4概述的步骤相同。
在时间520,处理器200开始执行中断处理程序502。堆栈状态520'说明在时间520的堆栈。从堆栈状态520'可以看出,与线程500相关联的PC、LSS和CSP(链接条目330c)已被压入堆栈,并且SP 322已被调整以预留堆栈帧尺寸,创建预留条目332。链接条目330c和预留条目332中存储的值包括中断处理程序502的上下文数据,并且CSP 328已被调整为指向中断处理程序502的上下文数据。可用堆栈空间326的尺寸已相应地减小。
在阶段508期间,处理器200执行中断处理程序502。在时间522,处理器200接收第二中断请求。堆栈状态522'说明在时间522的堆栈。在阶段508期间,处理器200已将两个调用者保存的寄存器值334压入堆栈,将值存储在由式(1)给出的堆栈内的适当位置。在中断处理程序502执行期间,已用堆栈空间336c的附加部分已被压入堆栈,SP 322被相应地调整,从而减少可用堆栈空间326的量。
处理器200在时间428接收到的第二中断请求具有与第一中断请求相同或更低的优先级,因此处理器200继续执行第一中断请求的中断处理程序502直到在时间524完成,并且第二中断请求保持挂起。
堆栈状态524'说明在时间524的堆栈。在时间524,处理器200停止执行与第一中断请求相关联的中断处理程序502。从堆栈状态524'可以看出,与与第一中断请求相关联的中断处理程序502相关联的已用堆栈空间336c已从堆栈释放,并且SP 322已被相应地调整。
如果处理器200没有执行如本文所公开的快速中断转换,则在立即执行堆栈管理以及如参照图3和图4概述的从执行线程500转移到另一中断处理程序502所需的上下文数据保存步骤之前,处理器200将与中断处理程序502相关联的上下文数据恢复到调用者保存的寄存器214以便执行线程500。
相反,为了减少存储器事务的数量,处理器200在阶段510期间不将上下文数据恢复到调用者保存的寄存器214。申请人已认识到,中断处理程序502的上下文数据不需要恢复到调用者保存的寄存器214。此外调用者保存的寄存器214中存储的CSP 328和LSS可以保持相同,因为在执行与第二中断请求相关联的中断处理程序502之后恢复线程500的执行所需的上下文数据不变。因此,过程200简单地从存储器202中的中断向量表中获取与第二中断请求相关联的中断处理程序502的新地址值,并且相应地更新PC,同时使堆栈中存储的CSP 328、LSS和上下文数据保持相同。
在阶段510执行快速中断转换之后,处理器200在时间526开始执行与第二中断请求相关联的中断处理程序502。堆栈状态526'说明在时间526的堆栈。从堆栈状态526'可以看出,堆栈状态自从时间524以来没有改变,因为堆栈中存储的上下文数据在阶段510期间没有被处理器200改变。
在阶段508期间,处理器200执行与第二中断请求相关联的中断处理程序502。堆栈状态528'说明在时间528的堆栈。在阶段508期间,处理器200已将两个附加的调用者保存的寄存器值334压入堆栈,将值存储在如式(1)给出的堆栈内的适当位置。在与第二中断请求相关联的中断处理程序502执行期间,已用堆栈空间336d的附加部分已被压入堆栈,SP 322被相应地调整,从而减少可用堆栈空间326的量。
在时间530,处理器200停止执行与第二中断请求相关联的中断处理程序502,并且开始转回到执行线程500。堆栈状态530'说明在时间530的堆栈。从堆栈状态530'可以看出,与第二中断请求的中断处理程序502相关联的已用堆栈空间已从堆栈释放,并且SP 322已被相应地调整。
在阶段514期间,处理器200将堆栈中与中断处理程序502相关联的上下文数据恢复到调用者保存的寄存器214,以便继续执行线程500。为此,处理器200使用LSS寄存器226中的状态比特位来确定哪些寄存器值已被处理器200压入堆栈并且因此需要被恢复,以及哪些寄存器值没有被压入堆栈并且因此不需要被恢复。因此,在恢复链接条目330(PC、LSS和CSP)并且通过相应地调整堆栈指针322释放由中断处理程序502的上下文数据占用的空间之前,处理器200将被压入的寄存器值334恢复到它们相关联的调用者保存的寄存器。
一旦中断处理程序502的上下文数据已被恢复到调用者保存的寄存器214,则处理器200在时间532继续执行线程500。堆栈状态532'说明在时间532的堆栈。可以看出,堆栈状态532'与堆栈状态518'相同,说明处理器200继续执行在其暂停执行线程500以开始执行与第一中断请求相关联的中断处理程序502的同一点(时间518)的线程500。为了执行中断处理程序502而被压入堆栈的上下文数据已从堆栈弹出,并且SP 322已被相应地调整。处理器200然后在阶段516继续执行线程500。
图11示出了说明实施本发明的另一片上系统60的示意图,其被配置用于特别高效的存储器使用。不同于在主堆栈上预留大到足以保存所有延迟压入寄存器值中断的堆栈帧,该SoC 60维护与主堆栈不同的上下文堆栈。主堆栈和上下文堆栈在下文被描述为位于存储器的公共堆栈区域中,但是它们可以替选地存储在完全分离的存储器区域中。
SoC 60包括耦接到存储器602的处理器600。处理器600包括与图2所示的处理器200的部件204-224相同的部件604-624,包括八个调用者保存的寄存器614,与图2所示的LSS寄存器226和逻辑单元228相比,唯一区别在于LSS寄存器626和逻辑单元628。
LSS寄存器626是三十二比特位寄存器,包括两个部分:八个状态比特位630和二十四个位置比特位632。状态比特位630的操作方式与LSS寄存器226的状态比特位完全相同,如参照图2描述的那样。处理器600的操作,包括位置比特位632,将在下文参照图12至图15进一步描述。此外,逻辑电路628由图2所示的逻辑电路228修改而来,因为它使用位置比特位632和状态比特位630中保存的值来执行逻辑,如下文说明的那样。
图12示出了LSS寄存器626的示意图。在该示例中,寄存器文件608包括八个调用者保存的寄存器614。示出了占据比特位b0-b7的状态比特位630和占据比特位b8-b31的位置比特位632。24个位置比特位632被分成八个三比特位的组,每组的三个比特位p0-p7用作调用者保存的寄存器614中相应的一个的位置寄存器。每个位置寄存器能够存储位置值,其将寄存器614中的相应的一个的堆栈位置的地址编码为相对于寄存器被压入上下文堆栈时的上下文堆栈指针值的偏移。三比特位提供了分配八个唯一位置值的能力。当然,如果存在超过八个调用者保存的寄存器,则可以提供更多的比特位。
图13示出了说明实施本发明的相对于时间的过程的示意图,处理器600通过该过程处理线程700的执行被第一中断处理程序702抢占(中断)且第一中断处理程序702接着被第二中断处理程序704抢占。
应结合图13查看的图14和图15示出了多个示意图,其示出了在处理器600执行线程700、第一中断处理程序702和第二中断处理程序704期间的各个阶段存储器602的堆栈区域的状态。
最初,在阶段706,处理器600执行线程700。在时间724,处理器600接收第一中断请求。堆栈状态724'说明在时间724的堆栈区域。示出了SP 322,在上方并且包括已用主堆栈空间324,在其下方是可用主堆栈空间326。已用主堆栈空间324的尺寸(以及因此可用主堆栈空间326的尺寸和SP 322的位置)不限于堆栈状态724'中所示的那些,而是可以是任何值。
还示出了CSP 328,其指向指定堆栈区域的一部分的位置,这一部分专用于存储上下文数据(在下文中称为上下文堆栈)。在CSP 328下方并且包括CSP 328的是可用上下文堆栈空间740。专用于存储上下文数据的堆栈区域的这一部分的尺寸不限于堆栈状态724'中所示的尺寸,而是可以是任何尺寸。在一些实施方式中,上下文堆栈数据330、742可以与主堆栈数据324完全分离地存储在存储器的不同区域中。
当在时间724接收到第一中断请求时,处理器600开始阶段708,其中它从执行线程700转换到处理中断请求。为了从执行线程700转移到第一中断处理程序702,处理器600将与线程700相关联的PC、LSS和CSP存储在由CSP 328指定的位置。处理器600然后将状态比特位630设置为“未保存”,并且从存储器602中存储的中断向量表中获取与接收到的中断请求相关联的中断处理程序的地址,并且将其存储在PC寄存器中。
在时间726,处理器600开始执行第一中断处理程序702。堆栈状态726'说明在时间726的堆栈区域。从堆栈状态726'可以看出,与线程700相关联的PC、LSS和CSP(链接条目330e)已经存储在上下文堆栈中,因此可用上下文堆栈空间740的尺寸已相应地减小。
在阶段710期间,处理器600执行第一中断处理程序702。在此期间,处理器600更新两个调用者保存的寄存器614中存储的值。当这些更新中的每一个出现时,处理器600同时将每个寄存器中保存的先前值存储在上下文堆栈中的下一可用位置。在一些示例中,处理器600可以通过对“已保存”标志的数量进行计数,或者通过使用每个附加条目使CSP递增来确定下一可用位置。当这发生时,处理器600将与寄存器相关联的状态比特位630更新为“已保存”(1'b),并且更新相关联的位置比特位632以指示上下文堆栈中存储先前值的位置。例如,如果先前的寄存器值存储在与链接值330e相邻的上下文堆栈中的第一可用位置处,则更新该寄存器632的相关联的位置比特位中的值以指示位置零(即二进制000'b)。
在时间728,处理器600接收到第二中断请求。堆栈状态728'说明在时间728的堆栈区域。从堆栈状态728'可以看出,在阶段710期间,处理器600将调用者保存的寄存器4和5中保存的寄存器条目742e存储在上下文堆栈中,寄存器4存储在寄存器5之前,并且可用上下文堆栈空间740已相应地减少。因此,对应的位置比特位部分p4和p5中存储的值分别被更新为零(000'b)和1(001'b),并且对应的状态比特位b4和b5已被更新为“已保存”(1'b)。在第一中断处理程序702执行期间,已用主堆栈空间324的附加部分已被压入主堆栈,SP 322被相应地调整,从而减少可用主堆栈空间326的量。
处理器600在时间728接收到的第二中断请求具有比第一中断更高的优先级,因此处理器600在阶段712从执行第一中断处理程序702转换到第二中断处理程序704。为了从执行第一中断处理程序702转移到第二中断处理程序704,处理器600首先将CSP 328的位置更新为上下文堆栈中的下一可用位置。处理器600然后将与第一中断处理程序702相关联的PC、LSS和CSP存储在由CSP 328指定的位置。处理器600然后将状态比特位630设置为“未保存”=0'b。处理器600然后从存储器602中存储的中断向量表获取与第二中断请求相关联的中断处理程序的地址,并且将其保存在PC寄存器中。
堆栈状态730'说明在时间730的堆栈区域,此时处理器600已成功地从执行第一中断处理程序702转移到第二中断处理程序704。从堆栈状态730'可以看出,与第一中断处理程序702相关联的PC、LSS和CSP(链接条目330f)已存储在上下文堆栈中,并且可用上下文堆栈空间740的尺寸已相应地减小。
处理器600然后在阶段714执行第二中断处理程序704。在此期间,处理器600更新调用者保存的寄存器614中的一个中存储的值。当该更新发生时,处理器600同时将寄存器中保存的先前值存储在上下文堆栈中的下一可用位置。当这发生时,处理器600将与寄存器相关联的状态比特位630更新为“已保存”(1'b),并且更新相关联的位置比特位632以指示上下文堆栈中存储先前值的位置。例如,如果先前的寄存器值存储在与链接值330f相邻的上下文堆栈中的第一可用位置,则更新该寄存器632的相关联的位置比特位中的值以指示位置零(即二进制000'b)。
在时间732,处理器600停止执行第二中断处理程序704,并且开始转回到执行第一中断处理程序702。堆栈状态732'说明在时间732的堆栈区域。从堆栈状态732'可以看出,在阶段714期间,处理器600将调用者保存的寄存器中保存的寄存器条目742f存储在上下文堆栈中,并且可用上下文堆栈空间740已相应地减少。这样,对应的位置比特位部分p3中存储的值已被更新为零(000'b),并且对应的状态比特位已经被更新为“已保存”(1'b)。在第一中断处理程序702执行期间,已用堆栈空间324的附加部分已被压入主堆栈,SP 322被相应地调整,从而减少可用主堆栈空间326的量。
从堆栈状态732'可以看出,通过结合位置比特位632并且独立于主堆栈维护上下文堆栈,存储上下文数据所需的条目数量减少,因为不需要预留(因此浪费)堆栈条目。相反,上下文数据没有留下未占用的堆栈条目,因此进一步优化了存储器使用。
在阶段716期间,处理器600将上下文堆栈中的与第二中断处理程序704相关联的上下文数据恢复到调用者保存的寄存器614,以便继续执行第一中断处理程序702。为此,处理器600使用LSS寄存器626中的状态比特位630来确定哪些寄存器值已被处理器600压入上下文堆栈并且因此需要被恢复。处理器600使用LSS寄存器626中的位置比特位632,通过将对应的偏移添加到当前CSP地址值来确定已存储每个调用者保存的寄存器的各自的寄存器值的地址。在这种情况下,寄存器3位于位置零(000'b)。因此,处理器600在恢复第一中断处理程序702的链接条目330f(PC、LSS和CSP)之前将被压入的寄存器值742f恢复到调用者保存的寄存器3,并且释放由第二中断处理程序704的上下文数据占用的空间。此外,处理器600从主堆栈释放与第二中断处理程序704相关联的正常堆栈数据,并且相应地调整SP322,减少已用主堆栈空间324的尺寸并且增加可用主堆栈空间326的尺寸。
一旦第二中断处理程序704的上下文数据已恢复到调用者保存的寄存器614,处理器600就在时间734恢复执行第一中断处理程序702。堆栈状态734'说明在时间734的堆栈区域。可以看出,堆栈状态734'与堆栈状态728'相同,说明处理器600继续执行在其暂停执行第一中断处理程序702以开始执行第二中断处理程序704的同一点(时间728)的第一中断处理程序702。为了执行第二中断处理程序704而被压入上下文堆栈的上下文数据已从上下文堆栈弹出。处理器600然后在阶段718继续执行第一中断处理程序702。
在时间736,处理器600停止执行第一中断处理程序702,并且开始转回到执行线程700。堆栈状态736'说明在时间736的堆栈区域。从堆栈状态736'可以看出,在阶段718期间,处理器600将调用者保存的寄存器1中保存的另一寄存器条目742e存储在上下文堆栈中(位置值为2),并且可用上下文堆栈空间740已相应地减少。因此,对应的位置比特位部分p1中存储的值已被更新为2(010'b),并且对应的状态比特位b1已被更新为“已保存”(1'b)。
在阶段720期间,处理器600将上下文堆栈中的与线程700相关联的上下文数据恢复到调用者保存的寄存器614以便继续执行线程700。为此,处理器600使用LSS寄存器626中的状态比特位630来确定哪些寄存器值已被处理器600压入上下文堆栈并且因此需要被恢复。处理器600使用LSS寄存器626中的位置比特位632来确定存储每个寄存器的寄存器值的位置(在这种情况下分别是寄存器4、5和1的位置0(000'b)、1(001'b)和2(010'b))。因此,处理器600在恢复线程700的链接条目330e(PC、LSS和CSP)并且从上下文堆栈释放由第一中断处理程序702的上下文数据占用的空间之前,将被压入的寄存器值742e恢复到调用者保存的寄存器4、5和3。此外,处理器600从主堆栈释放与第一中断处理程序702相关联的正常堆栈数据并且相应地调整SP 322,减少已用主堆栈空间324的尺寸并且增加可用主堆栈空间326的尺寸。
一旦第一中断处理程序702的上下文数据已被恢复到调用者保存的寄存器614,处理器600就在时间738恢复执行线程700。堆栈状态738'说明在时间738的堆栈。可以看出,堆栈状态738'与堆栈状态724'相同,说明处理器600继续执行在其暂停执行线程700以开始执行第一中断处理程序702的同一点(在时间724)的线程700。为了执行第一中断处理程序702而被压入上下文堆栈的上下文数据已从上下文堆栈清除。处理器600然后在阶段722继续执行线程700。
尽管本文公开的基于硬件的中断处理过程在处理(例如由诸如无线电收发器的外围设备生成的)硬件中断时是特别有用的,但是在一些实施方式中,在处理软件中断(即由诸如ArmTM处理器上的SVC指令的特殊软件指令的执行而生成的中断)时,甚至在调取例程函数调用时,它们也可以使用。这样做可以减少处理器需要获取和执行的指令量。
本领域的技术人员将认识到,本发明已经通过描述其一个或更多个具体实施方式来说明,但是不限于这些实施方式;在所附权利要求的范围内,许多变化和修改是可能的。
Claims (21)
1.一种处理装置,包括处理器,其中:
所述处理器包括多个延迟压入处理器寄存器;
所述处理器包括处理器寄存器控制电路;
所述处理器寄存器控制电路包括多个状态寄存器,每个状态寄存器对应于各自不同的延迟压入寄存器;
所述处理器寄存器控制电路被配置成检测向所述延迟压入寄存器中的寄存器写入新值;
所述处理器寄存器控制电路被配置成确定所述延迟压入寄存器的状态寄存器是否具有指示所述延迟压入寄存器的未保存状态的第一值;以及
所述处理器寄存器控制电路被配置成,当所述状态寄存器具有所述第一值时:在将所述新值写入所述延迟压入寄存器完成之前,从所述延迟压入寄存器读取当前值;将所述当前值写入存储器;以及将所述延迟压入寄存器的状态寄存器设置为指示所述延迟压入寄存器的已保存状态的第二值。
2.根据权利要求1所述的处理装置,包括所述存储器,所述处理器寄存器控制电路被配置成将所述延迟压入寄存器的当前值写入所述存储器。
3.根据前述权利要求中任一项所述的处理装置,其中,所述处理器包括用于接收硬件中断请求的一个或更多个硬件中断输入端,并且其中,所述处理器寄存器控制电路被配置成:响应于所述处理器接收到硬件中断请求,将所述多个状态寄存器中的每个状态寄存器设置为所述第一值。
4.根据前述权利要求中任一项所述的处理装置,包括存储中断向量表和存储包括一个或更多个中断处理程序的软件的存储器,每个中断处理程序被存储在所述中断向量表中标识的各自的地址处,并且其中,所述处理器被配置成:响应于接收到硬件中断请求,执行上下文切换以及跳转到所述中断处理程序中的一个中断处理程序。
5.根据前述权利要求中任一项所述的处理装置,其中,所述处理器包括堆栈指针寄存器和另外的处理器寄存器,并且被配置成使用所述堆栈指针寄存器中存储的堆栈指针来确定将所述另外的处理器寄存器的值压入的存储器地址。
6.根据权利要求5所述的处理装置,其中,所述处理器寄存器控制电路包括上下文堆栈指针寄存器,并且被配置成使用所述上下文堆栈指针寄存器中存储的上下文堆栈指针值来确定将所述延迟压入寄存器的所述当前值写入的存储器地址。
7.根据权利要求6所述的处理装置,其中,所述处理器被配置成:响应于接收到硬件中断请求,根据与存储器的至少大到足以保存多个延迟压入寄存器和所述上下文堆栈指针寄存器的所有值的一部分相对应的量,改变所述堆栈指针。
8.根据权利要求6或7所述的处理装置,其中,所述处理器寄存器控制电路被配置成:响应于接收到硬件中断请求,将程序计数器、所述状态寄存器和所述上下文堆栈指针中的一个或更多个压入所述存储器中的根据所述堆栈指针确定的地址。
9.根据权利要求6至8中任一项所述的处理装置,其中,所述处理器寄存器控制电路被配置成将值从所述堆栈指针寄存器复制到所述上下文堆栈指针寄存器。
10.根据权利要求6至9中任一项所述的处理装置,其中,所述处理器寄存器控制电路被配置成:通过将恒定偏移施加到所述上下文堆栈指针寄存器中的值来确定将延迟压入处理器寄存器的值压入的地址,其中,所述延迟压入寄存器中的每个延迟压入寄存器与各自不同的常量偏移相关联。
11.根据权利要求6所述的处理装置,其中,所述处理器寄存器控制电路被配置成:通过将每个延迟压入寄存器压入所述存储器中的所述上下文堆栈指针之后的下一个未占用的地址,使用所述上下文堆栈指针寄存器将延迟压入寄存器压入所述存储器中的上下文堆栈结构内的连续存储器地址。
12.根据权利要求11所述的处理装置,其中,所述处理器寄存器控制电路包括多个多比特位位置寄存器,每个多比特位位置寄存器对应于各自不同的延迟压入寄存器,以及其中,所述处理器寄存器控制电路被配置成:当将延迟压入寄存器压入所述存储器中的地址时,将值存储在对应的位置寄存器中,该值相对于所述上下文堆栈指针寄存器的值对所述地址进行编码。
13.根据权利要求11或12所述的处理装置,其中,所述处理器寄存器控制电路被配置成:响应于接收到硬件中断请求,将程序计数器、所述状态寄存器和所述上下文堆栈指针中的一个或更多个压入所述存储器中的通过所述上下文堆栈指针寄存器中存储的上下文堆栈指针值确定的地址。
14.根据前述权利要求中任一项所述的处理装置,其中,所述处理器被配置成执行上下文切换,以及当执行到新上下文的上下文切换时,延迟将每个延迟压入寄存器中存储的各个值压入所述存储器,直到在新的上下文中对相应的延迟压入寄存器进行写入为止。
15.根据前述权利要求中任一项所述的处理装置,其中,所述处理器寄存器控制电路被配置成:响应于检测到从中断处理程序例程返回,确定对应于所述多个延迟压入寄存器的每个状态寄存器是否保存所述第二值,以及当状态寄存器保存所述第二值时,从所述存储器读取对应的延迟压入寄存器的压入值以及将所述压入值写入该延迟压入寄存器。
16.根据前述权利要求中任一项所述的处理装置,其中,所述处理装置支持嵌套中断。
17.根据前述权利要求中任一项所述的处理装置,其中,所述处理器寄存器控制电路被配置成支持尾链中断处理,其中,连续处理两个或更多个中断而在处理连续中断之中不返回接收到第一中断请求时正在执行的过程。
18.根据前述权利要求中任一项所述的处理装置,其中,所述处理器被配置成当第二中断挂起时从第一中断处理程序返回时不弹出任何压入的状态寄存器值。
19.根据前述权利要求中任一项所述的处理装置,其中,所述状态寄存器在多比特位状态寄存器内包括各个二进制标志。
20.根据前述权利要求中任一项所述的处理装置,其中,所述处理装置是片上系统。
21.一种操作处理装置的方法,其中:
所述处理装置包括处理器;
所述处理器包括多个延迟压入处理器寄存器;以及
所述处理器包括多个状态寄存器,每个状态寄存器对应于各自不同的延迟压入寄存器,
所述方法包括:
检测向所述延迟压入寄存器中的寄存器写入新值;
确定所述延迟压入寄存器的状态寄存器具有指示所述延迟压入寄存器的未保存状态的第一值;
在将所述新值写入所述延迟压入寄存器完成之前从所述延迟压入寄存器读取当前值;
将所述当前值写入存储器;以及
将所述延迟压入寄存器的状态寄存器设置为指示所述延迟压入寄存器的已保存状态的第二值。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GB2012418.6 | 2020-08-10 | ||
GBGB2012418.6A GB202012418D0 (en) | 2020-08-10 | 2020-08-10 | Processing apparatus |
PCT/EP2021/072253 WO2022034063A1 (en) | 2020-08-10 | 2021-08-10 | Processing apparatus |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116235143A true CN116235143A (zh) | 2023-06-06 |
Family
ID=72520055
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202180064832.8A Pending CN116235143A (zh) | 2020-08-10 | 2021-08-10 | 处理装置 |
Country Status (5)
Country | Link |
---|---|
US (1) | US20230315456A1 (zh) |
EP (1) | EP4193250A1 (zh) |
CN (1) | CN116235143A (zh) |
GB (1) | GB202012418D0 (zh) |
WO (1) | WO2022034063A1 (zh) |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7260815B1 (en) * | 2003-06-30 | 2007-08-21 | Vmware, Inc. | Method and apparatus for managing registers in a binary translator |
US7424599B2 (en) * | 2003-08-28 | 2008-09-09 | Mips Technologies, Inc. | Apparatus, method, and instruction for software management of multiple computational contexts in a multithreaded microprocessor |
-
2020
- 2020-08-10 GB GBGB2012418.6A patent/GB202012418D0/en not_active Ceased
-
2021
- 2021-08-10 EP EP21758108.1A patent/EP4193250A1/en active Pending
- 2021-08-10 CN CN202180064832.8A patent/CN116235143A/zh active Pending
- 2021-08-10 WO PCT/EP2021/072253 patent/WO2022034063A1/en active Application Filing
- 2021-08-10 US US18/020,404 patent/US20230315456A1/en active Pending
Also Published As
Publication number | Publication date |
---|---|
EP4193250A1 (en) | 2023-06-14 |
GB202012418D0 (en) | 2020-09-23 |
US20230315456A1 (en) | 2023-10-05 |
WO2022034063A1 (en) | 2022-02-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5634046A (en) | General purpose use of a stack pointer register | |
US6209085B1 (en) | Method and apparatus for performing process switching in multiprocessor computer systems | |
EP0870226B1 (en) | Risc microprocessor architecture | |
US4755935A (en) | Prefetch memory system having next-instruction buffer which stores target tracks of jumps prior to CPU access of instruction | |
US7840768B2 (en) | Memory-controller-embedded apparatus and procedure for achieving system-directed checkpointing without operating-system kernel support | |
US7302518B2 (en) | Method and system for managing a suspend request in a flash memory | |
RU2405189C2 (ru) | Расширение блока стековых регистров с помощью теневых регистров | |
JP4057911B2 (ja) | 予め格納されるベクトルの割込処理システムおよび方法 | |
JP2001516922A (ja) | ハードウェア補助コンテキスト切換え機能を備えたデータ処理装置 | |
JPH07161195A (ja) | フラッシュメモリ | |
US6654871B1 (en) | Device and a method for performing stack operations in a processing system | |
KR100385495B1 (ko) | 워드정렬브랜치타겟을가지는처리시스템 | |
WO2001038970A2 (en) | Buffer memories, methods and systems for buffering having seperate buffer memories for each of a plurality of tasks | |
KR100392326B1 (ko) | 가상입/출력프로세서 | |
KR100841548B1 (ko) | 처리 시스템 | |
CN116235143A (zh) | 处理装置 | |
EP0720087A1 (en) | Apparatus and method for a memory extension stack in a data processing system | |
US7584328B2 (en) | Method, apparatus, and a system for efficient context switch | |
CA1287177C (en) | Microprogrammed systems software instruction undo | |
US20050262389A1 (en) | Stack type snapshot buffer handles nested interrupts | |
US6360315B1 (en) | Method and apparatus that supports multiple assignment code | |
US5557772A (en) | Data processing apparatus including a register storing a parameter and a microinstruction execution arrangement including a correction arrangement for causing a first value of the parameter to be change to a second, correct value | |
EP0915416B1 (en) | System for allowing a two word instruction to be executed in a single cycle and method therefor | |
WO1996008948A2 (en) | Method and apparatus for fast microcontroller context switching | |
EP1104899A2 (en) | Data processing apparatus and method of controlling the same |
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 |