打印

keil搞得我很郁闷啊

[复制链接]
2122|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
5
ejack| | 2009-12-11 17:35 | 只看该作者
软件狗想从中断中伪复位,面临的问题很多。
除了Regbank,中断标志你怎么处理?已经开启的其它中断怎么处理?程序在活着跑到你自己的Init()函数之前还有太多不确定性。大把的寄存器需要复位。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
因特网用户 + 1
6
不亦心| | 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
7
因特网用户|  楼主 | 2009-12-11 18:23 | 只看该作者
5L  软件狗起作用是因为主程序已经死掉啦
我在用RETI清中断请求标志之前复位其他的寄存器不可以吗

xwj说得没错
调了大半个下午,硬是没发现是从08直接变到00的,眼睛花了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

161

主题

1040

帖子

0

粉丝