keil搞得我很郁闷啊

[复制链接]
2963|6
 楼主| 因特网用户 发表于 2009-12-11 15:52 | 显示全部楼层 |阅读模式
用定时器搞了一个软件狗
中断直接跳到复位地址,中断用的是using 1
startup.A51代码执行不正常,死循环了
就这段
IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
不过发现第1组的寄存器R0是一直在减的,怎么跳转就是不行呢
我给优化级别改为0,也不行
中断使用using 0才可以
大家说说看是啥问题
acmilann 发表于 2009-12-11 16:10 | 显示全部楼层
因为 你吧堆栈都清了,所以乱了

评分

参与人数 1威望 +1 收起 理由
因特网用户 + 1

查看全部评分

xwj 发表于 2009-12-11 17:04 | 显示全部楼层
第1组的寄存器R0的地址是8,每次到R0为8时就被你改成0了,然后再减一等于0xff(255),又重新从FFH处开始清零
所以永远都不可能实现R0减一后等于0,当然就是死循环了。

评分

参与人数 1威望 +1 收起 理由
因特网用户 + 1

查看全部评分

xwj 发表于 2009-12-11 17:04 | 显示全部楼层
这不是Keil的问题,而是你自己没理解代码的行为。

评分

参与人数 1威望 +1 收起 理由
因特网用户 + 1

查看全部评分

ejack 发表于 2009-12-11 17:35 | 显示全部楼层
软件狗想从中断中伪复位,面临的问题很多。
除了Regbank,中断标志你怎么处理?已经开启的其它中断怎么处理?程序在活着跑到你自己的Init()函数之前还有太多不确定性。大把的寄存器需要复位。

评分

参与人数 1威望 +1 收起 理由
因特网用户 + 1

查看全部评分

不亦心 发表于 2009-12-11 17:55 | 显示全部楼层
第1组的寄存器R0的地址是8,每次到R0为8时就被你改成0了,然后再减一等于0xff(255),又重新从FFH处开始清零
所以永远都不可能实现R0减一后等于0,当然就是死循环了。 ...
xwj 发表于 2009-12-11 17:04

正解,:)

评分

参与人数 1威望 +1 收起 理由
因特网用户 + 1

查看全部评分

 楼主| 因特网用户 发表于 2009-12-11 18:23 | 显示全部楼层
5L  软件狗起作用是因为主程序已经死掉啦
我在用RETI清中断请求标志之前复位其他的寄存器不可以吗

xwj说得没错
调了大半个下午,硬是没发现是从08直接变到00的,眼睛花了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

161

主题

1040

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部