堆栈区域扩充方法

文档序号:6421676阅读:441来源:国知局
专利名称:堆栈区域扩充方法
技术领域
本发明涉及一种基于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指令,要执行压栈操作。
设定上述的SPDEC信号的具体步骤为SPDEC涉及到的指令有RET/RETI/POP指令,SPDEC有效时,即其为1时表明堆栈指针SP要执行跨栈操作,即堆栈指针SP要由外部堆栈指针ESP转向内部堆栈指针ISP;标志寄存器SPDEC的有效状态为1的条件为以下三个条件有一个成立a.当前指令为RET/RETI,ESP=7FH,ISP=7FH,只执行了一次出栈操作,CNT=1;b.当前指令为RET/RETI,ESP=7FH,ISP=7FH,执行了两次出栈操作,CNT=2;c.当前指令为POP指令,ESP=7FH,ISP=7FH,执行了一次出栈操作,CNT=1。
设定上述的外部堆栈有关的控制信号XSRTOBE_CON和XMEMORY_CON信号的具体步骤为XSRTOBE_CON、XMEMORY_CON由ISP_INUSE的状态来控制,ISP_INUSE为有效状态则XSRTOBE_CON、XMEMORY_CON为无效状态0,反之则为有效状态1;a.如果是内部堆栈,则ISP_INUSE=1,XSRTOBE_CON、XMEMORY_CON译码信号无效;堆栈指针指向内部堆栈指针ISP;不对外部RAM进行读写操作和数据传输;b.如果是外部堆栈操作,则SPINC、SPDEC、ISP_INUSE都为无效状态。而XSRTOBE_CON、XMEMORY_CON为有效状态,进行对外部RAM的读写控制以及对外部RAM的寻址和数据传输控制;堆栈指针指向外部堆栈指针ESP;c.如果是跨栈操作a)SPINC由无效变为有效,则ISP_INUSE由有效变为无效,XSRTOBE_CON、XMEMORY_CON译码信号也由无效变为有效;进行对外部RAM的读写控制以及对外部RAM的寻址和数据传输控制;由执行内部堆栈操作变为执行外部堆栈操作;堆栈指针SP由内部堆栈指针转向外部堆栈指针ESP;b)SPDEC由无效变为有效,则ISP_INUSE XSRTOBE_CON、XMEMORY_CON译码信号仍为无效,堆栈操作由执行外部堆栈操作变为执行内部堆栈操作,不对外部RAM进行读写操作和数据传输,堆栈指针SP由外部堆栈指针ESP转向内部堆栈指针ISP。
本发明与现有技术相比较,具有如下显而易见的突出实质性特点和显著优点本发明基于8051体系,用廉价的外部RAM代替内部RAM作为堆栈的备用部分来延伸堆栈区域,在标准的8051保留的特殊功能寄存器(SFR)中定义一个堆栈扩充寄存器SPTCON,来打开堆栈扩充功能,默认情况下该功能关闭,则当片上堆栈溢出时,能自动切换到片外堆栈,用片外RAM资源来延伸堆栈区域,实现堆栈容量的扩充和堆栈的跟踪。本发明可应用于基于8051指令体系的单片微控制器,亦可应用于其它微控制器、微处理器等领域。


图1是本发明一个实施例的堆栈结构示意图。
图2是图1示例正常情况下LCALL/ACALL的时序图。
图3是图1示例的片外RAM区SP跟踪时序波形图。
图4是图1示例的跨RAM区SP跟踪时波形图。
图5是图1示例的片外RAM区SP跟踪时序波形图。
图6是图1示例的片内RAM区SP跟踪波形图。
图7是图1示例的片外RAM区SP跟踪时波形图。
图8是图1示例的片外RAM区SP跟踪时波形图。
具体实施例方式
本发明的一个优选实施例详述如下本堆栈区域扩充方法采用下述的堆栈结构(见附图1)
●堆栈指针(stack pointer)栈顶所在的地址。若一项被添加到堆栈或由堆栈删除,则此指针相应的被增量或减量,始终指向栈顶。
●堆栈基址(stack base)容纳此保留块的底部位置的地址。当堆栈是空时,初始堆栈指针就是堆栈基址。注意,此时进行POP操作将报告出错。
●堆栈界限(stack limit)堆栈容量的上限,即当堆栈满时,其栈顶所在的地址。注意,此时进行PUSH操作则报告出错。当SP超出堆栈界限时,就会“失踪”,程序的断点不能保存,程序就不能正常执行,系统崩溃。
从堆栈结构图可看出,扩大堆栈容量是保证堆栈指针不失踪的必要条件。但微控制器的片上资源十分珍贵,且有限的资源还不能都用于堆栈,另外扩充片上RAM将使芯片面积增大,成本提高。因此本发明采用片外RAM作为扩充的堆栈区,一旦片内堆栈用满(溢出),系统自动转入片外堆栈,从而扩大了堆栈容量而又不占用微控制器的片上资源。基于本发明的思想,对于16位的微处理器,堆栈区理论上可达64KB,扩展的堆栈区可用低成本的片外数据存储区。
具体实施方法为在标准8051保留的特殊功能寄存器(SFR)中定义一个堆栈扩充功能寄存器SPTCON,地址为C8H。所有功能的控制是通过读写堆栈扩充功能寄存器SPTCON实现。
堆栈扩充功能寄存器SPTCON的定义如下SPTCON 地址C8H

SPTCON.3-7都是保留位,总是置零。
SPTOE默认情况下这位为0。
SPTE默认情况下这位为0,SP堆栈区域扩充功能是关闭的。
要打开SP堆栈区域扩充功能,必须遵循以下过程1)把‘1’写入SPTE来开启此功能;MOV 0C8H,#02H。
2)在同一次写操作内同时向SPTOE和SPTE写‘1’即可打开SP堆栈区域扩充功能;MOV 0C8H,#06H。
SPTFSP的状态标志位,系统自动设置,用户只能读不能写。在打开堆栈区域扩充功能时,对SPTCON做整体写操作,不会影响该位内容。
开启堆栈指针功能,SP在内部RAM的07-7FH和外部RAM的80-FFH两个区域之间自由切换。当堆栈指针SP溢出内部RAM空间时,SP自动指向外部RAM的80-FFH,此过程不需要用户的任何参与。用户所要做的仅仅是开始时设置SPTCON寄存器来打开此项功能,默认情况下该功能关闭。同时考虑到开启或关闭此功能时SP还有可能溢出,因此设置了用户不可见的系统内部堆栈溢出标志SPTF。该标志动态跟踪SP的值,不管堆栈扩充是否被激活,堆栈溢出时微控制器都会自动置‘1’,系统立刻复位。
(1)堆栈区域扩充方法的方案将MCU的堆栈分为内部堆栈(片上RAM,07-7FH)和外部堆栈(片外RAM,80H-FFH),用ESP表示外部堆栈指针,用ISP表示内部堆栈指针,ISP_INUSE信号表示当前堆栈活动指针属性,当ISP_INUSE信号有效表示当前堆栈活动指针是ISP,反之则表示当前堆栈活动指针是ESP,或执行的是跨栈操作。ISP_INUSE是堆栈扩充模块的输出信号,也是MCU的堆栈指针的状态信号,没有打开堆栈扩充时,系统默认为ISP_INUSE信号有效。CPU通过不断检测ISP_INUSE信号来判断当前堆栈位置(片上还是片外)从而控制各功能模块。系统的堆栈指针则仍用SP表示,当前堆栈活动指针(ISP或ESP)的内容会延时一个时钟周期反映到SP。
(2)具体相关控制信号和状态信号的设定及指令时序图由于堆栈指针指向外部RAM时,不仅指令周期要变长,还要类似MOVX一样读写外部RAM(因为扩展的堆栈区在外部RAM上),因此许多地方(除了指令寄存器和中断系统外)包括的所有控制单元模块、ALU操作数的输入选择和I/O端口处理模块,要增加对ISP_INUSE的控制逻辑。堆栈扩充涉及到LCALL、ACALL、RET、RETI、PUSH和POP六条指令,堆栈扩充发生时,这六条指令的读写操作时序会有变化(见附表1给出了当堆栈指针指向外部RAM时,这六条指令的时序变化情况)。ISP_INUSE信号的设计需考虑三种情况,(1)当前堆栈操作纯粹在内部或外部RAM中;(2)涉及跨区域操作,如RET/RETI或LCALL/ACALL执行过程中两次读写RAM的指令,而且两次压栈的RAM区域不同;(3)在指针指向内部RAM的7FH时执行PUSH,或指向外部RAM的80H时执行POP指令。
对于(1)只需判断当前ISP或ESP的值即可;对于(2)和(3)由于涉及到跨区域操作,则较为复杂,必须非常清楚当前操作处于一个哪个阶段,当指针由内部堆栈指针转为外部堆栈指针或由外部堆栈指针转为内部堆栈指针时,表明当前堆栈活动指针属性的寄存器ISP_INUSE的有效状态就要发生变化。所以又增加了两个表明涉及跨栈操作的标志性寄存器SPINC和SPDEC,由这两个寄存器的有效状态分别表明当前SP要进行由内部堆栈指针转向外部堆栈指针的操作还是由外部堆栈指针转向内部堆栈指针的操作。且增加两个中间计数器CNT和COUNT,分别对SP加1/减1的操作次数进行计数和内部RAM的写操作次数进行计数。针对于外部堆栈操作,又增加了两种与堆栈指令有关的译码信号XSRTOBE_CON—控制外部RAM的读写控制信号。XMEMORY_CON—控制对外部RAM的寻址操作和数据传输。
标志寄存器SPINC的有效状态为1的条件为以下三个条件有一个成立即可①当前ISP的值为7FH时,执行的是ACALL/LCALL指令,要执行对PC7~0和PC15~8的压栈操作(CNT=0)。
②当前ISP的值为7FH时,执行的是ACALL/LCALL指令,要执行对PC15~8的压栈操作,对PC7~0的压栈操作已进行完毕(COUNT=1)。
③当前ISP的值为7FH时,执行的是PUSH DIR指令,要执行压栈操作。
SPINC涉及到的指令有ACALL/LCALL/PUSH指令,SP的操作是SP先加1并重新写入SP,再把要保存的内容写入SP指定的地址中。
对于①,由于当前ISP的值为7FH,SP执行加1操作,且转向外部堆栈指针ESP,所以两次的压栈操作的地址都是外部RAM。
对于②第一次压栈操作是在内部RAM中完成的,SP采用内部堆栈指针ISP。第二次在外部RAM中完成,SP采用外部堆栈指针ESP。
对于③只执行一次压栈操作,SP指针由内部堆栈指针ISP转向外部堆栈指针ESP,压栈在外部RAM中完成。
标志寄存器SPDEC的有效状态为1的条件为以下三个条件有一个成立即可①当前指令为RET/RETI,ESP=7FH,ISP=7FH,只执行了一次出栈操作(CNT=1)。
②当前指令为RET/RETI,ESP=7FH,ISP=7FH,执行了两次出栈操作(CNT=2)。
③当前指令为POP指令,ESP=7FH,ISP=7FH,执行了一次出栈操作(CNT=1)。
SPDEC涉及到的指令有RET/RETI/POP指令,SP的操作是先把SP指定地址中的内容弹出,SP再执行减1操作并重新写入SP。
对于①SP执行减1后等于7FH的值重新写入SP要比ESP=7FH延后一个时钟周期,所以当ESP=7FH时SP=80H。PORT口送出出栈地址0080H,在NXRAMR有效的情况下弹出该地址中的内容到指定寄存器。所以下一个出栈地址应是7FH,SP自动减1,ISP=7EH,下一个时钟周期SP堆栈指针自动转向内部堆栈指针ISP等于7EH。
对于②第一次、第二次出栈地址都是外部RAM地址,第二次出栈地址为外部RAM的0080H,且弹出第二个字节后SP减1重新写入后为7FH,自动指向内部堆栈指针ISP。
对于③POP指令只进行一次一个字节的弹出操作,弹出地址为外部RAM的0080H。SP弹出内容后自动减1等于7FH,并重新写入且指向内部堆栈指针ISP。
以上两个标志性寄存器SPINC和SPDEC有效时表明堆栈指针SP要执行跨栈操作,即堆栈指针SP要由内部堆栈指针ISP转向外部堆栈指针ESP,或由外部堆栈指针ESP转向内部堆栈指针ISP。所以这时表示当前堆栈活动指针属性的ISP_INUSE信号应无效。
表示当前堆栈活动指针属性的ISP_INUSE信号有效,即表示当前堆栈活动指针是ISP的条件为以下三个条件有一个成立即可①SP的活动范围是07H~7FH。
②没有打开堆栈跟踪。
③ESP=7FH且SPINC和SPDEC都为无效状态。
所以当ISP_INUSE信号有效时表明进行的是内部堆栈操作;ISP_INUSE信号无效,SPINC、SPDEC信号有效表明进行的是跨栈操作;ISP_INUSE信号无效,SPINC、SPDEC信号无效表明进行的是外部堆栈操作。
堆栈的总体操作流程如下(1)对于涉及堆栈操作的指令,在当前指令开始的机器周期的第一个时钟周期的上升沿开始处ISP_INUSE取反子SP的最高位。如SP=07H~7FH,则ISP_INUSE=1,为有效状态。如SP=80H~FFH,则ISP_INUSE=0,为无效状态。且上升沿处开始译码,译出相关的控制信号。与堆栈有关的控制信号有MEM_CON、XSRTOBE_CON、XMEMORY_CON。其中XSRTOBE_CON、XMEMORY_CON由ISP_INUSE的状态来控制,如ISP_INUSE为有效状态则XSRTOBE_CON、XMEMORY_CON为无效状态0,反之则为有效状态1。即XSRTOBE_CON、XMEMORY_CON都是和外部堆栈有关的控制信号。
(2)继第一个时钟周期后在以后的每个时钟周期的上升沿处ISP_INUSE的状态都会根据上述条件来判断其状态,进而再根据ISP_INUSE的状态来控制与堆栈相关的各模块。
①如果是内部堆栈,则ISP_INUSE=1,XSRTOBE_CON、XMEMORY_CON译码信号无效。堆栈指针指向内部堆栈指针ISP。
②如果是外部堆栈操作,则SPINC、SPDEC、ISP_INUSE都为无效状态。而XSRTOBE_CON、XMEMORY_CON为有效状态,进行对外部RAM的读写控制以及对外部RAM的寻址和数据传输控制。堆栈指针指向外部堆栈指针ESP。
③如果是跨栈操作,1)SPINC由无效变为有效,则ISP_INUSE由有效变为无效,XSRTOBE_CON、XMEMORY_CON译码信号也由无效变为有效。由执行内部堆栈操作变为执行外部堆栈操作。堆栈指针SP由内部堆栈指针转向外部堆栈指针ESP。2)SPDEC由无效变为有效,则ISP_INUSE XSRTOBE_CON、XMEMORY_CON译码信号仍为无效,堆栈操作由执行外部堆栈操作变为执行内部堆栈操作。堆栈指针SP由外部堆栈指针ESP转向内部堆栈指针ISP。
以下是具体指令的执行情况①LCALL/ACALL1)正常情况下(时序波形见附图2)LCALL/ACALL的压栈操作在内部RAM中完成,ISP_INUSE信号有效。堆栈指针SP指向内部堆栈指针ISP的情况下,操作时序只用两个机器周期。
2)片外RAM区SP跟踪(时序波形见附图3)LCALL/ACALL的压栈操作在外部RAM中完成,ISP_INUSE信号无效,SPINC、SPDEC无效。堆栈指针SP指向外部堆栈指针ESP的情况下,操作时序要四个机器周期。
3)跨RAM区SP跟踪(时序波形见附图4)若当前SP=7EH(ISP)时执行CALLS指令。
a.第一次ISP=ISP+1=7FH,PC7-0写入内部RAM地址为7FH的单元里,CNT=1b.第二次ISP=ISP+1=80H,PC15-8存放在外部RAM地址为80H的单元里,CNT=2。这其中就涉及跨区域操作的问题。如何让指令在向内部RAM写完数据后,能无缝地通过PORT0把地址数据送到外部RAM中去,怎么控制地址增量的操作,怎么控制外部RAM的写信号?解决这一系列问题的关键是指令周期必须拉长。因为写外部RAM相当于做了一次MOVX操作,地址和数据的传送要跨越好几级器件包括PAD口,经过叠加的延迟其大小还是相当客观的。
总结a.操作时发出内部RAM写信号,COUNT=1,之后SPINC=1,ISP_INUSE=1,表示指令周期需拉长。为减少数据干扰,设置CALLS_WR_CTRL=1使得XRAM写信号保持高电平。b.操作时要写XRAM,XRAM写信号NXRAMW有效。
指令周期长度为4机器周期。
②RET/RETI片外RAM区SP跟踪(时序波形见附图5)(1)当前SP=81H(ESP),执行RET/RETI指令。
a.第一次从XRAM地址为81H的单元里取出内容赋值给PC15-8,ESP=ESP-1=80H,CNT=1。
b.第二次从XRAM地址为81H的单元里取出内容赋值给PC7-0,ESP=ESP-1=7FH,CNT=2,此时ISP=7FH。
a、b两次操作的SP指向的内容均来自外部RAM,故指令周期拉长至3个机器周期,XRAM的读信号两次有效。对堆栈指针两次减操作后,设置SPDEC=1指示该指令的周期维持拉长直到结束!判断(ESP==8’h7FH&&(ISP==8’h7FH)&&CNT=2’b10&&MEM_CON[9]是否成立!(2)当前SP=80H(ESP),执行RET/RETI指令。
a.第一次从XRAM地址为80H的单元里取出内容赋值给PC15-8,ESP=ESP-1=7FH,CNT=1。
b.第二次从内部RAM地址为7FH的单元里取出内容赋值给PC7-0,ISP=ISP-1=7EH,CNT=2,此时ESP=7FH。
a中SP指向的内容来自XRAM,而b中SP指向的内容来自内部RAM,指令周期还是拉长,但只有a操作时XRAM的读信号有效,b操作时要设置ISP_READY=RETS_RD_CTRL=1,使得NXRAMR信号保持高电平。
指令执行过程中判断(ESP==8’h7FH)&&(ISP==8’h7FH)&&CNT
‖(ISP==8’h7EH&&CNT[1])&&MEM_CON[9]是否成立!成立则XRAM写信号保持高电平。
注意CNT=2时只需判断ISP的值而无需判断ESP,因为这种可能性是唯一性的,只有RET/RETI指令从SP=80H处执行,才可能使得ISP==8’h7EH和CNT=2两项同时满足。
③PUSH dir当前SP=7FH(ESP),执行PUSH指令。ESP=ESP+1=80H,若dir是指向特殊功能寄存器SP的话,需特别注意。此中情况下必须在C1P3末尾锁住OPERAND_B的值,因为ESP的的变化要延时一个节拍才赋值个SP,也即C1P3时读取的SFR值是堆栈变化前的正确的值,而C1P4时堆栈的值已经等于80H,所以在C1P3末尾锁存SFR的值并通过OPERAND_B输入ALU处理,ALU的输出在接下去的三个节拍内写入XRAM。
片内RAM区SP跟踪波形见附图6片外RAM区SP跟踪时波形见附图7④POP dir片外RAM区SP跟踪(时序波形见附图8)当前SP=80H(ESP),执行POP指令。
ESP=ESP-1=7FH,CNT=1。SP的内容来自XRAM,所以XRAM读信号有效。从XRAM中读取的数据,要经过纯组合逻辑组成的ALU处理,然后在指令末尾赋值给dir所指定的SFR,或者dir指定的内部RAM中的单元,在Z8051中指令的最后两个节拍通过PO口预取下条指令,故CLP2末尾时锁存数据总线上的内容(XRAMDI)。指令执行过程中判断(ESP==8’h7FH)&&(ISP==8’h7FH)&&CNT
&&MEM_CON[11]是否成立!成立则置SPDEC,表示XRAM读信号有效三个节拍。
下表示出堆栈区域扩充发生时前后指令周期数对比

权利要求
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;如工作在片外RAM80-FFH,SP[7]=1,则ISP_INUSE=1;b.在每个机器周期的其他时刻,在没有打开堆栈跟踪或者外部堆栈指针始终指向栈底,表明进行跨栈操作的信号SPINC和SPDEC都无效时,ISP_INUSE=1,即表明此时进行的是片上压栈。
7.根据权利要求5所述的堆栈区域扩充方法,其特征在于设定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指令,要执行压栈操作。
8.根据权利要求5所述的堆栈区域扩充方法,其特征在于设定SPDEC信号的具体步骤为SPDEC涉及到的指令有RET/RETI/POP指令,SPDEC有效时,即其为1时表明堆栈指针SP要执行跨栈操作,即堆栈指针SP要由外部堆栈指针ESP转向内部堆栈指针ISP;标志寄存器SPDEC的有效状态为1的条件为以下三个条件有一个成立a.当前指令为RET/RETI,ESP=7FH,ISP=7FH,只执行了一次出栈操作,CNT=1;b.当前指令为RET/RETI,ESP=7FH,ISP=7FH,执行了两次出栈操作,CNT=2;c.当前指令为POP指令,ESP=7FH,ISP=7FH,执行了一次出栈操作,CNT=1。
9.根据权利要求5所述的堆栈区域扩充方法,其特征在于设定外部堆栈有关的控制信号XSRTOBE_CON和XMEMORY_CON信号的具体步骤为XSRTOBE_CON、XMEMORY_CON由ISP_INUSE的状态来控制,ISP_INUSE为有效状态则XSRTOBE_CON、XMEMORY_CON为无效状态0,反之则为有效状态1;a.如果是内部堆栈,则ISP_INUSE=1,XSRTOBE_CON、XMEMORY_CON译码信号无效;堆栈指针指向内部堆栈指针ISP;不对外部RAM进行读写操作和数据传输;b.如果是外部堆栈操作,则SPINC、SPDEC、ISP_INUSE都为无效状态;而XSRTOBE_CON、XMEMORY_CON为有效状态,进行对外部RAM的读写控制以及对外部RAM的寻址和数据传输控制;堆栈指针指向外部堆栈指针ESP;c.如果是跨栈操作a)SPINC由无效变为有效,则ISP_INUSE由有效变为无效,XSRTOBE_CON、XMEMORY_CON译码信号也由无效变为有效;进行对外部RAM的读写控制以及对外部RAM的寻址和数据传输控制;由执行内部堆栈操作变为执行外部堆栈操作;堆栈指针SP由内部堆栈指针转向外部堆栈指针ESP;b)SPDEC由无效变为有效,则ISP_INUSE XSRTOBE_CON、XMEMORY_CON译码信号仍为无效,堆栈操作由执行外部堆栈操作变为执行内部堆栈操作,不对外部RAM进行读写操作和数据传输,堆栈指针SP由外部堆栈指针ESP转向内部堆栈指针ISP。
全文摘要
本发明涉及一种堆栈区域扩充方法。本方法是基于8051体系,用外部RAM代替内部RAM作为堆栈的备用部分来延伸堆栈区域,当片上堆栈溢出时,自动切换到片外堆栈(使用片外RAM资源来延伸堆栈区域),实现堆栈容量的扩充和堆栈的跟踪。本堆栈区域扩充方法可应用于基于8051指令体系的单片微控制器,亦可应用于其它微控制器、微处理器等领域。
文档编号G06F9/30GK1609785SQ200410067539
公开日2005年4月27日 申请日期2004年10月27日 优先权日2004年10月27日
发明者胡越黎, 冉峰, 郭腊梅, 朱良辰 申请人:上海大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1