打印

怎么软复位?

[复制链接]
6352|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
457878|  楼主 | 2012-7-5 17:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前看到两种方法:
第一种:PCLATH = 0; PCL = 0;
第二种:asm{"ljmp 0x0000" };

问题:
1.这两种指令有什么不同?
2.这两种做法能正常复位吗?堆栈会不会异常?
沙发
sedatefire| | 2012-7-5 18:05 | 只看该作者
看门狗溢出就可以复位了
你在程序入口处,读取寄存器判断复位原因,接下来你懂的
堆栈的确会有些影响,这一块你要去研究启动程序,一般是汇编的
如51的startup.a51

使用特权

评论回复
板凳
sedatefire| | 2012-7-5 18:05 | 只看该作者
对于m3的启动程序
含有终端向量表的那个汇编代码

使用特权

评论回复
地板
nevermore008| | 2012-7-5 19:35 | 只看该作者
什么情况下需要软复位?

使用特权

评论回复
5
sedatefire| | 2012-7-5 20:11 | 只看该作者
什么情况下需要软复位?
nevermore008 发表于 2012-7-5 19:35

对呀,我也想知道

使用特权

评论回复
6
457878|  楼主 | 2012-7-5 22:18 | 只看该作者
本帖最后由 457878 于 2012-7-5 22:20 编辑

是bootloader, 我看hitech 示例代码中在不同的地方使用了这两种代码,搞不清有什么区别,我觉得是一样的。
我在想,如果执行复位操作的地方正好堆栈深度为0,也不失为一个简便的办法

使用特权

评论回复
7
yewuyi| | 2012-7-6 08:41 | 只看该作者
在PIC中PC指针一般是不让你操作的,所以第一条不成立。
在PIC中没见到有ljmp这种指令,所以第二条也不成立。
个人认为在PIC中想实现软复位,可以考虑如下两种方法:
1、goto xxx;
xxx为你的软件复位的入口地址
2、打开看门狗,然后goto $,让MCU产生看门狗定时溢出复位,在上电复位时判断复位原因,如果是掉电复位则执行初始化所有的变量等,如果看门狗溢出复位则不初始化变量等,但要注意,使用这个方法,IO口再看门狗溢出复位时会被强行还原到输入状态,如果有IO直接驱动显示等,可能会出现一次黑屏闪烁。

使用特权

评论回复
8
电子老鹰| | 2012-7-7 15:29 | 只看该作者
asm("RESET");不可以吗?

使用特权

评论回复
9
wangjiati| | 2012-7-7 16:51 | 只看该作者
PIC 16F 1XXXX 系列支持指令软件复位. 在这之前的 PIC16F8XX 只有35条指令这样是不支持直接指令复位的.  通过看门狗来复位是不错选择.

使用特权

评论回复
10
XIEYUANBIN| | 2012-7-8 14:43 | 只看该作者
本帖最后由 XIEYUANBIN 于 2012-7-8 14:45 编辑

7楼关于第一条复位的描述,在汇编中是允许操作的。
楼主的主贴中,两种复位都可以操作,但第二种的指令助记符不是PIC系列的。
楼主两种操作方法效果都一样,但都会引起堆栈溢出,在PIC单片机中,硬件堆栈有深度限制,堆栈溢出同样也会导致复位,不过这种复位不可靠。
所以软件复位,一般都是通过WDT复位来操作。
目前有一些增强型的比如16F1xxxx系列的,以及16位、32位机也支持RESET指令复位。

使用特权

评论回复
11
cheungman| | 2012-7-8 23:37 | 只看该作者
(*((void(*)(void))0))();

使用特权

评论回复
12
457878|  楼主 | 2012-7-10 10:09 | 只看该作者
asm("ljmp 0"); 编译没有出错,估计被编译器(PICC16)自动识别了
最后那个,太复杂了,行为未知....看来大家都支持WDT复位,就用它了。

使用特权

评论回复
13
457878|  楼主 | 2012-7-10 10:20 | 只看该作者
:victory:

使用特权

评论回复
14
gonggu8181| | 2012-10-27 20:49 | 只看该作者
asm("ljmp 0")果然还好使,有了复位命令,心情就是不一样!

使用特权

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

本版积分规则

270

主题

885

帖子

3

粉丝