![]() |
|
||||||||||||||
| | 网站首页 | 关于我们 | 单片机培训 | 产品展示 | 产品开发 | 单片机解密 | 技术文章 | 下载中心 | 留言薄 | 技术论坛 | 联系我们 | | ||
|
||
|
|||||
| HT MCU 软件堆栈的应用 | |||||
| HT MCU 软件堆栈的应用 | |||||
作者:佚名 文章来源:本站原创 点击数: 更新时间:2007-10-16 ![]() |
|||||
|
HT MCU 软件堆栈的应用 文件编码:HA0001s 介绍: 对于Holtek 八位元单片机来说,堆栈资源往往是有限的。例如,HT48R10A-1 就只有两级堆栈。 本文将介绍如何利用软件堆栈来解决这一问题。软件堆栈是用通用数据寄存器来保存返回地址的, 现在,它已经可以应用于HT48R10A-1、 HT48R30A-1、 HT48R50A-1、 HT48R70A-1 这几款单片 机,而且,软件堆栈也将很容易应用于其他单片机。 用法: 为了使用软件堆栈,需要有1 个头文件和1 个库文件: 1. SSTACK.INC (附录一) 2. 由附录二生成的库文件Sstack.lib。 步骤: 在HT-IDE 集成环境下 1. 新建一个project 并将Sstack.asm 文件加到该project 中; 2. Build 后将选择菜单tools/library manager 在弹出的对话框中选择open,选择路径是: x:\ide_2000\lib\,打入文件名:Sstack.lib 后确定,弹出的对话框问是否要新建该文件?选择 确定。然后在对话框中选中新建project 目录下的Sstack.obj 文件点击ADD,然后点击quit.(由 Sstack..asm 生成了Sstack..lib 文件. 3. 如果要进行的项目是用以上提到的48 系列的单片机而且需要用到软件堆栈的话,按以下方 法: *.在OPTION/PROJECT/LIBRARY 下输入Sstack.lib. *.在软件中定义所选择的单片机是_HT48R10A_1、_HT48R30A_1、_HT48R50A_1、 _HT48R70A_1,例如: _HT48R30A_1 EQU 1 *.通过定义_SS_DEBUG EQU 1 设定调试使能 *.通过_CALL_DEPTH 定义堆栈级数。(默认级数为5)例如: _CALL_DEPTH EQU 6 *.如果有超过一个的存储器指针(MP),则定义_SS_USE_MP1 来使用MP1 作为堆栈指针; 否则默认使用MP0。(对于HT48RX0A-1 系列单片机,只有MP0) *.在头文件中宣告include SSTACK.INC。 *.在使用MCALL 或MRET 之前,要先用INIT_SSTACK 指令声明。 *.用MCALL PROC_NAME 和MRET 来模拟CALL 和RET 指令。 *.测试堆栈是否溢出 a. 定义_SS_DEBUG b. 将SS_OVERFLOW 语句写到程序中某个位置 如果发生堆栈溢出,用户程序会在SS_OVERFLOW 处停止运行。 HT MCU 软件堆栈的应用 例程: 本例使用HT48R10A-1,测试三级软件堆栈。如果有超过三级的MCALL 嵌套,程序就会停在 SS_OVERFLOW 处。 ;------------------------------------------------------- ;程序名: Test.asm ;目的: 测试软件堆栈 ;-------------------------------------------------------- _HT48R10A_1 EQU 1 ;定义使用HT48R10A-1 单片机 _SS_DEBUG EQU 1 ;设定调试使能 _CALL_DEPTH EQU 3 ;设定堆栈为3 级 include SSTACK.INC main .section at 0 ‘code’ INIT_SSTACK ;初始化软件堆栈 again: MCALL mfunc ;调用mfunc 子程序 Jmp again ;循环 SS_OVERFLOW ;如果堆栈溢出,程序停止 mfunc PROC ;mfunc2 子程序 MCALL mfunc2 ;调用MFUNC2 子程序 MRET ; mfunc 子程序返回 mfunc ENDP ; mfunc 子程序结束 mfunc2 PROC MCALL mfunc3 ;调用MFUNC3 子程序 MRET ; mfunc2 子程序返回 mfunc2 ENDP ; mfunc2 子程序结束 mfunc3 PROC ; mfunc3 子程序 MRET ; mfunc3 子程序返回 mfunc3 ENDP ; mfunc3 子程序结束 ;-------------------------------- ;测试程序结束 ;--------------------------------- 所用资源: 软件堆栈实际使用的系统资源根据所选用的单片机ROM 页数和堆栈级数而略有区别,入下表: 资源 规格 数据寄存器 数据存储器指针(MP)、累加器 (ACC) 数据存储器 2×堆栈级数+1 INIT_STACK 2 个字节 程 序MRET 1 个字节 HT MCU 软件堆栈的应用 MCALL 7 个字节(_SS_DEBUG 没有定义) 每页 2 个字节 存 储 器 其他 (6+页数)个字节 使用: 本文提供两个文件,SSTACK.INC(见附录一)和 SSTACK.ASM(见附录二)。SSTACK.ASM 是用来建立库文件的( SS48R10A_1.LIB 、SS48R30A_1.LIB 、SS48R50A_1.LIB 、 SS48R70A_1.LIB)。 附录一:SSTACK.INC ;------------------------------------------------------ ;------------------ 软件堆栈--------------------- ;------------------------------------------------------ ;文件名: SSTACK.INC ;介绍: ; 软件堆栈用数据存储器(RAM)来模拟CALL 和RET 指令。使用过模拟的CALL 指 ; 令后 (MCALL),堆栈在数据存储器中从高到低排列。另外,需要使用一个数据存储器; ; 指针(MP)作为堆栈指针(SP)。 ; 用法: ; 1. 定义下列单片机中的一种 ; _HT48R10A_1, _HT48R30A_1, _HT48R50A_1, _HT48R70A_1 ; 2. 定义_CALL_DEPTH 来确定堆栈级数(默认为5 级) ; 例如:_CALL_DEPTH EQU 10H ; 3. 默认使用MP0 作为堆栈指针 ; 可以写入_SS_USE_MP1 语句来使用MP1 作为堆栈指针 ; 4. 在使用软件堆栈之前写入INIT_STACK 语句 ; 5. 用MCALL proc_name 和MRET 来模拟CALL 和RET 指令 ; 6. 检测堆栈是否溢出 ; a. 定义SS_DEBUG ; 例如:_SS_DEBUG EQU 1 ; b. SS_OVERFLOW ; 堆栈溢出时,程序会停在SS_OVERFLOW 处 ; -------------------------------------------------------- ; -------------------------------------------------------- IFNDEF _INCLUDE_SSTACK_INC #define _INCLUDE_SSTACK_INC IFDEF _HT48R10A_1 _ABOVE_HT48R10A_1 EQU 1 _SS_BOTTOM EQU 07fh _SS_7bitMP EQU 1 ELSE HT MCU 软件堆栈的应用 IFDEF _HT48R30A_1 _ABOVE_HT48R10A_1 EQU 1 _ABOVE_HT48R30A_1 EQU 1 _SS_BOTTOM EQU 07fh _SS_7bitMP EQU 1 ELSE IFDEF _HT48R50A_1 _ABOVE_HT48R10A_1 EQU 1 _ABOVE_HT48R30A_1 EQU 1 _ABOVE_HT48R50A_1 EQU 1 _SS_BOTTOM EQU 0ffh ELSE IFDEF _HT48R70A_1 _ABOVE_HT48R10A_1 EQU 1 _ABOVE_HT48R30A_1 EQU 1 _ABOVE_HT48R50A_1 EQU 1 _ABOVE_HT48R70A_1 EQU 1 _SS_BOTTOM EQU 0ffh ELSE MESSAGE ‘Software Stack: Not a valid chip’ QUIT_SSTACK EQU 1 ENDIF ENDIF ENDIF ENDIF IFNDEF QUIT_SSTACK IFNDEF _SS_DEBUG _SS_DEBUG EQU 0 ENDIF IFNDEF _CALL_DEPTH _CALL_DEPTH EQU 5 ENDIF IFNDEF _SS_USE_MP1 _SP EQU [01h] _IAR EQU [00h] ELSE _SP EQU [03h] _IAR EQU [02h] ENDIF HT MCU 软件堆栈的应用 _SS_TOP EQU _SS_BOTTOM-2*_CALL_DEPTH _PCL EQU [06h] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;INIT_STACK ; INIT_SSTACK macro MOV A,_ss_bottom-1 MOV _SP,A endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;SS_OVERFLOW ; SS_OVERFLOW macro _SS_OVR_STOP: JMP $ endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;SS_PUSH ; SS_PUSH macro value MOV A, value MOV _IAR, A DEC _SP endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;SS_POP ; SS_POP macro INC _SP MOV A, _IAR endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;MCALL ; MCALL macro labe1 Local _RETURN_ADDR IF _SS_DEBUG MOV A,_SS_TOP-1 HT MCU 软件堆栈的应用 IFDEF _SS_7bitMP SET [05h].7 ENDIF XOR A, _SP SZ [0ah].2 JMP _SS_OVR_STOP ENDIF SS_PUSH HIGH _RETURN_ADDR SS_PUSH LOW _RETURN_ADDR JMP labe1 _RETURN_ADDR: endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;MRET ; IFNDEF SSTACK_ASM EXTERN _SS_PAGEJMP: NEAR ENDIF MRET macro JMP _SS_PAGEJMP endm ENDIF ; ENDIF ; ;---------------------------------------------------------- ;end of SSTACK.INC ;---------------------------------------------------------- 附录二:SSTACK.ASM ;--------------------------------------------------------- ;文件名:SSTACK.ASM ;用途:建立软件堆栈的库文件 ;步骤: ; 1. 选择以下单片机中的一种 ; _HT48R10A_1 EQU 1 ; _HT48R30A_1 EQU 1 ; _HT48R50A_1 EQU 1 ; _HT48R70A_1 EQU 1 ; 2. 在HT-IDE 下进行汇编 HT MCU 软件堆栈的应用 ; 3. 通过库文件管理生成SS48RX0A_1.LIB,并将产生的目标文件(.OBJ)加入 ; 进去。 ;----------------------------------------------------------- #define SSTACK_ASM INCLUDE SSTACK.INC PUBLIC _SS_PAGEJMP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;INTER-PAGE JUMP _PAGEJMPSEC .SECTION ‘CODE’ _SS_PAGEJMP: SS_POP MOV [_SS_BOTTOM], A SS_POP ADDM A, _PCL JMP _SS_PAGE0 JMP _SS_PAGE1 IFDEF _ABOVE_HT48R10A_1 JMP _SS_PAGE2 JMP _SS_PAGE3 IFDEF _ABOVE_HT48R30A_1 JMP _SS_PAGE4 JMP _SS_PAGE5 JMP _SS_PAGE6 JMP _SS_PAGE7 IFDEF _ABOVE_HT48R50A_1 JMP _SS_PAGE8 JMP _SS_PAGE9 JMP _SS_PAGE10 JMP _SS_PAGE11 JMP _SS_PAGE12 JMP _SS_PAGE13 JMP _SS_PAGE14 JMP _SS_PAGE15 IFDEF _ABOVE_HT48R70A_1 JMP _SS_PAGE16 JMP _SS_PAGE17 JMP _SS_PAGE18 JMP _SS_PAGE19 JMP _SS_PAGE20 JMP _SS_PAGE21 HT MCU 软件堆栈的应用 JMP _SS_PAGE22 JMP _SS_PAGE23 JMP _SS_PAGE24 JMP _SS_PAGE25 JMP _SS_PAGE26 JMP _SS_PAGE27 JMP _SS_PAGE28 JMP _SS_PAGE29 JMP _SS_PAGE30 JMP _SS_PAGE31 ENDIF ENDIF ENDIF ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;INTRA-PAGE JUMP ; P0_ .SECTION AT 00FDH ‘CODE’ _SS_PAGE0: MOV A, [_SS_BOTTOM] MOV _PCL, A P1_ .SECTION AT 01FDH ‘CODE’ _SS_PAGE1: MOV A,[_SS_BOTTOM] MOV _PCL, A IFDEF _ABOVE_HT48R10A_1 P2_ .SECTION AT 02FDH ‘CODE’ _SS_PAGE2: MOV A,[_SS_BOTTOM] MOV _PCL,A P3_ .SECTION AT 03FDH ‘CODE’ _SS_PAGE3: MOV A,[_SS_BOTTOM] MOV _PCL,A IFDEF _ABOVE_HT48R30A_1 P4_ .SECTION AT 04FDH ‘CODE’ _SS_PAGE4: MOV A,[_SS_BOTTOM] MOV _PCL,A P5_ .SECTION AT 05FDH ‘CODE’ HT MCU 软件堆栈的应用 _SS_PAGE5: MOV A,[_SS_BOTTOM] MOV _PCL,A P6_ .SECTION AT 06FDH ‘CODE’ _SS_PAGE6: MOV A,[_SS_BOTTOM] MOV _PCL,A P7_ .SECTION AT 07FDH ‘CODE’ _SS_PAGE7: MOV A,[_SS_BOTTOM] MOV _PCL,A IFDEF _ABOVE_HT48R50A_1 P8_ .SECTION AT 08FDH ‘CODE’ _SS_PAGE8: MOV A,[_SS_BOTTOM] MOV _PCL,A P9_ .SECTION AT 09FDH ‘CODE’ _SS_PAGE9: MOV A,[_SS_BOTTOM] MOV _PCL,A P10 .SECTION AT 0AFDH ‘CODE’ _SS_PAGE10: MOV A,[_SS_BOTTOM] MOV _PCL,A P11 .SECTION AT OBFDH ‘CODE’ _SS_PAGE11: MOV A,[_SS_BOTTOM] MOV _PCL,A P12 .SECTION AT 0CFDH ‘CODE’ _SS_PAGE12: MOV A,[_SS_BOTTOM] MOV _PCL,A P13_.SECTION AT 0DFDH ‘CODE’ _SS_PAGE13: MOV A,[_SS_BOTTOM] MOV _PCL,A P14_.SECTION AT 0EFDH‘CODE’ _SS_PAGE14: MOV A,[_SS_BOTTOM] MOV _PCL,A P15 .SECTION AT 0FFDH ‘CODE’ _SS_PAGE15: HT MCU 软件堆栈的应用 MOV A,[_SS_BOTTOM] MOV _PCL,A IFDEF _ABOVE_HT48R70A_1 P16 .SECTION AT 10FDH ‘CODE’ _SS_PAGE16: MOV A,[_SS_BOTTOM] MOV _PCL,A P17 .SECTION AT 11FDH ‘CODE’ _SS_PAGE17: MOV A,[_SS_BOTTOM] MOV _PCL,A P18 .SECTION AT 12FDH ‘CODE’ _SS_PAGE18: MOV A,[_SS_BOTTOM] MOV _PCL,A P19 .SECTION AT 13FDH ‘CODE’ _SS_PAGE19: MOV A,[_SS_BOTTOM] MOV _PCL,A P20 .SECTION AT 14FDH ‘CODE’ _SS_PAGE20: MOV A,[_SS_BOTTOM] MOV _PCL,A P21 .SECTION AT 15FDH ‘CODE’ _SS_PAGE21: MOV A,[_SS_BOTTOM] MOV _PCL,A P22 .SECTION AT 16FDH ‘CODE’ _SS_PAGE22: MOV A,[_SS_BOTTOM] MOV _PCL,A P23 .SECTION AT 17FDH ‘CODE’ _SS_PAGE23: MOV A,[_SS_BOTTOM] MOV _PCL,A P24 .SECTION AT 18FDH ‘CODE’ _SS_PAGE24: MOV A,[_SS_BOTTOM] MOV _PCL,A P25 .SECTION AT 19FDH ‘CODE’ _SS_PAGE25: MOV A,[_SS_BOTTOM] HT MCU 软件堆栈的应用 MOV _PCL,A P26 .SECTION AT 1AFDH ‘CODE’ _SS_PAGE26: MOV A,[_SS_BOTTOM] MOV _PCL,A P27 .SECTION AT 1BFDH ‘CODE’ _SS_PAGE27: MOV A,[_SS_BOTTOM] MOV _PCL,A P28 .SECTION AT 1CFDH ‘CODE’ _SS_PAGE28: MOV A,[_SS_BOTTOM] MOV _PCL,A P29 .SECTION AT 1DFDH ‘CODE’ _SS_PAGE29: MOV A,[_SS_BOTTOM] MOV _PCL,A P30 .SECTION AT 1EFDH ‘CODE’ _SS_PAGE30: MOV A,[_SS_BOTTOM] MOV _PCL,A P31 .SECTION AT 1FFDH ‘CODE’ _SS_PAGE31: MOV A,[_SS_BOTTOM] MOV _PCL,A ENDIF ENDIF ENDIF ENDIF ;------------------------------------------------------------ ;end of SSTACK.ASM ;------------------------------------------------------------ 2001/8/28:校对人:陈祯 修改: 1. 将“SS48C10.LIB、 SS48C30.LIB、 SS48C50.LIB、 SS48C70.LIB”改成:“由附录二生成的库文件 Sstack.lib。” 2. 将: 1. “将SS48C10.LIB 、SS48C30.LIB、 SS48C50.LIB、 SS48C70.LIB 四个库文件拷贝到HT-IDE\LIB 子目录 HT MCU 软件堆栈的应用 下。 2. 根据所选用的单片机,在OPTION/PROJECT/LIBRARY 下输入SS48C10、 SS48C30、 SS48C50 或 SS48C70。 3. 定义所选用的单片机 _HT48C10、_HT48C30、_HT48C50、_HT48C70 4. 通过_CALL_DEPTH 定义堆栈级数。(默认级数为5) 5. 如果有超过一个的存储器指针(MP),则定义_SS_USE_MP1 来使用MP1 作为堆栈指针;否则默认使用 MP0。(对于HT48CX0 系列单片机,只有MP0) 6. 在头文件中宣告include SSTACK.INC。 7. 在使用MCALL 或MRET 之前,要先用INIT_SSTACK 指令声明。 8. 用MCALL PROC_NAME 和MRET 来模拟CALL 和RET 指令。 9. 测试堆栈是否溢出 a. 定义_SS_DEBUG b. 将SS_OVERFLOW 语句写到程序中某个位置 如果发生堆栈溢出,用户程序会在SS_OVERFLOW 处停止运行。 改成: “在HT-IDE 集成环境下 1. 新建一个project 并将Sstack.asm 文件加到该project 中; 2. Build 后将选择菜单tools/library manager 在弹出的对话框中选择open,选择路径是:x:\ide_2000\lib\,打入文 件名:Sstack.lib 后确定,弹出的对话框问是否要新建该文件?选择确定。然后在对话框中选中新建project 目录下的Sstack.obj 文件点击ADD,然后点击quit.(由Sstack..asm 生成了Sstack..lib 文件. 3. 如果要进行的项目是用以上提到的48 系列的单片机而且需要用到软件堆栈的话,按以下方法: *.在OPTION/PROJECT/LIBRARY 下输入Sstack.lib. *.在软件中定义所选择的单片机是_HT48C10、_HT48C30、_HT48C50、_HT48C70,例如: _HT48C30 EQU 1 *.通过定义_SS_DEBUG EQU 1 设定调试使能 *.通过_CALL_DEPTH 定义堆栈级数。(默认级数为5)例如: _CALL_DEPTH EQU 6 *.如果有超过一个的存储器指针(MP),则定义_SS_USE_MP1 来使用MP1 作为堆栈指针;否则默认使用 MP0。(对于HT48CX0 系列单片机,只有MP0) *.在头文件中宣告include SSTACK.INC。 *.在使用MCALL 或MRET 之前,要先用INIT_SSTACK 指令声明。 *.用MCALL PROC_NAME 和MRET 来模拟CALL 和RET 指令。 *.测试堆栈是否溢出 a. 定义_SS_DEBUG b. 将SS_OVERFLOW 语句写到程序中某个位置 如果发生堆栈溢出,用户程序会在SS_OVERFLOW 处停止运行。 |
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| HT48 & HT46 交通信号灯的实 HT48 & HT46 MCU I / O 口的 HT MCU查表指令的使用 HT48 & HT46 MCU 用软件执行 HT48 & HT46 MCU 与HT93LC46 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | | |||
|