当前位置: 首页 > 专利查询>上海大学专利>正文

堆栈区域扩充方法技术

技术编号:2863740 阅读:292 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及一种堆栈区域扩充方法。本方法是基于8051体系,用外部RAM代替内部RAM作为堆栈的备用部分来延伸堆栈区域,当片上堆栈溢出时,自动切换到片外堆栈(使用片外RAM资源来延伸堆栈区域),实现堆栈容量的扩充和堆栈的跟踪。本堆栈区域扩充方法可应用于基于8051指令体系的单片微控制器,亦可应用于其它微控制器、微处理器等领域。

【技术实现步骤摘要】

本专利技术涉及一种基于8051指令体系的,可应用于基于8051指令体系的单片微控制器,亦可应用于其它微控制器、微处理器等领域。
技术介绍
堆栈(Stack Pointer-SP)通常是在存储器中划分出的一个特殊区域,用来存放一些特殊数据,实际上是一个数据的暂存器。这种暂存数据的存储区域由堆栈指示器SP中的内容决定。微处理器运行时,会碰到中断、调用子模块(子程序)等,这时往往将当前PC指针压栈(保存),当系统比较复杂或处理的事件较多时,会出现多重的嵌套调用或中断,这时就有许多相应的PC指针值需要压栈(保存)。而标准8051中,堆栈指针SP是一个8位专用寄存器,它指示出堆栈顶部在内部RAM区域中的位置。SP可以使用的区域为07H-7FH,栈顶固定为7FH,而栈基则可以设在此区域的任何位置。通常用户为了更多地使用有限的内部RAM空间,会把SP的初值即栈基设置得比较高,如60H,这样SP真正用到的区域空间只有1FH。对于大型的频繁调用子程序的项目,以及使用递归算法的程序时,堆栈就可能溢出导致数据丢失。当超出堆栈的容量时,就会发生堆栈溢出,这时PC指针值就不能保护,程序就不能从断点处恢复执行,往往使程序跑飞,系统崩溃。一种简单的解决办法是加大堆栈的容量,但对象标准8051这类单片微控制器来说,其片上RAM资源有限(标准8051只有128字节),且实际使用中不能把片上RAM都作为堆栈使用,数据缓存、数据处理都要用片上RAM,另外内嵌大容量RAM会使得芯片面积增加,导致芯片成本升高,因此简单地增加内部RAM的容量来扩容堆栈区域是不合算的,实际上也是不可行的。专利技术内容本专利技术的目的在于提供一种,它基于标准8051体系的堆栈跟踪功能,能用廉价的外部RAM代替内部RAM作为堆栈的备用部分来延伸堆栈区域,当片上堆栈溢出时,自动切换到片外堆栈(使用片外RAM资源来),实现堆栈容量的扩充和堆栈的跟踪。为达到上述目的,本专利技术的构思如下 由于标准8051的可用堆栈区在内部(片上)RAM的07H-7FH,本专利技术将堆栈区扩充为内部(片上)RAM的07H-7FH和外部(片外)RAM的80H-FFH两个区域,具备的堆栈跟踪功能能让SP在内部RAM的07H-7FH和外部RAM的80-FFH两个区域之间自由切换,即当栈顶跃出内部RAM空间时,SP自动指向外部RAM;反之外部RAM的堆栈空时,SP自动指向内部RAM,切换过程不需要用户的任何参与。扩展的128级堆栈空间可以让用户随心所欲地嵌套子程序和中断,并能很方便地将参数传递给子程序和局部变量,而不用再为狭小的堆栈空间烦恼。用户所要做的仅仅是开始时设置SPTCON寄存器来打开堆栈跟踪功能,默认情况下此功能关闭。由于不管是开启还是关闭此功能,SP都有可能溢出,因此设置了用户不可见的系统内部堆栈溢出标志。该标志动态跟踪SP的值,堆栈溢出时微控制器会自动置此标志位,以使WDT(不用计数延时)能立刻复位系统。根据上述构思,本专利技术采用下述技术方案一种,其特征在于基于8051体系,用外部RAM代替内部RAM作为堆栈的备用部分来延伸堆栈区域,当片上堆栈溢出时,自动切换到片外堆栈,用片 外RAM资源来延伸堆栈区域,实现堆栈容量的扩充和堆栈的跟踪。上述的具体步骤为a.设置堆栈扩充功能寄存器SPTCON,来打开堆栈扩充功能,默认情况下该功能关闭;b.划分堆栈区域,即将MCU的堆栈分为内部堆栈和外部堆栈,其中外部堆栈区域是要进行堆栈扩充的区域,并设定相关信号;c.根据所划分的内部、外部两个堆栈区域,对堆栈扩充操作考虑以下三种情况,并设定相关信号(a)当前堆栈操作纯粹在内部或外部RAM中;(b)涉及跨区域操作RET/RETI或LCALL/ACALL执行过程中两次读写RAM的指令,而且两次压栈的RAM区域不同;(c)在指针指向内部RAM的7FH时执行PUSH,或指向外部RAM的80H时执行POP指令。设置上述的堆栈扩充功能寄存器SPTCON方法为确定堆栈扩充功能寄存器SPTCON的地址为C8H,所有功能的控制是通过读写堆栈扩充功能寄存器SPTCON来实现; 开启堆栈指针扩充功能,SP在内部RAM的07-7FH和外部RAM的80-FFH两个区域之间自由切换,当堆栈指针SP溢出内部RAM空间时,SP自动指向外部RAM的80-FFH;设置用户不可见的系统内部堆栈溢出标志SPTF,该标志动态跟踪SP的值,不管堆栈跟踪是否被激活,堆栈溢出时微控制器都会自动置‘1’,系统立刻复位。设定上述的MCU堆栈区域划分的相关信号的具体步骤为a.用ESP表示外部堆栈指针,用ISP表示内部堆栈指针,系统的堆栈指针则仍用SP表示,当前堆栈活动指针ISP或ESP的内容会延时一个时钟周期反映到SP;b.ISP_INUSE信号表示当前堆栈活动指针属性,当ISP_INUSE信号有效表示当前堆栈活动指针是ISP,反之则表示当前堆栈活动指针是ESP,或执行的是跨栈操作;c.ISP_INUSE是堆栈扩充模块的输出信号,也是MCU的堆栈指针的状态信号,没有打开堆栈扩充时,系统默认为ISP_INUSE信号有效。CPU通过不断检测ISP_INUSE信号来判断当前堆栈位置(片上还是片外)从而控制各功能模块。设定上述的堆栈扩充三种情况下的相关信号的具体步骤为a.两个表明涉及跨栈操作的标志性寄存器SPINC和SPDECSPINC表明当前SP要进行由内部堆栈指针转向外部堆栈指针的操作;SPDEC表明当前SP要进行由外部堆栈指针转向内部堆栈指针的操作;b.两个中间计数器CNT和COUNTCNT对SP加1/减1的操作次数进行计数;COUNT对内部RAM的写操作次数进行计数;c.两种与堆栈指令有关的译码信号XSRTOBE_CON和XMEMORY_CON。XSRTOBE_CON控制外部RAM的读写控制信号。XMEMORY_CON控制对外部RAM的寻址操作和数据传输。设定上述的ISP_INUSE信号的具体步骤为a.在每个机器周期的末尾根据SP堆栈指针值的最高位即SP[7]来判断当前堆栈指针SP工作在哪个区,如工作在片上RAM07-7FH,SP[7]=0,则ISP_INUSE=0;如工作在片外RAM80-FFH,SP[7]=1,则ISP_INUSE=1; b.在每个机器周期的其他时刻,在没有打开堆栈跟踪或者外部堆栈指针始终指向栈底,表明进行跨栈操作的信号SPINC和SPDEC都无效时,ISP_INUSE=1,即表明此时进行的是片上压栈。设定上述的SPINC信号的具体步骤为SPINC涉及到的指令有ACALL/LCALL/PUSH指令,SPINC有效时,即其为1时表明堆栈指针SP要执行跨栈操作,即堆栈指针SP要由内部堆栈指针ISP转向外部堆栈指针ESP;标志寄存器SPINC的有效状态为1的条件为以下三个条件有一个成立a.当前ISP的值为7FH时,执行的是ACALL/LCALL指令,要执行对PC7~0和PC15~8的压栈操作(CNT=0);b.当前ISP的值为7FH时,执行的是ACALL/LCALL指令,要执行对PC15~8的压栈操作,对PC7~0的压栈操作已进行完毕,COUNT=1;c.当前ISP的值为7FH时,执行的是PUSH DIR指令,要执行压栈操作。设定上述本文档来自技高网...

【技术保护点】
一种堆栈区域扩充方法,其特征在于基于8051体系,用外部RAM代替内部RAM作为堆栈的备用部分来延伸堆栈区域,当片上堆栈溢出时,自动切换到片外堆栈,用片外RAM资源来延伸堆栈区域,实现堆栈容量的扩充和堆栈的跟踪。

【技术特征摘要】
1.一种堆栈区域扩充方法,其特征在于基于8051体系,用外部RAM代替内部RAM作为堆栈的备用部分来延伸堆栈区域,当片上堆栈溢出时,自动切换到片外堆栈,用片外RAM资源来延伸堆栈区域,实现堆栈容量的扩充和堆栈的跟踪。2.根据权利要求1所述的堆栈区域扩充方法,其特征在于具体步骤为a.设置堆栈扩充功能寄存器SPTCON,来打开堆栈扩充功能,默认情况下该功能关闭;b.划分堆栈区域,即将MCU的堆栈分为内部堆栈和外部堆栈,其中外部堆栈区域是要进行堆栈扩充的区域,并设定相关信号;c.根据所划分的内部、外部两个堆栈区域,对堆栈扩充操作考虑以下三种情况,并设定相关信号(a)当前堆栈操作纯粹在内部或外部RAM中;(b)涉及跨区域操作RET/RETI或LCALL/ACALL执行过程中两次读写RAM的指令,而且两次压栈的RAM区域不同;(c)在指针指向内部RAM的7FH时执行PUSH,或指向外部RAM的80H时执行POP指令。3.根据权利要求2所述的堆栈区域扩充方法,其特征在于设置堆栈扩充功能寄存器SPTCON的方法为确定堆栈扩充功能寄存器SPTCON的地址为C8H,所有功能的控制是通过读写堆栈扩充功能寄存器SPTCON来实现;开启堆栈指针扩充功能,SP在内部RAM的07-7FH和外部RAM的80-FFH两个区域之间自由切换,当堆栈指针SP溢出内部RAM空间时,SP自动指向外部RAM的80-FFH;设置用户不可见的系统内部堆栈溢出标志SPTF,该标志动态跟踪SP的值,不管堆栈跟踪是否被激活,堆栈溢出时微控制器都会自动置‘1’,系统立刻复位。4.根据权利要求2所述的堆栈区域扩充方法,其特征在于设定MCU堆栈区域划分的相关信号的具体步骤为a.用ESP表示外部堆栈指针,用ISP表示内部堆栈指针,系统的堆栈指针则仍用SP表示,当前堆栈活动指针ISP或ESP的内容会延时一个时钟周期反映到SP;b.ISP_INUSE信号表示当前堆栈活动指针属性,当ISP_INUSE信号有效表示当前堆栈活动指针是ISP,反之则表示当前堆栈活动指针是ESP,或执行的是跨栈操作;c.ISP_INUSE是堆栈扩充模块的输出信号,也是MCU的堆栈指针的状态信号,没有打开堆栈扩充时,系统默认为ISP_INUSE信号有效。CPU通过不断检测ISP_INUSE信号来判断当前堆栈位置(片上还是片外)从而控制各功能模块。5.根据权利要求2所述的堆栈区域扩充方法,其特征在于设定堆栈扩充三种情况下的相关信号的具体步骤为a.两个表明涉及跨栈操作的标志性寄存器SPINC和SPDECSPINC表明当前SP要进行由内部堆栈指针转向外部堆栈指针的操作;SPDEC表明当前SP要进行由外部堆栈指针转向内部堆栈指针的操作;b.两个中间计数器CNT和COUNTCNT对SP加1/减1的操作次数进行计数;COUNT对内部RAM的写操作次数进行计数;c.两种与堆栈指令有关的译码信号XSRTOBE_CON和XMEMORY_CON。XSRTOBE_CON控制外部RAM的读写控制信号。XMEMORY_CON控制对外部RAM的寻址操作和数据传输。6.根据权利要求4所述的堆栈区域扩充方法,其特征在于设定ISP_INUSE信号的具体步骤为a.在每个机器周期的末尾根据SP堆栈指针值的最高位即SP[7]来判断当前堆栈指针SP工作在哪个区,如工作在片上RAM07-7FH,SP[7]=0,则ISP_INUSE=0...

【专利技术属性】
技术研发人员:胡越黎冉峰郭腊梅朱良辰
申请(专利权)人:上海大学
类型:发明
国别省市:31[中国|上海]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1