老古开发网首页
导航:老古开发网首页文章索引文章分类新闻热点→[经验谈:68HC908单片机汇编程序中变量的使用]
| -文章搜索 - 最新文章 - |

经验谈:68HC908单片机汇编程序中变量的使用

发布时间:2006年2月25日 点击次数:756
来源:单片机与嵌入式系统应用   作者:北京2651信箱 罗昊
 
经验谈:68HC908单片机汇编程序中变量的使用 单片机的RAM资源一般有两个用途,一是保存变量,另外就是作为系统堆栈使用。编程时变量的使用是一个应当注意的问题。 我们使用的变量一般可以分为两类:全局变量、局部变量。全局变量对所有的子程序都是可见的,在程序运行的任何时刻都可以访问得到;局部变量只对当前的子程序有效,其它程序不会访问。全局变量可用于在子程序之间传递信息,也可以用于保存系统运行中要用到的必要信息。可以像下面一样定义一个单字节全局变量。 org (ram开始地址) variablermb 1 下面是一个使用全局变量传递标志的例子。程序中flag为已定义的全局变量。在sub1中,程序检测flag中的flag1位,如果为高则等待,否则运行下一条指令。sub2为一中断服务程序,在满足一定的条件下,清除flag的flag1位,使得sub1可以响应,并运行其下面的指令。 sub1: ... brset flag1,flag,* ;检测flag中的flag1位,如果为高 ;则等待  sub2 ... bclr flag1,flag ;清除flag中的flag1位 下面有个关于局部变量的例子,sub1中使用var1作为循环计数器,sub2中也使用了var1。如果sub1在运行过程中被sub2中断,sub2将var1的值改变,中断返回以后sub1将产生不可预料的结果,严重时可能会使sub1陷入死循环中。在这种情况下,sub1不能使用全局变量var1作循环计数器。 sub1: mov #10,var1 ;do something dec var1 beq quit ;结果为0则跳出循环 bra dosth ;否则循环继续 sub2: ;do something mov #10,var1 ;改变var1的值会影响sub1正常运行  要解决这个问题就需要使用局部变量。有两种办法:一是使用68HC908的内部寄存器,如累加器或索引寄存器。当子程序被中断时,所有的寄存器(H寄存器除外)都会被压入堆栈保存,中断返回时寄存器被恢复为中断前的值。若使用x寄存器,上述程序可更改如下: sub1: ldx #10 ;do something decx beq quit ;结果为0则跳出循环 bra dosth ;否则循环继续 sub2: ;do something ldx #10 ;改变x的值不影响sub1  这种方法的优点是直观,缺点是如果在子程序中内部寄存器还要作其它用途,那么在作其它用途之前需要保存寄存器的值(如将寄存器压栈),或是程序中需要使用多个循环计数,这时候内部寄存器就不够用了。 另一种方法是使用系统堆栈。我们知道进行一次压栈操作将使堆栈指针sp减1。如果人为地将sp减1,就可以从系统堆栈中获得一个字节的空间,使用这种办法将sub1改写如下: sub1: ais #-1;sp-1得到一个字节的空间,地址为sp+1 ;do something dec 1,sp ;对地址sp+1中的数据进行操作 beq quit ;结果为0则跳出循环 bra dosth ;否则循环继续 ... ais #1 ;恢复sp !!!切记 如果sub1在运行过程中被中断,中断响应过程中有一系列的压栈操作,每次压栈都在原来的基础之上将sp-1;而我们在sub1中定义的局部变量的内容却不会被改变,而且其它程序中的任何合法操作都不会改变sub1中局部变量的值。当中断返回时,sp又被恢复成sub1中原来的数值,这样又可以正常使用这个局部变量了。如果需要n个局部变量,只要将sp减n即可。使用堆栈作局部变量,在子程序返回之前一定要恢复sp原来的值,否则程序返回不到正确的地址。 总之,如果需要在子程序之间传递信息,可以使用全局变量,而只要是仅在子程序中有效的变量、标志都应该考虑使用局部变量。 (北京2651信箱罗昊)

欢迎进入老古论坛进行讨论
[新闻热点] 相关文章:
OLED前景渺茫 柯达三洋关闭显示器工厂
简介:
据外电报道,美国柯达公司和日本三洋公司日前已经决定,关闭双方在日本合资建立的有机发光二极管(OLED )显示器制造工厂。 两公司表示,从 1999 年开始,三洋公司与柯达公司制定了共同研究与开发有机发光二极管显示器的计划, 2001 年在日本建立了合资企业 “SK 显示器公司”,在双方合资企业中, 柯达公司拥有34%的股份,三洋公司拥有66%的股份。 从2003年起,合资企业开始大量制造有机发光二极管显示器。 有机发光二极管显示器的像素特征是,它采用了一种有机发光材料作为自己的......

东芝对华投资全面转型 IT及芯片是重点
IBM为Cell芯片找到新用途:刀片服务器
05年全球芯片销量增6.8% 达2275亿美元
LG飞利浦启动重组计划 中国工厂不受影响
AMD全面下调主要芯片价格最高降幅达32.6%
中国嵌入式市场群雄争霸,IC厂商与IP厂商上演终级PK
接入领域融合进行时:要求灵活的网络处理器
英特尔点燃数字家庭熊熊大火,家电市场重新洗牌
摩托罗拉推出蓝牙夹克,无线连接手机与控制面板
 
下一个:[模拟电路]ΣΔ型ADC在40MHz频率和14位分辨率时的功耗低于100mW
简介:
“提供功耗最低的ΔΣ型模拟/数字转 换器”是无晶圆厂半导体供应商Xignal Technologies公司向客户做出的承诺。该公司的产品原理基于一种被其称为“连续时间累加-增量(ΣΔ)” 的架构。Xignal公司市场主管Mark Holdaway说,目前,他们已经能够推出功耗尚不及流水线型ADC一半且分辨率达12位(及更高)的ΣΔ型ADC。ΣΔ型ADC是一个控制环路,其中的比较器负责对积分器的输出进行采样,以产生一个脉冲密度输出波形。该环路中包含一个滤波器,在传统的ΣΔ型设计中,该滤波器是一个基于开关电容器技术的离散时间装置......
 

上一个:[网络文摘]嵌入式RTOS讲座(1)

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:10分钟 执行时间:0毫秒