Board logo

标题: 请问C语言的软件复位方法 [打印本页]

作者: fsm_hdl    时间: 2006-6-2 11:33     标题: 请问C语言的软件复位方法

各位,目前刚使用codewarrior的c compiler,之前汇编实现软件复位很简单一个jmp就可以了。但是目前用c后,如何复位比较恰当呢?


作者: seuafu2005    时间: 2006-6-2 11:57

可以在C中内嵌汇编实现
作者: guantingwei    时间: 2006-6-2 12:37

将地址转为函数指针
然后执行
作者: nishui_2000    时间: 2006-6-16 15:57

S12的指令有软件复位的么?能不能介绍一下用法?
我现在用的是采用死循环,然后强制看门狗复位的办法实现的软复位
作者: zhwdy81    时间: 2006-6-30 15:25

goto不可以么?
实在不行 用asm
作者: strongchen    时间: 2006-6-30 16:18

当清WATCHDOG是,必须写$55和$AA到ARMCOP寄存器。如果写其他的数,芯片马上就会复位。这也就可以用作软件复位了。
作者: tannyhbkj    时间: 2006-7-1 23:33

用过HC08的MCU,软件复位有几种1)汇编复位指令SWI。2)执行错误代码  。3)跳入错误地址  4)看门狗。
作者: 碧落星空    时间: 2006-7-3 09:38

楼上说的汇编复位指令swi能不能具体介绍下,不太了解这个
作者: seuafu2005    时间: 2006-7-3 10:26

执行swi语句,就是一个软件中断,你可以在软件中断向量中写入和reset向量中一样的地址,那么就类似于复位,程序重新开始执行
作者: nishui_2000    时间: 2007-3-8 16:36

seuafu2005:你说的采用SWI的方法,在“软件中断向量中写入和reset向量中一样的地址”,具体应该怎么写?能不能明确解释一下?谢谢
作者: strongchen    时间: 2007-3-8 17:24

SWI只是软件中断,并不能产生真正的复位,不会使MCU初始化。
作者: nishui_2000    时间: 2007-3-8 18:03

那对S12单片机来说,除了看门狗外还有什么办法可以实现软件复位?
作者: xingzou    时间: 2007-3-8 22:46

既然当初楼主使用的是jmp进行跳转复位的,那现在一样也可以用C嵌套汇编的方式来实现相同的功能,这样就不会增加任何额外的功能需求。


作者: strongchen    时间: 2007-3-9 09:20

软件复位恐怕没有什么更好的办法了。另外也可以用软件控制硬件,如RESET脚的方法产生复位。
作者: nishui_2000    时间: 2007-3-9 17:19

我找到很好的软件复位办法了,而且调试通过,这个办法对于S12,S08都适用。
采用看门狗的方法:
interrupt 2 void COP(void){
PORTB = 0x01;
asm jmp _Startup;
}
//=============================================================================
#pragma CODE_SEG DEFAULT
//======================== Force to Reset =====================================
void ForceReset(void){
COPCTL = 0x07; // Turn on watchdog
ARMCOP = 0x00; // Write Incorrect value => Force Reset
}
我实验过了没问题的,很好用。
作者: tao0599    时间: 2007-3-12 13:10

不知道是哪位大侠指点的,使用非法指令复位,有些芯片有支持,你可以试一试
#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */


void MCU_init(void); /* Device initialization function declaration */


volatile const char IllegaInstrct = 0x8D;

void main(void) {

/* Uncomment this function call after using Device Initialization
to use the generated code */
/* MCU_init(); */

EnableInterrupts; /* enable interrupts */

/* include your code here */



for(;;) {
__RESET_WATCHDOG(); /* feeds the dog */

asm
{
LDHX IllegaInstrct
JMP ,X
}


} /* loop forever */
/* please make sure that you never leave this function */
}
作者: strongchen    时间: 2007-3-13 09:23

这只适用于8位的HC08和S08。HC12和S12并没有非法指令复位。
作者: xingzou    时间: 2007-3-13 13:58

楼主所说的方法不就是斑竹的答复吗?呵呵。
当清WATCHDOG是,必须写$55和$AA到ARMCOP寄存器。如果写其他的数,芯片马上就会复位。这也就可以用作软件复位了。
作者: nishui_2000    时间: 2007-3-13 19:02

“当清WATCHDOG是,必须写$55和$AA到ARMCOP寄存器。如果写其他的数,芯片马上就会复位。这也就可以用作软件复位了。”
事实不是这么简单,你必须在看门狗中断中加入跳转到Start处的指令:asm jmp _Startup;
作者: strongchen    时间: 2007-3-14 09:19

对,这是一个要注意的问题。S12的WATCHDOG会产生复位,但它的中断矢量与上电复位和外部复位的中断矢量是不一样的。另外也要注意,WATCHDOG产生的复位与上电复位对某些特殊寄存器的影响可能也有所不同。
作者: lishengqiang    时间: 2010-5-25 20:55

20# strongchen
能不能问一下。我也是要用开门够强制从起,可是楼上的那个asm jmp _Startup一直提示有错误,怎样才能让程序从起,具体点行吗?我是个初学者,谢谢了
作者: lishengqiang    时间: 2010-5-25 21:01

15# nishui_2000
能不能问一下。我也是要用开门够强制从起,可是楼上的那个asm jmp _Startup一直提示有错误,怎样才能让程序从起,具体点行吗?我是个初学者,谢谢了
作者: strongchen    时间: 2010-5-26 09:54

可以这样试试:

#pragma CODE_SEG NON_BANKED   //  下面代码放在NON_BANKED区
void interrupt 2  COP_RST(void)
{
    asm jmp _Startup;
}
作者: lishengqiang    时间: 2010-5-26 15:23

23# strongchen
我具体点说吧,我运行程序提示的错误是这样的:
Error: C12020: UNknown Operand Combination: Instr:JMP/Oprl:Rel18/Opr2:NoOP.
意思应该是无法识别JMP这个指令对吧。
如果改为LJMP,这个错误倒是没有,不过会提示其他的错误。我还有就是想问一下。这里的写的interrupt 2这个中断,是不是指的就是开门狗中断,对ARMCOP付除AA和55的其它指他马上就跳到这个中断对吧。
如果用asm jmp _startup。程序的前面应该有汇编Startup这个关键字对吧,还是这条指令就是让程序从新开始运行。
可能我的问的问题基础了点,希望版主说的清楚点,真的万分感谢
作者: lishengqiang    时间: 2010-5-27 16:45

23# strongchen
请问一下,为什么我的开门狗根本就没有进入开门狗的中断,你知道是为什么吗
作者: strongchen    时间: 2010-5-28 10:28

这不是因为无法识别JMP指令,而是无法识别 _Startup。可以加这样一个说明在程序头部:

extern void _Startup(void);
作者: lishengqiang    时间: 2010-5-31 10:08

26# strongchen
我把它改过了,写成 JMP main 这样写可以进入编译通过,但是为什么没用进入中断呀(我在中断里设置了IED灯亮的,确定没有进入中断)不知道为什么,能简单提一下,可能有哪些原因吗?
作者: lishengqiang    时间: 2010-5-31 10:19

26# strongchen
看哈这个错误是什么原因
Link Error:L1907:Fixup overflow in _Vector_2 ,to COP_RST type1,at offset 0x0;
作者: lishengqiang    时间: 2010-6-1 22:24

版主你好,我找了论坛其他一些人的问题看了哈,我很有些困惑。你能不能看一下。在我的.PRM文件里最后几句话是
STACKTOP  0x3FFF                       

//VECTOR 0 _Startup
//VECTOR 0 Entry  
//INIT Entry      
//VECTOR ADDRESS 0xFFFA _Startup//COP_ISR
是这个样子的,注释我删了。你能帮我解释下这几句话有什么作用吗?
还是不知道为什么我把这几句话的任何一句不屏蔽的话系统就会弹出错误。
例如我把最后一句不屏蔽的话,系统就会弹出这样的错误:
Link Error1119:Vector allocated at absolute address 0xFFFAoverlaps with sections placed in segment .absSeg5.
能不能告诉一下这个问题该怎么解决,这个absSeg5指的是什么东西。
是不是意思是地址重复了,能不能帮忙看一下,万分感谢
作者: 数字万用表    时间: 2010-6-3 11:57

对汇编熟就嵌入汇编代码啦。用C的goto是跳转到语句,不是内存指针的跳转
作者: zephanshaka    时间: 2011-3-8 09:22

这种复位方式可以初始化MCU么?就是把一些外设寄存器都置成默认状态?
作者: zephanshaka    时间: 2011-3-8 13:21

s12的片子不成功,复位后永远都是跑到0xFFFE对应的中断程序。
作者: zephanshaka    时间: 2011-3-10 08:51

小弟在 mc9s12xdt256 上试了,设置COP的中断向量没有实际作用,系统复位后总是跳到最高的中断向量地址0xfffe,根本不会跳到COP对应的向量0xfffa,所以这个方法还是有局限性。
作者: hooter    时间: 2011-3-13 13:40

看门狗复位可以使芯片从新初始化吧。。。。
作者: hooter    时间: 2011-3-13 13:53

楼上的用法,就是在看门狗复位中断里做了个跳转吧,也就是说:飞思卡尔的单片机是不是 必须自己处理看门狗 的中断服务程序来实现复位操作啊。。。。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0