一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

数据压栈方法、装置、芯片及存储介质与流程

2022-02-22 02:42:47 来源:中国专利 TAG:


1.本发明涉及计算机技术领域,尤其涉及一种数据压栈方法、装置、芯片及存储介质。


背景技术:

2.在mcu(微控制单元)中,处理器(cpu核)需要经常对异常信号或外部中断控制信号做出响应,从当前的用户程序指令流转入异常处理程序。在这个过程中,需要保护当前程序执行的状态,将当前程序的上下文数据压入堆栈进行保护;当异常处理程序退出后,再从堆栈中弹出保存的上下文数据,供用户程序指令流继续执行。
3.在进行上下文数据的压栈时,需要保证压入堆栈中的数据为程序新鲜的数据,即当压栈动作发生时,如果有指令未执行完成且指令会更新待压栈的上下文数据,则需要等待指令执行完成才能对上下文数据进行压栈,如果该指令的执行需要消耗较多的时钟周期,则会显著增加异常或中断的响应时间,从而降低中断响应的实时性。


技术实现要素:

4.本发明旨在至少在一定程度上解决相关技术中的技术问题之一。为此,本发明的第一个目的在于提出一种数据压栈方法,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
5.本发明的第二个目的在于提出一种数据压栈装置。
6.本发明的第三个目的在于提出一种芯片。
7.本发明的第四个目的在于提出一种计算机可读存储介质。
8.为达到上述目的,本发明第一方面实施例提出了一种数据压栈方法,方法包括:在压栈动作发生时,若存在未完成更新的上下文数据,则跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据;若未存在未完成更新的上下文数据,则按序压栈所有上下文数据。
9.根据本发明实施例的数据压栈方法,在压栈动作发生时,若存在未完成更新的上下文数据,则跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据;若未存在未完成更新的上下文数据,则按序压栈所有上下文数据。由此,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
10.根据本发明的一个实施例,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,包括:先按序压栈所有上下文数据,并在压栈到未完成更新的上下文数据时,若确定未完成更新的上下文数据仍未完成更新,则跳过未完成更新的上下文数据并压栈后续上下文数据,直至后续上下文数据压栈完成后再压栈未完成更新的上下文数据。
11.根据本发明的一个实施例,跳过未完成更新的上下文数据,并在其它上下文数据
全部或部分压栈完成后再压栈未完成更新的上下文数据,还包括:在压栈到未完成更新的上下文数据时,若确定未完成更新的上下文数据已完成更新,则继续按序压栈所有上下文数据。
12.根据本发明的另一个实施例,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,包括:先按序压栈排序在未完成更新的上下文数据之后的上下文数据,再按序压栈排序在未完成更新的上下文数据之前的上下文数据,最后再压栈未完成更新的上下文数据。
13.根据本发明的又一个实施例,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,包括:将所有上下文数据划分为多个数据区间;在确定未完成更新的上下文数据所处的数据区间后,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据。
14.根据本发明的一个实施例,多个数据区间包括数据长度相同的第一数据区间和第二数据区间,且未完成更新的上下文数据的数据更新时长分别小于第一数据区间和第二数据区间的数据压栈时长,进一步的,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据,包括:当未完成更新的上下文数据处于第一数据区间时,先压栈第二数据区间对应的上下文数据,再压栈第一数据区间对应的上下文数据;当未完成更新的上下文数据处于第二数据区间时,先压栈第一数据区间对应的上下文数据,再压栈第二数据区间对应的上下文数据。
15.根据本发明的另一个实施例,多个数据区间包括第三数据区间、第四数据区间和第五数据区间,第三数据区间和第四数据区间的数据长度相同,未完成更新的上下文数据处于第三数据区间或第四数据区间,且未完成更新的上下文数据的数据更新时长分别小于第三数据区间和第四数据区间的数据压栈时长,进一步的,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据,包括:当未完成更新的上下文数据处于第三数据区间时,先压栈第四数据区间对应的上下文数据,再压栈第三数据区间对应的上下文数据,最后压栈第五数据区间对应的上下文数据;当未完成更新的上下文数据处于第四数据区间时,先压栈第三数据区间对应的上下文数据,再压栈第四数据区间对应的上下文数据,最后压栈第五数据区间对应的上下文数据。
16.根据本发明的一个实施例,上下文数据包括程序状态寄存器数据、定点寄存器数据、浮点寄存器数据和中断返回地址中的一种或多种。
17.根据本发明的一个实施例,压栈未完成更新的上下文数据,包括:若确定未完成更新的上下文数据已完成更新,则压栈完成更新后的上下文数据;若确定未完成更新的上下文数据未完成更新,则在完成更新后再压栈完成更新后的上下文数据。
18.为达到上述目的,本发明第二方面实施例提出了一种数据压栈装置,包括:确定模块,用于在压栈动作发生时,确定未完成更新的上下文数据;压栈模块,用于通过确定模块确定存在未完成更新的上下文数据时,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,以及在通过确定模块确定未存在未完成更新的上下文数据时,按序压栈所有上下文数据。
19.根据本发明实施例的数据压栈装置,通过确定模块在压栈动作发生时,确定未完
成更新的上下文数据,通过压栈模块在存在未完成更新的上下文数据时,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,以及在未存在未完成更新的上下文数据时,按序压栈所有上下文数据。由此,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
20.根据本发明的一个实施例,压栈模块具体用于:先按序压栈所有上下文数据,并在压栈到未完成更新的上下文数据时,若确定未完成更新的上下文数据仍未完成更新,则跳过未完成更新的上下文数据并压栈后续上下文数据,直至后续上下文数据压栈完成后再压栈未完成更新的上下文数据。
21.根据本发明的一个实施例,压栈模块具体用于:先按序压栈排序在未完成更新的上下文数据之后的上下文数据,再按序压栈排序在未完成更新的上下文数据之前的上下文数据,最后再压栈未完成更新的上下文数据。
22.根据本发明的一个实施例,压栈模块具体用于:将所有上下文数据划分为多个数据区间,并在确定未完成更新的上下文数据所处的数据区间后,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据。
23.为达到上述目的,本发明第三方面实施例提出了一种芯片,包括存储器和处理器,存储器存储有计算机程序,处理器执行计算机程序时实现如上述的数据压栈方法的步骤。
24.根据本发明实施例的芯片,通过上述的数据压栈方法,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
25.为达到上述目的,本发明第四方面实施例提出了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如上述的数据压栈方法的步骤。
26.根据本发明实施例的计算机可读存储介质,通过上述的数据压栈方法,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
27.本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
28.图1为根据本发明一个实施例的数据压栈方法的流程示意图;
29.图2为根据本发明另一个实施例的数据压栈方法的流程示意图;
30.图3为根据本发明一个实施例的采用跳过方式的数据压栈方法的流程示意图;
31.图4为根据本发明一个实施例的采用轮转方式的数据压栈方法的流程示意图;
32.图5为根据本发明一个实施例的采用对栈进行区域划分的数据压栈方法的流程示意图;
33.图6为根据本发明又一个实施例的采用对栈进行区域划分的数据压栈方法的流程示意图;
34.图7为根据本发明一个实施例的执行浮点除法指令时的数据压栈方法的流程示意图;
35.图8为根据本发明又一个实施例的执行浮点除法指令时的数据压栈方法的流程示意图;
36.图9为根据本发明一个实施例的数据压栈装置的结构示意图。
具体实施方式
37.下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。
38.通常,在进行上下文数据的压栈时,需要保证压入堆栈中的数据为程序新鲜的数据,即当压栈动作发生时,如果有指令未执行完成且指令会更新待压栈的上下文数据,则需要等待指令执行完成才能对上下文数据进行压栈,如果该指令的执行需要消耗较多的时钟周期,则会显著增加异常或中断的响应时间,从而降低中断响应的实时性,这在进行浮点上下文压栈时尤为明显,尤其当前正在执行的指令为浮点除法指令。例如,假设浮点除法正在执行且将要更新浮点寄存器,需要16个时钟周期执行完毕,定点上下文压栈需要8个时钟周期,则处理器在完成定点上下文压栈后需要再等待8个时钟周期,以确保浮点寄存器的数据是浮点除法运算完成后的新鲜数据,这样显著增加了mcu对中断的响应时间。基于此,本技术提供了一种数据压栈优化方法,通过将压栈时间和指令执行时间进行重叠,可以减小等待指令执行完成的时间,从而提高mcu对于中断响应的实时性。
39.图1为根据本发明一个实施例的数据压栈方法的流程图,如图1所示,该数据压栈方法可包括以下步骤:
40.步骤s100,在压栈动作发生时,若存在未完成更新的上下文数据,则跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据。
41.也就是说,在压栈动作发生时,先不对未完成更新的上下文数据进行压栈,而是在其它上下文数据全部或部分压栈完成后,再压栈之前未完成更新的上下文数据,在此期间,指令一直处于执行状态并对未完成更新的上下文数据进行更新,因此在其它上下文数据全部或部分压栈完成后,再对之前未完成更新的上下文数据进行压栈,可以减小或消除等待指令执行的时间,即减小或消除等待数据更新的时间,进而提高中断响应时间。
42.举例来说,如果指令执行的时间略小于其它上下文数据全部压栈的时间,那么可在其它上下文数据全部压栈完成后再对之前未完成更新的上下文数据进行压栈,由于其它上下文数据全部压栈完成后,之前未完成更新的上下文数据已经完成更新,此时直接对完成更新的上下文数据进行压栈,从而可以消除等待数据更新的时间;如果指令执行的时间远小于其它上下文数据全部压栈的时间,那么可在其它上下文数据部分压栈完成后对之前未完成更新的上下文数据进行压栈,由于其它上下文数据部分压栈完成后,之前未完成更新的上下文数据已经完成更新,此时直接对完成更新的上下文数据进行压栈,从而可以消除等待数据更新的时间。而若指令执行的时间大于其它上下文数据全部压栈的时间,那么可在其它上下文数据全部压栈完成后再对之前未完成更新的上下文数据进行压栈,由于其它上下文数据全部压栈完成后,之前未完成更新的上下文数据还未完成更新,但是已经进行了部分更新,因此虽然不能消除等待数据更新的时间,但可以减小等待数据更新的时间。
43.在一些实施例中,压栈未完成更新的上下文数据,包括:当除未完成更新的上下文数据外的其他上下文数据都已经压栈完成后,若确定未完成更新的上下文数据已完成更新,则压栈完成更新后的上下文数据;若确定未完成更新的上下文数据未完成更新,则在完成更新后再压栈完成更新后的上下文数据。也就是说,当除未完成更新的上下文数据外的其他上下文数据都已经压栈完成时,在对之前未完成更新的上下文数据进行压栈之前,先确定之前未完成更新的上下文数据是否已经完成更新,若完成更新,则压栈完成更新后的上下文数据;否则,等待直至未完成更新的上下文数据完成更新后再进行压栈,以保证数据的新鲜。
44.步骤s200,若未存在未完成更新的上下文数据,则按序压栈所有上下文数据。
45.也就是说,在压栈动作发生时,若所有的上下文数据均已更新完成,则直接按序压栈所有上下文数据即可,具体可采用现有技术,这里不再详述。
46.可选的,上下文数据可包括程序状态寄存器数据、定点寄存器数据、浮点寄存器数据和中断返回地址中的一种或多种。
47.进一步地,作为一个具体示例,如图2所示,数据压栈方法可包括以下步骤:
48.步骤s101,响应中断请求。
49.步骤s102,判断当前是否有未完成更新的上下文寄存器(如,程序状态寄存器、定点寄存器、浮点寄存器)。如果是,则执行步骤s103;否则,执行步骤s107。
50.步骤s103,记录待更新的上下文寄存器,并先压栈其它上下文数据如已完成更新或不需要更新的上下文数据。
51.需要说明的是,在压栈其它上下文数据的同时未完成的指令也在并行执行。
52.步骤s104,在其它上下文数据压栈完成后,判断待更新的上下文寄存器是否已经完成更新。如果是,则执行步骤s105;否则,执行步骤s106。
53.步骤s105,对待更新的上下文寄存器数据进行压栈,直至压栈完成。
54.步骤s106,等待待更新的上下文寄存器完成更新,并在完成更新后,执行步骤s105。
55.步骤s107,按序压栈上下文数据,直至压栈完成。
56.由此,在压栈过程中,若存在未完成更新的上下文数据,则先跳过,优先压栈完成更新或不需要更新的上下文数据,使压栈操作和更新未完成更新的操作并行进行,也即将指令执行时间和压栈时间进行重叠,从而可以减小或消除等待指令执行完成的时间。
57.下面根据上述的数据压栈方法,扩展三种具体实现数据压栈方式的示例。
58.作为第一种示例,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,包括:先按序压栈所有上下文数据,并在压栈到未完成更新的上下文数据时,若确定未完成更新的上下文数据仍未完成更新,则跳过未完成更新的上下文数据并压栈后续上下文数据,直至后续上下文数据压栈完成后再压栈未完成更新的上下文数据。
59.也就是说,在压栈动作发生时,若存在未完成更新的上下文数据,则先按序压栈所有的上下文数据,在压栈到未完成更新的上下文数据时,判断未完成更新的上下文数据是否已经完成更新,若未完成更新的上下文数据仍未完成更新,则跳过未完成更新的上下文数据,继续压栈后面的上下文数据,在后面的上下文数据压栈完成后,再去压栈之前未完成
更新的上下文数据。进一步地,在压栈到未完成更新的上下文数据时,若未完成更新的上下文数据已完成更新,则继续按序压栈所有上下文数据。
60.作为一个具体示例,如图3所示,整个数据压栈过程可包括以下步骤:
61.步骤s201,响应中断请求。
62.步骤s202,判断当前是否有未完成更新的上下文寄存器(如,程序状态寄存器、定点寄存器、浮点寄存器)。如果是,则执行步骤s203;否则,执行步骤s209。
63.步骤s203,记录待更新的上下文寄存器,并按序压栈所有的上下文数据。
64.步骤s204,在压栈到待更新的上下文寄存器时,判断该寄存器是否已经完成更新。如果是,则执行步骤s209;否则,执行步骤s205。
65.步骤s205,跳过待更新的上下文寄存器,并进行后续上下文数据的压栈。
66.步骤s206,在后续上下文数据压栈完成后,判断待更新的上下文寄存器是否完成更新。如果是,则执行步骤s207;否则,执行步骤s208。
67.步骤s207,对待更新的上下文寄存器进行压栈,直至压栈完成。
68.步骤s208,等待待更新的上下文寄存器更新完成,并在更新完成后,执行步骤s207。
69.步骤s209,按序压栈上下文数据,直至压栈完成。
70.由此,在进行数据压栈时,先对上下文数据按序压栈,在压栈到未完成更新的上下文数据时,先跳过未完成更新的上下文数据,并进行后续上下文数据的压栈,最后再对未完成更新的上下文数据进行压栈,从而可以将压栈时间和执行指令的时间进行重叠,缩小或消除等待执行指令的时间,提高中断响应时间。
71.作为第二种示例,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,包括:先按序压栈排序在未完成更新的上下文数据之后的上下文数据,再按序压栈排序在未完成更新的上下文数据之前的上下文数据,最后再压栈未完成更新的上下文数据。
72.也就是说,可以采用轮转的方式进行数据压栈,即在数据压栈开始时确定未完成更新的上下文数据,而后先压栈在未完成更新的上下文数据之后的数据,再压栈未完成更新的上下文之前的数据,最后再压栈未完成更新的上下文数据。
73.作为一个具体示例,如图4所示,数据压栈过程可包括以下步骤:
74.步骤s301,响应中断请求。
75.步骤s302,判断当前是否有未完成更新的上下文寄存器(如,程序状态寄存器、定点寄存器、浮点寄存器)。如果是,则执行步骤s303;否则,执行步骤s308。
76.步骤s303,记录待更新的上下文寄存器索引t,并从t 1索引位置开始按序压栈至栈尾。而后,执行步骤s209,从栈开始的位置压栈到寄存器索引t-1。
77.步骤s304,从栈开始的位置压栈至寄存器索引t-1。
78.步骤s305,判断t是否完成更新。如果是,则执行步骤s306;否则,执行步骤s307。
79.步骤s306,对寄存器索引t对应的数据进行压栈,直至压栈完成。
80.步骤s307,等待寄存器索引t对应的数据更新完成,并在更新完成后,执行步骤s306。
81.步骤s308,按序压栈上下文数据,直至压栈完成。
82.由此,在进行数据压栈时,若确认存在未完成更新的上下文数据,则先对后续上下文数据进行压栈直至栈底,再从栈顶开始对上下文数据进行压栈直至压栈到未完成更新的上下文数据,最后再压栈未完成更新的上下文数据,从而可以将压栈时间和执行指令的时间进行重叠,缩小或消除等待执行指令的时间,提高中断响应时间。
83.作为第三种示例,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,包括:将所有上下文数据划分为多个数据区间;在确定未完成更新的上下文数据所处的数据区间后,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据。
84.也就是说,可以对栈的区域进行划分,通过调整各区域的压栈次序,先压栈不存在未完成更新的上下文数据所在的区域,再压栈未完成数据更新的上下文数据所在的区域。
85.在一些实施例中,多个数据区间包括数据长度相同的第一数据区间和第二数据区间,且未完成更新的上下文数据的数据更新时长分别小于第一数据区间和第二数据区间的数据压栈时长,进一步的,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据,包括:当未完成更新的上下文数据处于第一数据区间时,先压栈第二数据区间对应的上下文数据,再压栈第一数据区间对应的上下文数据;当未完成更新的上下文数据处于第二数据区间时,先压栈第一数据区间对应的上下文数据,再压栈第二数据区间对应的上下文数据。
86.作为一个具体示例,如图5所示,数据压栈过程可包括以下步骤:
87.步骤s401,响应中断请求。
88.步骤s402,判断当前是否有未完成更新的上下文寄存器。如果有,则执行步骤s403;否则,执行步骤s409。
89.步骤s403,记待更新的上下文寄存器,并将所有上下文数据划分为两个区间:[0,a)和[a,b]。需要说明的是,此处待更新的上下文寄存器的更新时长,即对应指令执行的时长,小于区间[0,a)对应的数据压栈时长、且小于区间[a,b]对应的数据压栈时长,这样可以保证在一个区间对应的数据压栈完成后,待更新的上下文寄存器也更新完成,从而可以消除等待数据更新的时长,也即指令执行的时长。
[0090]
步骤s404,判断待更新的上下文寄存器是否处于区间[0,a)。如果是,则执行步骤s405;否则,执行步骤s407。
[0091]
步骤s405,对[a,b]区间的数据进行压栈。
[0092]
步骤s406,对[a,b]区间的数据压栈完成后,对[0,a)区间的数据进行压栈,直至压栈完成。
[0093]
步骤s407,对[0,a)区间的数据进行压栈。
[0094]
步骤s408,对[0,a)区间的数据压栈完成后,对[a,b]区间的数据进行压栈,直至压栈完成。
[0095]
步骤s409,按序压栈所有上下文数据,直至压栈完成。
[0096]
由此,当未执行完的指令执行时间小于总压栈时间的二分之一时,可以将栈内容划分为两个等长的区域[0,a)和[a,b],通过调整两个区域的压栈次序来消除由于数据相关性带来的等待时间,从而提高中断响应时间。
[0097]
在另一些实施例中,多个数据区间包括第三数据区间、第四数据区间和第五数据
区间,第三数据区间和第四数据区间的数据长度相同,未完成更新的上下文数据处于第三数据区间或第四数据区间,且未完成更新的上下文数据的数据更新时长分别小于第三数据区间和第四数据区间的数据压栈时长,进一步的,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据,包括:当未完成更新的上下文数据处于第三数据区间时,先压栈第四数据区间对应的上下文数据,再压栈第三数据区间对应的上下文数据,最后压栈第五数据区间对应的上下文数据;当未完成更新的上下文数据处于第四数据区间时,先压栈第三数据区间对应的上下文数据,再压栈第四数据区间对应的上下文数据,最后压栈第五数据区间对应的上下文数据。
[0098]
也就是说,数据区间可以包括两个或者三个。其中,当未执行完的指令执行时间小于、且接近总压栈时间的二分之一时,数据区间可以包括两个,如第一数据区间和第二数据区间,具体数据压栈过程如前述;而当未执行完的指令执行时间远小于总压栈时间时,数据区间可包括三个,如第三数据区间、第四数据区间和第五数据区间,其中,两个数据区间的数据长度相同即压栈时间相同,未完成更新的上下文数据处于这两个数据区间中的一个、且其数据更新时长分别小于这两个数据区间的数据压栈时长,也就是说,可以基于指令执行时间以及未完成更新的上下文数据所处位置将区间划分为三个,其中两个区间的数据长度相同且对应数据压栈时长略大于指令执行时长,以在其中一个区间进行数据压栈时,指令能够执行完成,即未完成更新的上下文数据完成更新,而后基于划分的三个数据区间进行数据压栈,具体可参考图6所示示例。
[0099]
作为一个具体示例,参考图6所示,数据压栈过程可包括以下步骤:
[0100]
步骤s501,响应中断请求。
[0101]
步骤s502,判断当前是否有未完成更新的上下文寄存器。如果是,则执行步骤s503;否则,执行步骤s510。
[0102]
步骤s503,记待更新的上下文寄存器,并将所有上下文数据划分为三个区间:[0,a)、[a,b)和[b,c]。需要说明的是,此处待更新的上下文寄存器的更新时长,即对应指令执行的时长,小于区间[0,a)对应的数据压栈时长、且小于区间[a,b)对应的数据压栈时长,并且,待更新的上下文寄存器处于区间[0,a)或区间[a,b),这样可以保证在这两个区间中的一个区间对应的数据压栈完成后,待更新的上下文寄存器也更新完成,从而可以消除等待数据更新的时长,也即指令执行的时长。
[0103]
步骤s504,判断待更新的上下文寄存器是否处于区间[0,a)。如果是,则执行步骤s505;否则,执行步骤s507。
[0104]
步骤s505,对[a,b)区间的数据进行压栈。
[0105]
步骤s506,对[a,b)区间的数据压栈完成后,对[0,a)区间的数据进行压栈,直至压栈完成。
[0106]
步骤s507,对[0,a)区间的数据进行压栈。
[0107]
步骤s508,对[0,a)区间的数据压栈完成后,对[a,b)区间的数据进行压栈,直至压栈完成。
[0108]
步骤s509,对[b,c]区间的数据进行压栈,直至压栈完成。
[0109]
步骤s510,按序压栈所有上下文数据,直至压栈完成。
[0110]
由此,可以将栈内容划分为多段处理,如上将栈内容划分为三个区间[0,a)、[a,b)
和[b,c],并且[0,a)区间与[a,b)区间大小相等,同时指令的执行时间小于压栈[0,a)或[a,b)对应数据的时间、且待更新数据处于这两个区间的任意区间,这样可以保证在压栈过程中指令完成上下文数据的更新,压栈过程不会引入等待时间。
[0111]
进一步地,为使本领域技术人员能够更清楚的了解图6所对应的数据压栈过程,下面以一个更为具体的示例进行说明。
[0112]
例如,以嵌入式处理器常用指令集架构arm-m为例,当浮点除法指令未完成、且当前程序执行遇到中断请求时,可先进行定点上下文的压栈,浮点除法和压栈过程并行执行,而后当开始对浮点上下文进行压栈时,先判断浮点除法的目标寄存器索引是否落在s0到s7的区间,如果是,说明s0到s7浮点寄存器中有尚未更新的数据,此时跳过s0到s7的数据压栈过程,开始对s8到s15浮点寄存器数据进行压栈,从而避免了等待浮点除法目标寄存器更新造成的时间延迟。在完成s8到s15浮点寄存器的数据压栈后,压栈定点上下文和浮点上下文共耗费16个时钟周期(定点上下文压栈耗费8个时钟周期),若除法操作周期数小于等于16,则s0到s7的数据已经更新得到浮点除法的运算结果,从而可以继续压栈s0到s7的数据到堆栈中,消除了压栈等待浮点寄存器更新的时间。同样的,如果浮点除法目标寄存器不在s0到s7浮点寄存器区间内,则先将s0到s7浮点寄存器上下文压入堆栈,在完成s0到s7的上下文压栈后,压栈定点上下文和浮点上下文同样花费16个时钟周期,在除法操作时钟周期数小于等于16的情况下,除法的结果也更新到了目的寄存器中,从而可以继续进行后续的浮点上下文压栈操作,消除了浮点压栈等待除法更新目标寄存器的时间。具体数据压栈过程如图7所示,可包括以下步骤:
[0113]
步骤s601,响应中断请求。
[0114]
步骤s602,压栈定点寄存器数据。
[0115]
步骤s603,判断浮点除法目标寄存器是否处于s0到s7。如果是,则执行步骤s604;否则,执行步骤s606。
[0116]
步骤s604,压栈浮点寄存器s8到s15的数据。
[0117]
步骤s605,在浮点寄存器s8到s15的数据压栈完成后,压栈浮点寄存器s0到s7的数据。
[0118]
步骤s606,压栈浮点寄存器s0到s7的数据。
[0119]
步骤s607,在浮点寄存器s0到s7的数据压栈完成后,压栈浮点寄存器s8到s15的数据。
[0120]
步骤s608,压栈浮点寄存器s16到s31的数据。
[0121]
步骤s609,压栈浮点状态寄存器数据,直至压栈完成。
[0122]
进一步的,可对上述压栈方法进行扩展,使其适应更长的除法操作时钟周期,从而使上述压栈方法具有普适性。
[0123]
具体来说,假设浮点的运算周期为m,压栈定点上下文的时钟周期为n,则可以选择浮点上下文索引为t=m-n,将浮点寄存器划分为三个区间:s(0)到s(t-1)、s(t)到s(2t-1)以及s(2t)到s31,其中,当浮点除法目标寄存器的索引在s0到s(t-1)区间时,先进行s(t)到s(2t-1)浮点寄存器数据的压栈,再进行s0到s(t-1)浮点寄存器数据的压栈;当浮点除法目标寄存器的索引不在s(0)到s(t-1)区间时,先进行s(0)到s(t-1)浮点寄存器数据的压栈,再进行后续的浮点压栈。具体数据压栈过程如图8所示,可包括以下步骤:
[0124]
步骤s701,响应中断请求。
[0125]
步骤s702,压栈定点寄存器数据。
[0126]
步骤s703,判断浮点除法目标寄存器是否处于s(0)到s(t-1)。如果是,则执行步骤s704;否则,执行步骤s706。
[0127]
步骤s704,压栈浮点寄存器s(t)到s(2t-1)的数据。
[0128]
步骤s705,在浮点寄存器s(t)到s(2t-1)的数据压栈完成后,压栈浮点寄存器s(0)到s(t-1)的数据。
[0129]
步骤s706,压栈浮点寄存器s(0)到s(t-1)的数据。
[0130]
步骤s707,在浮点寄存器s(0)到s(t-1)的数据压栈完成后,压栈浮点寄存器s(t)到s(2t-1)的数据。
[0131]
步骤s708,压栈浮点寄存器s(2t)到s31的数据。
[0132]
步骤s709,压栈浮点状态寄存器数据,直至压栈完成。
[0133]
需要说明的是,上述三种实现方式在适用性和实用性各有优点,可根据实际指令执行时间以及上下文数据的数量灵活选择,具体这里不做限制;并且,本技术的数据压栈方法不仅适用于定点数据的压栈,也适用于浮点数据的压栈,如浮点除法、浮点乘法以及其它多周期浮点或定点指令,其中,由于浮点除法指令通常执行时间较长,采用本技术的数据压栈方法可以更明显的提高中断响应的实时性。另外,本技术的数据压栈方法的思路为根据待更新上下文数据调整上下文压栈顺序,从而将待更新数据的更新时间隐藏在上下文数据压栈过程中,从而减小或消除等待数据更新的时间,而上述示例中对于上下文寄存器的划分方式仅是示例性说明,其它划分方式或通过调整上下文数据的压栈顺序均应视为和本技术所述方法原理一致。
[0134]
综上所述,根据本发明实施例的数据压栈方法,在压栈动作发生时,若存在未完成更新的上下文数据,则跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据;若未存在未完成更新的上下文数据,则按序压栈所有上下文数据。由此,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
[0135]
图9为根据本发明一个实施例的数据压栈装置的结构示意图,参考图9所示,该数据压栈装置50可包括:确定模块51和压栈模块52。
[0136]
其中,确定模块51用于在压栈动作发生时,确定未完成更新的上下文数据。压栈模块52用于通过确定模块确定存在未完成更新的上下文数据时,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,以及在通过确定模块确定未存在未完成更新的上下文数据时,按序压栈所有上下文数据。
[0137]
作为第一种实施例,压栈模块52具体用于:先按序压栈所有上下文数据,并在压栈到未完成更新的上下文数据时,若确定未完成更新的上下文数据仍未完成更新,则跳过未完成更新的上下文数据并压栈后续上下文数据,直至后续上下文数据压栈完成后再压栈未完成更新的上下文数据。
[0138]
进一步的,在一些实施例中,压栈模块52还用于:在压栈到未完成更新的上下文数据时,若确定未完成更新的上下文数据已完成更新,则继续按序压栈所有上下文数据。
[0139]
作为第二种实施例,压栈模块52具体用于:先按序压栈排序在未完成更新的上下
文数据之后的上下文数据,再按序压栈排序在未完成更新的上下文数据之前的上下文数据,最后再压栈未完成更新的上下文数据。
[0140]
作为第三种实施例,压栈模块52具体用于:将所有上下文数据划分为多个数据区间;在确定未完成更新的上下文数据所处的数据区间后,先压栈其它数据区间对应的上下文数据,再压栈未完成更新的上下文数据所处的数据区间对应的上下文数据。
[0141]
进一步的,在一些实施例中,多个数据区间包括数据长度相同的第一数据区间和第二数据区间,且未完成更新的上下文数据的数据更新时长分别小于第一数据区间和第二数据区间的数据压栈时长,压栈模块52还用于:当未完成更新的上下文数据处于第一数据区间时,先压栈第二数据区间对应的上下文数据,再压栈第一数据区间对应的上下文数据;当未完成更新的上下文数据处于第二数据区间时,先压栈第一数据区间对应的上下文数据,再压栈第二数据区间对应的上下文数据。
[0142]
进一步的,在一些实施例中,多个数据区间包括第三数据区间、第四数据区间和第五数据区间,第三数据区间和第四数据区间的数据长度相同,未完成更新的上下文数据处于第三数据区间或第四数据区间,且未完成更新的上下文数据的数据更新时长分别小于第三数据区间和第四数据区间的数据压栈时长,压栈模块52还用于:当未完成更新的上下文数据处于第三数据区间时,先压栈第四数据区间对应的上下文数据,再压栈第三数据区间对应的上下文数据,最后压栈第五数据区间对应的上下文数据;当未完成更新的上下文数据处于第四数据区间时,先压栈第三数据区间对应的上下文数据,再压栈第四数据区间对应的上下文数据,最后压栈第五数据区间对应的上下文数据。
[0143]
在一些实施例中,上下文数据包括程序状态寄存器数据、定点寄存器数据、浮点寄存器数据和中断返回地址中的一种或多种。
[0144]
在一些实施例中,压栈模块52还用于:若确定未完成更新的上下文数据已完成更新,则压栈完成更新后的上下文数据;若确定未完成更新的上下文数据未完成更新,则在完成更新后再压栈完成更新后的上下文数据。
[0145]
需要说明的是,关于本技术中数据压栈装置的描述,请参考本技术中关于数据压栈烦方法的描述,具体这里不再赘述。
[0146]
根据本发明实施例的数据压栈装置,通过确定模块在压栈动作发生时,确定未完成更新的上下文数据,通过压栈模块在存在未完成更新的上下文数据时,跳过未完成更新的上下文数据,并在其它上下文数据全部或部分压栈完成后再压栈未完成更新的上下文数据,以及在未存在未完成更新的上下文数据时,按序压栈所有上下文数据。由此,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
[0147]
在一些实施例中,本发明的实施例还提供了一种芯片,包括存储器和处理器,存储器存储有计算机程序,处理器执行计算机程序时实现如上述的数据压栈方法的步骤。
[0148]
根据本发明实施例的芯片,通过上述的数据压栈方法,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
[0149]
在一些实施例中,本发明的实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如上述的数据压栈方法的步骤。
[0150]
根据本发明实施例的计算机可读存储介质,通过上述的数据压栈方法,在存在未完成更新的上下文数据时,能够使得数据压栈和数据更新并行,减小或消除等待数据更新的时间,从而提高中断响应的实时性。
[0151]
需要说明的是,在流程图中表示或在此以其它方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其它可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(ram),只读存储器(rom),可擦除可编辑只读存储器(eprom或闪速存储器),光纤装置,以及便携式光盘只读存储器(cdrom)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其它合适的介质,因为可以例如通过对纸或其它介质进行光学扫描,接着进行编辑、解译或必要时以其它合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
[0152]
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(pga),现场可编程门阵列(fpga)等。
[0153]
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0154]
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
[0155]
在本发明中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”、“固定”等术语应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系,除非另有明确的限定。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。
[0156]
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献