CN112631510A - 堆栈区域扩充的方法、装置及硬件平台 - Google Patents
堆栈区域扩充的方法、装置及硬件平台 Download PDFInfo
- Publication number
- CN112631510A CN112631510A CN202011391989.5A CN202011391989A CN112631510A CN 112631510 A CN112631510 A CN 112631510A CN 202011391989 A CN202011391989 A CN 202011391989A CN 112631510 A CN112631510 A CN 112631510A
- Authority
- CN
- China
- Prior art keywords
- stack
- stack area
- register
- area
- value
- 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
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0604—Improving or facilitating administration, e.g. storage management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
- G06F3/0644—Management of space entities, e.g. partitions, extents, pools
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0673—Single storage device
- G06F3/0679—Non-volatile semiconductor memory device, e.g. flash memory, one time programmable memory [OTP]
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Human Computer Interaction (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供一种堆栈区域扩充的方法、装置、硬件平台、电子设备及可读存储介质,能够在高速RAM资源有限的情况下将堆栈区域扩充到低速RAM,解决开发人员因堆栈受限而无法开发复杂应用的问题。方法包括:S1、获取可用做堆栈的至少一个资源块,至少一个资源块中的每个资源块作为一个堆栈区域使用,从而提供多个堆栈区域;S2、将多个堆栈区域排序;S3、按序使用多个堆栈区域,使用过程之中,如果当前使用的第一堆栈区域上溢,则切换到第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到第一堆栈区域的上一堆栈区域。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种堆栈区域扩充的方法、装置及硬件平台、电子设备和可读存储介质。
背景技术
随着物联网,移动互联网,云计算等产业的不断发展与增长,其依赖的半导体产业也取得长足发展,芯片作为核心变得越来越重要。目前针对不同的应用方向与场景,出现了许多专用芯片和通用芯片,有的为低功耗,有的为低成本,有的为高性能等等,这就导致出现许多种类的资源受限的芯片(包括但不限于MCU,MPU等),在这些芯片中高速的RAM(比如SRAM)作为一种成本较高的资源,往往数量较少,而速度相对较低的RAM(比如DRAM)成本往往也较低,因此提供的数量相对多一点。
在芯片应用中,堆栈(stack)是个特殊的存储区,属于RAM空间的一部分,主要用于函数活动记录,比如保存函数调用时的参数、返回地址及特殊寄存器等,同时也为函数的局部变量分配存储空间。另外,中断切换时保存和恢复现场(与函数类似)。堆栈具有先进后出的特性,根据平台的不同,与堆栈相关的寄存器数量会有不同。在具有堆栈功能的硬件平台中,一般至少有一个堆栈指针寄存器(SP),用于指向堆栈的栈顶地址。
由于堆栈频繁使用,因此为了提升性能,往往会使用速度最快的RAM,而且目前的堆栈区域都是连续的,这就导致堆栈区域往往很小,非常容易出现堆栈溢出的情况,不易写出复杂的应用,并且出现错误不易排查,给开发人员的开发增加了困难,严重影响开发效率。
发明内容
本发明提供一种堆栈区域扩充的方法、装置、硬件平台、电子设备及可读存储介质,能够在高速RAM资源有限的情况下将堆栈区域扩充到低速RAM,解决开发人员因堆栈受限而无法开发复杂应用的问题。
第一方面,本发明提供一种堆栈区域扩充的方法,包括:
S1、获取可用做堆栈的至少一个资源块,所述至少一个资源块中的每个资源块作为一个堆栈区域使用,从而提供多个堆栈区域;
S2、将所述多个堆栈区域排序;
S3、按序使用所述多个堆栈区域,使用过程之中,如果当前使用的第一堆栈区域上溢,则切换到所述第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到所述第一堆栈区域的上一堆栈区域。
可选地,所述资源块包括多个离散RAM区域中的一个或多个。
可选地,步骤S1之前还包括:根据系统资源,划分可用作堆栈的至少一个资源块。
可选地,步骤S2中按照所述多个堆栈区域对应的资源块的存取速度从高到低进行排序;或者,按照所述多个堆栈区域对应的资源块的存取速度并结合所述资源块的大小进行排序。
可选地,步骤S2还包括:将完成排序的所述多个堆栈区域的操作管理信息存入数据结构;所述操作管理信息包括所述多个堆栈区域的排列顺序信息,以及每个堆栈区域的地址、大小及当该堆栈区域作为当前使用的堆栈区域工作时溢出后需要备份的寄存器及其大小,所述溢出包括上溢和下溢;步骤S3中根据所述操作管理信息按序使用所述多个堆栈区域。
可选地,所述数据结构包括数组,所述数组中各元素的顺序与所述多个堆栈区域的排列顺序一致,所述数组中的每个元素包含的信息包括:与所述元素对应的所述堆栈区域的地址、大小以及当所述堆栈区域溢出后需要备份的各寄存器及其大小。
可选地,所述堆栈区域溢出后需要备份的各寄存器设置于对应的堆栈区域的尾部,所述堆栈溢出后需要备份的各寄存器包括:堆栈指针寄存器SP,堆栈计数寄存器CNT,堆栈大小寄存器SZ;步骤S3包括:
S31、程序初始化时,初始化所述数组的索引,使其指向所述数组的开始元素;根据所述索引从所述数组中取出一个元素,然后根据该元素包含的信息设置所述堆栈指针寄存器SP的值、所述堆栈大小寄存器SZ的值、所述堆栈计数寄存器CNT的值,并使所述堆栈区域能够在溢出时产生中断;
循环执行下述步骤,直至程序结束:
S32、程序执行过程中,如果遇到需要操作所述堆栈指针寄存器SP来保留堆栈区域的指令或操作时,在修改所述堆栈指针寄存器SP的值之前,使所述堆栈计数寄存器CNT增加与所述指令或操作相应的计数;如果遇到需要操作所述堆栈指针寄存器SP来释放堆栈区域的指令或操作时,在修改所述堆栈指针寄存器SP的值之前,使所述堆栈计数寄存器CNT减去与所述指令或操作相应的计数;
S33、当所述堆栈计数寄存器CNT的值大于等于所述堆栈大小寄存器SZ的值,或者所述堆栈计数寄存器CNT的值小于0时,均触发中断,进入中断处理函数,并将所述堆栈计数寄存器CNT的值回退到修改之前,并将标志寄存器的堆栈标志位置至0或1;
S34、所述中断处理函数根据所述标志寄存器的堆栈标志位判断为下溢还是上溢;如果为下溢,则进行下溢处理,如果为上溢,则进行上溢处理。
可选地,所述进行上溢处理的步骤包括:
S340、将所述中断函数返回地址出栈放入对应的寄存器中;
S341、根据所述数组的索引从所述数组中取出当前元素,根据该当前元素的信息备份当前堆栈区域溢出后需要备份的各寄存器;
S342、将所述数组的索引自增1,按自增后的索引从所述数组中取出对应的元素,并根据该元素的信息重新设置所述堆栈指针寄存器SP的值、所述堆栈大小寄存器SZ的值、所述堆栈计数寄存器CNT的值;
S343、将所述中断函数返回地址压入所述堆栈指针寄存器SP重新设置后指向的当前堆栈中,所述中断函数执行完毕并返回,重新执行堆栈相关指令;
所述进行下溢处理的步骤包括:
S344、将所述中断函数返回地址出栈放入对应的寄存器中;
S345、将所述数组的索引自减1,按自减后的索引从所述数组中取出对应的元素,然后根据该元素包含的信息获取堆栈区域的地址和大小,得到备份的所述堆栈指针寄存器SP的值,还原所述堆栈指针寄存器SP的值;
S346、从还原后的所述堆栈指针寄存器SP指向的当前堆栈中还原备份的所述堆栈计数寄存器CNT、所述堆栈大小寄存器SZ的值;
S347、将所述中断函数返回值地址压入所述当前堆栈的栈顶,所述中断函数执行完毕并返回,重新执行堆栈相关指令。
可选地,步骤S342和S345中,如果所述数组的索引在自增和自减的过程中超过所述堆栈区域的数量范围,通过软件触发异常,进行报错。
第二方面,本发明提供一种用于堆栈区域扩充的装置,该装置包括:
获取模块,用于获取可用做堆栈的至少一个资源块,所述至少一个资源块中的每个资源块作为一个堆栈区域使用,从而提供多个堆栈区域;
排序模块,用于将所述多个堆栈区域排序;
堆栈区域管理模块,用于按序使用所述多个堆栈区域,并在使用过程之中,如果当前使用的第一堆栈区域上溢,则切换到所述第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到所述第一堆栈区域的上一堆栈区域。
第三方面,本发明提供一种硬件平台,所述硬件平台采用了上述堆栈区域扩充的方法。
第四方面,本发明提供一种电子设备,包括存储器和处理器,所述存储器存储有堆栈区域扩充程序,所述堆栈区域扩充程序用于被所述处理器运行以执行上述堆栈区域扩充方法中的各步骤。
第五方面,本发明提供一种可读存储介质,所述可读存储介质中存储有堆栈区域扩充程序,所述堆栈区域扩充程序用于被处理器运行以执行上述堆栈区域扩充方法的各步骤。
本实施例的提供的堆栈区域扩充的方法,将至少一个资源块中的每个资源块作为一个堆栈区域使用,从而可提供多个堆栈区域;多个堆栈区域排序并按序使用,使用过程中,如果当前使用的第一堆栈区域上溢,则切换到第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到第一堆栈区域的上一堆栈区域。这样,可以利用内部或外部的分散的资源块作为堆栈区域使用。在内部或高速RAM资源有限的芯片上,可以使用外部或者低速RAM,或者多个离散RAM区域来扩充堆栈,使得开发者在开发项目时不受限于RAM资源,并且更好进行堆栈跟踪,充分利用硬件提供的资源。
附图说明
图1为本发明一实施例提供的堆栈区域扩充的方法的流程图;
图2为本发明另一实施例提供的堆栈区域扩充的方法的流程图;
图3为一种标志寄存器的结构示意图;
图4为本发明另一实施例上溢处理的流程示意图;
图5为本发明另一实施例上溢处理的原理示意图;
图6为本发明另一实施例下溢处理的流程示意图;
图7为本发明另一实施例下溢处理的原理示意图;
图8为本发明提供的用于堆栈区域扩充的装置的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本文描述中使用的缩略语和关键术语:
RAM:随机存取存储器(random access memory,缩写:RAM),是与CPU直接交换数据的内部存储器。
SRAM:静态随机存取存储器(Static Random-Access Memory,缩写:SRAM),是随机存取存储器的一种。这种存储器只要保持通电,里面储存的数据就可以一直保持。
DRAM:动态随机存取存储器(Dynamic Random Access Memory,缩写:DRAM),需要周期性地充电来保持里面储存的数据。
SDRAM:同步动态随机存取存储器(synchronous dynamic random-accessmemory,缩写:SDRAM)是有一个同步接口的动态随机存取内存(DRAM)。通常DRAM是有一个异步接口的,这样它可以随时响应控制输入的变化。而SDRAM有一个同步接口,在响应控制输入前会等待一个时钟信号,这样就能和计算机的系统总线同步。
Stack:堆栈(stack)是个特殊的存储区,属于RAM空间的一部分,主要用于函数活动记录,比如保存函数调用时的参数、返回地址及特殊寄存器等,同时也为函数的局部变量分配存储空间,另外中断切换时保存和恢复现场(与函数类似)。
SP:堆栈指针寄存器(stack pointer register,缩写:SP),用于指向堆栈的栈顶地址。
FP:栈帧指针寄存器(frame pointer register,缩写:FP),用来访问函数栈帧中的局部变量。
AP:参数指针寄存器(argument pointer register,缩写:AP),用来指示访问函数参数的基地址。
堆栈计数寄存器(Stack counter register,缩写:CNT),用来存储当前使用的堆栈区域。
堆栈大小寄存器(Stack size register,缩写:SZ)用来存储当前使用的堆栈区域的大小。
堆栈的溢出、上溢和下溢:
由于堆栈区域是在堆栈定义时就确定了的,因而堆栈工作过程中有可能产生溢出。堆栈溢出有两种情况可能发生:如堆栈已满,但还想再存入信息,这种情况称为堆栈上溢;另一种情况是,如堆栈已空,但还想再取出信息,这种情况称为堆栈下溢。不论上溢或下溢,都是不允许的。因此在编制程序时,如果可能发生堆栈溢出,则应在程序中采取保护措施。如溢出则作溢出处理,以避免破坏其他存储区或使程序出错的情况发生。
如图1所示,本发明的实施例提供一种堆栈区域扩充的方法,包括:
S1、获取可用做堆栈的至少一个资源块,至少一个资源块中的每个资源块作为一个堆栈区域使用,从而提供多个堆栈区域;
本步骤中可用做堆栈的资源块可以是在设备内部RAM资源中也可以是设备外部RAM存储资源中;可以是高速RAM资源,也可以是低速RAM资源。资源块还可以是多个离散RAM区域中的一个或多个,即如果存在多个离散RAM区域,而其中的一个或多个RAM区域可以分配给堆栈,来作为堆栈区域使用。示例性地,如果内部RAM存在一个或多个离散的内部RAM区域(或者说内部RAM资源块),同时外部RAM也存在一个或多个离散的外部RAM区域(或者说外部RAM资源块),则本步骤获取该些内部RAM区域以及外部RAM区域的例如地址、大小、存储速度等信息,以便后续作为堆栈使用。此处对RAM的类型不做限定,RAM可以是下述存储资源中的一项或多项:静态随机存取存储器SRAM,动态随机存取存储器DRAM,同步动态随机存取存储器SDRAM。即,若存在可用作堆栈多个资源块,该多个资源块的物理分布并不限于芯片内部,还可以包括位于芯片外部RAM上的资源块;该多个资源块的类型也可以不一致。
在一些实施例中,还可以根据系统资源,划分可用作堆栈的至少一个资源块。每个资源块作为一个堆栈区域使用,从而可提供多个堆栈区域。
S2、将多个堆栈区域排序;
本步骤将步骤S1中的多个堆栈区域进行排序,排序的方法包括但不限于按照RAM速度快慢从快到慢排序,也可以是其他排序方法。
例如,本步骤可以按照多个堆栈区域对应的资源块的存取速度从高到低进行排序;也可以按照多个堆栈区域对应的资源块的存取速度并结合资源块的大小进行排序。
S3、按序使用多个堆栈区域,使用过程之中,如果当前使用的第一堆栈区域上溢,则切换到第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到第一堆栈区域的上一堆栈区域。
本步骤中排列顺序使用上述多个堆栈区域,如果当前使用的第一堆栈区域已满,但还想再存入信息(这种情况称为堆栈上溢),则按照已排列好的顺序,切换到与第一堆栈区域相邻的下一个堆栈区域,在该下一个堆栈区域继续存储信息。如果当前使用的第一堆栈区域已空,但还想再取出信息(这种情况称为堆栈下溢),则按照已排列好的顺序,则切换到与第一堆栈区域相邻的上一个堆栈区域,在该下一个堆栈区域继续进行取出信息的操作。
本实施例提供的堆栈区域扩充的方法,在内部或高速RAM资源有限的芯片上,使用外部或者低速RAM,或者多个离散RAM区域来扩充堆栈,使得开发者在开发项目时不受限于RAM资源,并且更好进行堆栈跟踪,充分利用硬件提供的资源。
在一些实施例中,步骤S2还可包括:将完成排序的多个堆栈区域的操作管理信息存入数据结构;操作管理信息定义为所述多个堆栈区域进行管理,完成步骤S3所需要的信息,一般包括多个堆栈区域的排列顺序信息,以及每个堆栈区域的地址、大小及当该堆栈区域作为当前使用的堆栈区域工作时溢出后需要备份的寄存器及其大小,溢出包括上溢和下溢;步骤S3中根据操作管理信息按序使用多个堆栈区域。
数据结构包括但不限于数组。本实施例中虽然以数组为例对技术方案进行说明,但本领域技术人员可以理解的是,还可以采用其他数据结构存储上述操作管理信息。数组中各元素的顺序与多个堆栈区域的排列顺序一致,数组中的每个元素是一个结构体,每个结构体包含的信息有与该元素对应的堆栈区域的地址、堆栈区域的大小,当堆栈溢出后需要备份的各寄存器及其大小等。
根据硬件平台的不同,与堆栈相关的寄存器数量会有不同,比如某些硬件平台有SP寄存器、FP寄存器、AP寄存器等等,但是不管硬件平台如何实现,在具有堆栈功能的硬件平台中,至少有一个堆栈指针寄存器(SP),用于指向堆栈的栈顶地址。
为管理本申请中的多个堆栈区域,我们新设置了堆栈计数寄存器CNT和堆栈大小寄存器SZ。堆栈计数寄存器CNT用于存储当前已使用的堆栈区域大小;堆栈大小寄存器SZ用于存储当前的堆栈区域的大小。因此一般地,步骤S3中堆栈溢出后需要备份的各寄存器可以包括:堆栈指针寄存器SP、堆栈计数寄存器CNT和堆栈大小寄存器SZ。可选地,某堆栈区域溢出后需要备份的各寄存器可设置于对应的该堆栈区域的顶部,不计入堆栈区域的可存储的大小。
下面以数组为例,对步骤S3进行详细叙述。如图2所示,步骤S3可包括:
S31、程序初始化时,初始化数组的索引,使其指向数组的开始元素;根据索引从数组中取出一个元素,然后根据该元素包含的信息设置堆栈指针寄存器SP的值、堆栈大小寄存器SZ的值、堆栈计数寄存器CNT的值,并使堆栈区域能够在溢出时产生中断;
本步骤的这个“程序”是指在使用了本申请提供的堆栈区域扩充的方法方案的芯片上运行的应用程序,不限制是哪种类型,只要在这个芯片上运行即可。
本步骤根据元素信息设置堆栈指针寄存器SP的值为获取的堆栈区域地址,设置堆栈大小寄存器SZ的值为S(S计算方式见下面的公式),设置堆栈计数寄存器CNT的值为0。堆栈大小寄存器SZ的值计算公式为:S=N-M,
式中,S为设置堆栈大小寄存器SZ的值;N为堆栈区域的大小;M为需要备份寄存器总大小。
循环执行下述步骤S32-S34,直至程序结束:
S32、程序执行过程中,如果遇到需要操作堆栈指针寄存器SP来保留堆栈区域的指令或操作时,在修改堆栈指针寄存器SP的值之前,使堆栈计数寄存器CNT增加与指令或操作相应的计数;如果遇到需要操作堆栈指针寄存器SP来释放堆栈区域的指令或操作时,在修改堆栈指针寄存器SP的值之前,使堆栈计数寄存器CNT减去与指令或操作相应的计数;
程序执行过程中,如果遇到CALL、PUSH、中断等操作堆栈指针寄存器SP来保留堆栈区域的指令或操作时,硬件使堆栈计数寄存器CNT增加相应大小的计数。该计数与上述指令或操作的具体内容有关。例如,CALL指令会将返回地址压栈,地址长度取决于硬件平台,若硬件平台地址长度为4字节,那么此种情况下执行CALL指令,硬件便会将堆栈计数寄存器CNT的值加4,且堆栈计数寄存器CNT的修改在堆栈指针寄存器SP的值修改之前。
程序执行过程中,如果遇到RET、RETI、POP等操作堆栈指针寄存器SP来释放堆栈区域的指令或操作时,硬件使堆栈计数寄存器CNT减去相应大小的计数,且堆栈计数寄存器CNT的修改在堆栈指针寄存器SP的值修改之前。
S33、当堆栈计数寄存器CNT的值大于等于堆栈大小寄存器SZ的值,或者堆栈计数寄存器CNT的值小于0时,均触发中断,进入中断处理函数,并将堆栈计数寄存器CNT的值回退到修改之前,并将标志寄存器的堆栈标志位置至0或1;
S34、中断处理函数根据标志寄存器的堆栈标志位判断为下溢还是上溢;如果为下溢,则进行下溢处理,如果为上溢,则进行上溢处理。
当堆栈计数寄存器CNT的值大于等于堆栈大小寄存器SZ的值时,硬件回退堆栈计数寄存器CNT的值到修改之前,将标志寄存器堆栈标志位置0,用以表示堆栈区域上溢,并触发中断,进入中断处理函数。中断处理函数中,根据标志寄存器堆栈标志位是否为上溢,若是将进行上溢处理。
当堆栈计数寄存器CNT的值小于0时,硬件回退堆栈计数寄存器CNT的值到修改之前,将标志寄存器堆栈标志位置1,用以表示堆栈区域下溢,并触发中断,进入中断处理函数。中断处理函数中,根据标志寄存器堆栈标志位是否为1,判断是否为下溢,若是将进行下溢处理。图3为一种标志寄存器的示意图。
可选地,如图4和图5所示,进行上溢处理的步骤包括:
S340、将中断函数返回地址出栈放入对应的寄存器中;
S341、根据数组的索引从数组中取出当前元素,根据该当前元素的信息备份当前堆栈区域溢出后需要备份的各寄存器;
本步骤具体可以包括:将栈顶中断函数返回地址出栈放入预留的寄存器中;将堆栈计数寄存器CNT,堆栈大小寄存器SZ等值入栈;将堆栈指针寄存器SP的值放入堆栈区域的末尾,因为有可能存在空隙。
S342、将数组的索引自增1,按自增后的索引从数组中取出对应的元素,并根据该元素的信息重新设置堆栈指针寄存器SP的值、堆栈大小寄存器SZ的值、堆栈计数寄存器CNT的值;
本步骤根据元素信息设置堆栈指针寄存器SP的值为堆栈区域地址,本步骤可以将设置堆栈大小寄存器SZ的值为S,S的计算方式参考上面步骤S31的公式,设置堆栈计数寄存器CNT的值为0。
如果中断前当前堆栈区域为第一堆栈区域,本步骤获取第一堆栈区域的下一堆栈区域的操作管理信息,并将其设置为当前堆栈区域。
S343、将步骤340中的中断函数返回地址压入堆栈指针寄存器SP重新设置后指向的当前堆栈中,中断函数执行完毕并返回,重新执行堆栈相关指令;
压入堆栈指针寄存器SP重新设置后指向的当前堆栈即第一堆栈区域的下一堆栈区域。
如图6和图7所示,进行下溢处理的步骤包括:
S344、将中断函数返回地址出栈放入对应的寄存器中;
S345、将数组的索引自减1,按自减后的索引从数组中取出对应的元素,然后根据该元素包含的信息获取堆栈区域的地址和大小,得到备份的堆栈指针寄存器SP的值,还原堆栈指针寄存器SP的值;
如果中断前当前堆栈区域为第一堆栈区域,本步骤获取第一堆栈区域的上一堆栈区域的操作管理信息。
S346、从还原后的堆栈指针寄存器SP指向的当前堆栈中还原备份的堆栈计数寄存器CNT、堆栈大小寄存器SZ的值;
本步骤将当前堆栈区域切换为第一堆栈区域的上一堆栈区域。
S347、将步骤344中的中断函数返回值地址压入当前堆栈的栈顶,中断函数执行完毕并返回,重新执行堆栈相关指令。
本步骤从步骤344中的寄存器中获取所述中断函数返回值地址的地址,并压入新的当前堆栈(即第一堆栈区域的上一堆栈区域)的栈顶。
可选地,步骤S342和S345中,如果数组的索引在自增和自减的过程中超过堆栈区域的数量范围,发生溢出,此处的溢出是指整个可以作为堆栈区域的资源均用尽,通过软件触发异常,进行溢出报错。例如,可以通过软件触发异常,进行报错,也可以使用其他处理方式。通过本申请提供的堆栈区域扩充的方法,可以在内部或高速RAM资源有限的芯片上,使用外部或者低速RAM,或者多个离散RAM区域来扩充堆栈,使得开发者在开发项目时不受限于RAM资源,并且更好进行堆栈跟踪,充分利用硬件提供的资源。
本申请提供的堆栈区域扩充的方法,可以只需应用提供中断处理函数,不需要对现有编译器以及应用其他部分进行改动,即可实现不限堆栈区域数量,不限RAM类型的堆栈扩充,具有较强的兼容性。
通过上述方案,在堆栈区域溢出时能被及时发现,这样能给用户提供更好的报错机制。本发明的实施例还提供一种用于堆栈区域扩充的装置,如图8所示,所述装置10包括:
获取模块11,用于获取可用做堆栈的至少一个资源块,所述至少一个资源块中的每个资源块作为一个堆栈区域使用,从而提供多个堆栈区域;
排序模块12,用于将所述多个堆栈区域排序;
堆栈区域管理模块13,用于按序使用所述多个堆栈区域,并在使用过程之中,如果当前使用的第一堆栈区域上溢,则切换到所述第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到所述第一堆栈区域的上一堆栈区域。
本发明的实施例还提供一种硬件平台,硬件平台采用了上述堆栈区域扩充的方法。
本申请的技术方案还可以通过软件的形式实现。如果预先设置好堆栈信息和中断函数,可以通过下载软件在某个芯片实施这种堆栈扩容方法。进一步地,可以通过软件方式根据系统自选自动设置好堆栈信息并生成中断函数。
本发明的实施例还提供一种电子设备,包括存储器和处理器,存储器存储有程序,程序用于被处理器运行以执行上述堆栈区域扩充的方法。
本发明的实施例还提供一种可读存储介质,可读存储介质中存储有程序,程序用于被处理器运行以执行上述堆栈区域扩充的方法。
本领域普通技术人员可以理解实现上述方法实施例中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (13)
1.一种堆栈区域扩充的方法,其特征在于,包括:
S1、获取可用做堆栈的至少一个资源块,所述至少一个资源块中的每个资源块作为一个堆栈区域使用,从而提供多个堆栈区域;
S2、将所述多个堆栈区域排序;
S3、按序使用所述多个堆栈区域,使用过程之中,如果当前使用的第一堆栈区域上溢,则切换到所述第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到所述第一堆栈区域的上一堆栈区域。
2.根据权利要求1所述的堆栈区域扩充的方法,其特征在于,所述资源块包括多个离散随机存取存储器RAM区域中的一个或多个。
3.根据权利要求1所述的堆栈区域扩充的方法,其特征在于,步骤S1之前还包括:根据系统资源,划分可用作堆栈的至少一个资源块。
4.根据权利要求1所述的堆栈区域扩充的方法,其特征在于,步骤S2中按照所述多个堆栈区域对应的资源块的存取速度从高到低进行排序;或者,按照所述多个堆栈区域对应的资源块的存取速度并结合所述资源块的大小进行排序。
5.根据权利要求1-4任一项所述的堆栈区域扩充的方法,其特征在于,步骤S2还包括:
将完成排序的所述多个堆栈区域的操作管理信息存入数据结构;所述操作管理信息包括所述多个堆栈区域的排列顺序信息,以及每个堆栈区域的地址、大小及当该堆栈区域作为当前使用的堆栈区域工作时溢出后需要备份的寄存器及其大小,所述溢出包括上溢和下溢;
步骤S3中根据所述操作管理信息按序使用所述多个堆栈区域。
6.根据权利要求5所述的堆栈区域扩充的方法,其特征在于,所述数据结构包括数组,所述数组中各元素的顺序与所述多个堆栈区域的排列顺序一致,所述数组中的每个元素包含的信息包括:与所述元素对应的所述堆栈区域的地址、大小以及当所述堆栈区域溢出后需要备份的各寄存器及其大小。
7.根据权利要求6所述的堆栈区域扩充的方法,其特征在于,所述堆栈区域溢出后需要备份的各寄存器设置于对应的堆栈区域的顶部,所述堆栈溢出后需要备份的各寄存器包括:堆栈指针寄存器SP,堆栈计数寄存器CNT,堆栈大小寄存器SZ;步骤S3包括:
S31、程序初始化时,初始化所述数组的索引,使其指向所述数组的开始元素;根据所述索引从所述数组中取出一个元素,然后根据该元素包含的信息设置所述堆栈指针寄存器SP的值、所述堆栈大小寄存器SZ的值、所述堆栈计数寄存器CNT的值,并使所述堆栈区域能够在溢出时产生中断;循环执行下述步骤S32-S34,直至程序结束。
S32、程序执行过程中,如果遇到需要操作所述堆栈指针寄存器SP来保留堆栈区域的指令或操作时,在修改所述堆栈指针寄存器SP的值之前,使所述堆栈计数寄存器CNT增加与所述指令或操作相应的计数;如果遇到需要操作所述堆栈指针寄存器SP来释放堆栈区域的指令或操作时,在修改所述堆栈指针寄存器SP的值之前,使所述堆栈计数寄存器CNT减去与所述指令或操作相应的计数;
S33、当所述堆栈计数寄存器CNT的值大于等于所述堆栈大小寄存器SZ的值,或者所述堆栈计数寄存器CNT的值小于0时,均触发中断,进入中断处理函数,并将所述堆栈计数寄存器CNT的值回退到修改之前,并将标志寄存器的堆栈标志位置至0或1;
S34、所述中断处理函数根据所述标志寄存器的堆栈标志位判断为下溢还是上溢;如果为下溢,则进行下溢处理,如果为上溢,则进行上溢处理。
8.根据权利要求7所述的堆栈区域扩充的方法,其特征在于,所述进行上溢处理的步骤包括:
S340、将所述中断函数返回地址出栈放入对应的寄存器中;
S341、根据所述数组的索引从所述数组中取出当前元素,根据该当前元素的信息备份当前堆栈区域溢出后需要备份的各寄存器;
S342、将所述数组的索引自增1,按自增后的索引从所述数组中取出对应的元素,并根据该元素的信息重新设置所述堆栈指针寄存器SP的值、所述堆栈大小寄存器SZ的值、所述堆栈计数寄存器CNT的值;
S343、将所述中断函数返回地址压入所述堆栈指针寄存器SP重新设置后指向的当前堆栈中,所述中断函数执行完毕并返回,重新执行堆栈相关指令;
所述进行下溢处理的步骤包括:
S344、将所述中断函数返回地址出栈放入对应的寄存器中;
S345、将所述数组的索引自减1,按自减后的索引从所述数组中取出对应的元素,然后根据该元素包含的信息获取堆栈区域的地址和大小,得到备份的所述堆栈指针寄存器SP的值,还原所述堆栈指针寄存器SP的值;
S346、从还原后的所述堆栈指针寄存器SP指向的当前堆栈中还原备份的所述堆栈计数寄存器CNT、所述堆栈大小寄存器SZ的值;
S347、将所述中断函数返回值地址压入所述当前堆栈的栈顶,所述中断函数执行完毕并返回,重新执行堆栈相关指令。
9.根据权利要求8所述的堆栈区域扩充的方法,其特征在于,步骤S342和S345中,如果所述数组的索引在自增和自减的过程中超过所述堆栈区域的数量范围,通过软件触发异常,进行报错。
10.一种用于堆栈区域扩充的装置,其特征在于,包括:
获取模块,用于获取可用做堆栈的至少一个资源块,所述至少一个资源块中的每个资源块作为一个堆栈区域使用,从而提供多个堆栈区域;
排序模块,用于将所述多个堆栈区域排序;
堆栈区域管理模块,用于按序使用所述多个堆栈区域,并在使用过程之中,如果当前使用的第一堆栈区域上溢,则切换到所述第一堆栈区域的下一堆栈区域,如果当前使用的堆栈区域下溢,则切换到所述第一堆栈区域的上一堆栈区域。
11.一种硬件平台,其特征在于,采用了包括如权利要求1至9中任一项所述的堆栈区域扩充的方法。
12.一种电子设备,其特征在于,包括存储器和处理器,所述存储器存储有程序,所述程序用于被所述处理器运行以执行权利要求1至9中任一项所述的堆栈区域扩充的方法。
13.一种可读存储介质,其特征在于,所述可读存储介质中存储有程序,所述程序用于被处理器运行以执行如上述权利要求1至9中任一项所述的堆栈区域扩充的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011391989.5A CN112631510B (zh) | 2020-12-02 | 2020-12-02 | 堆栈区域扩充的方法、装置及硬件平台 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011391989.5A CN112631510B (zh) | 2020-12-02 | 2020-12-02 | 堆栈区域扩充的方法、装置及硬件平台 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112631510A true CN112631510A (zh) | 2021-04-09 |
CN112631510B CN112631510B (zh) | 2023-05-12 |
Family
ID=75307433
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011391989.5A Active CN112631510B (zh) | 2020-12-02 | 2020-12-02 | 堆栈区域扩充的方法、装置及硬件平台 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112631510B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113377466A (zh) * | 2021-06-29 | 2021-09-10 | 展讯通信(天津)有限公司 | 算法执行方法、装置和电子设备 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1334512A (zh) * | 2000-07-18 | 2002-02-06 | 多思资讯(集团)有限公司 | 堆栈式寄存器堆及其控制方法 |
CN1609785A (zh) * | 2004-10-27 | 2005-04-27 | 上海大学 | 堆栈区域扩充方法 |
CN1869936A (zh) * | 2005-05-25 | 2006-11-29 | 三星电子株式会社 | 电子设备及其引导方法 |
CN101290590A (zh) * | 2008-06-03 | 2008-10-22 | 北京中星微电子有限公司 | 一种嵌入式操作系统中切换任务的方法和单元 |
CN101443731A (zh) * | 2006-05-26 | 2009-05-27 | Vns组合有限责任公司 | 计算机的循环寄存器阵列 |
CN106200849A (zh) * | 2015-04-20 | 2016-12-07 | 华东科技股份有限公司 | 储存设备堆栈系统的执行方法 |
CN107729240A (zh) * | 2017-09-30 | 2018-02-23 | 山东省科学院自动化研究所 | 嵌入式软件堆栈溢出检测方法和装置 |
CN111124979A (zh) * | 2019-10-31 | 2020-05-08 | 苏州浪潮智能科技有限公司 | 一种基于堆栈结构的i2c多主访问方法和系统 |
-
2020
- 2020-12-02 CN CN202011391989.5A patent/CN112631510B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1334512A (zh) * | 2000-07-18 | 2002-02-06 | 多思资讯(集团)有限公司 | 堆栈式寄存器堆及其控制方法 |
CN1609785A (zh) * | 2004-10-27 | 2005-04-27 | 上海大学 | 堆栈区域扩充方法 |
CN1869936A (zh) * | 2005-05-25 | 2006-11-29 | 三星电子株式会社 | 电子设备及其引导方法 |
CN101443731A (zh) * | 2006-05-26 | 2009-05-27 | Vns组合有限责任公司 | 计算机的循环寄存器阵列 |
CN101290590A (zh) * | 2008-06-03 | 2008-10-22 | 北京中星微电子有限公司 | 一种嵌入式操作系统中切换任务的方法和单元 |
CN106200849A (zh) * | 2015-04-20 | 2016-12-07 | 华东科技股份有限公司 | 储存设备堆栈系统的执行方法 |
CN107729240A (zh) * | 2017-09-30 | 2018-02-23 | 山东省科学院自动化研究所 | 嵌入式软件堆栈溢出检测方法和装置 |
CN111124979A (zh) * | 2019-10-31 | 2020-05-08 | 苏州浪潮智能科技有限公司 | 一种基于堆栈结构的i2c多主访问方法和系统 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113377466A (zh) * | 2021-06-29 | 2021-09-10 | 展讯通信(天津)有限公司 | 算法执行方法、装置和电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN112631510B (zh) | 2023-05-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10649953B2 (en) | Blockchain-based data migration method and apparatus | |
CN108459898B (zh) | 一种资源回收方法及装置 | |
US7424589B1 (en) | Method and an apparatus for the high-precision tracking of approximate per-task memory usage | |
US10289454B2 (en) | Systems and methods for implementing work stealing using a configurable separation of stealable and non-stealable work items | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
CN115269196A (zh) | 线程池动态创建方法、装置、设备及存储介质 | |
CN114356248B (zh) | 一种数据处理方法和装置 | |
CN112631510B (zh) | 堆栈区域扩充的方法、装置及硬件平台 | |
JP5673666B2 (ja) | マルチコアプロセッサシステム、割込プログラム、および割込方法 | |
CN112783652A (zh) | 当前任务的运行状态获取方法、装置、设备及存储介质 | |
CN114826793B (zh) | 一种rop链的检测方法、装置及介质 | |
US6493781B1 (en) | Servicing of interrupts with stored and restored flags | |
CN110618946A (zh) | 堆栈内存分配方法、装置、设备和存储介质 | |
CN103593606A (zh) | 上下文信息管理方法及系统 | |
Fatourou et al. | Linearizable wait-free iteration operations in shared double-ended queues | |
WO2021061269A1 (en) | Storage control apparatus, processing apparatus, computer system, and storage control method | |
CN105183668A (zh) | 缓存刷新方法及装置 | |
US7814290B1 (en) | Synchronous detection and signaling of memory quota violations for sequential memory allocation in a shared heap | |
CN114327767B (zh) | 任务处理的方法、装置、电子设备及计算机可读存储介质 | |
CN111814007B (zh) | 双向链表数据处理方法、装置、设备及机器可读存储介质 | |
US11681527B2 (en) | Electronic device and multiplexing method of spatial | |
CN117539451B (zh) | 流程执行方法、装置、电子设备及存储介质 | |
CN113419871B (zh) | 基于同步槽的对象处理方法及相关产品 | |
CN106951306B (zh) | 一种stw检测方法、装置及设备 | |
CN116991327A (zh) | 数据处理方法、装置、电子设备和可读存储介质 |
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 |