单片机的软件复位分析(C语言)

在单片机的软件抗干扰原理中,常常采用软件复位的方法,以下是两种常用的软件复位程序:
1、常用软件复位程序

void reset(void)
{
(*(void(*)())0x0000)();
}

汇编码:





 

我们来分析一下:
(*)()是函数指针的强制转换
(*(void(*)())0x0000)()就是将函数的入口地址强制指向0x0000处,即进行了软复位。
它的缺点是不能在中断子程序中调用,因为这句指令仅仅使PC指针指向0x0000处,而并没有清除中断标志位。

2、可以在中断程序中调用的软件复位程序

void reset(void)
{
uchar code rst[] = {0xe4, 0xc0,0xe0,0xc0,0xe0,0x32};

(*((void(*)(void))(rst)))();
}

汇编码:









我们来分析一下:
程序中将代码当作数组的数据来存储。
rst是程序代码的首地址
(void(*)(void))是函数指针的强制转换
(void(*)(void))(rst))是将数组名rst强制转换成一个无参数无返回值的函数的指针,指向rst的首地址,只需调用(*((void(*)(void))(rst)))()即可将数组中的数据当作函数代码来运行。
由汇编语言可知,这段程序可以清除掉中断标志位(使用了RETI指令),因此该段代码可以在中断子程序中运行。

你可能感兴趣的:(Embedded,System)