bujie8010 发表于 2016-1-21 13:56:37

单片机用(*(void (*)())0)(); 软件复位失败怎么回事?

我的下位机系统之前一直在更改诸如波特率和通讯地址后用(*(void (*)())0)(); 进行重启操作,之前一直工作正常.
但最近不知道为什么不行了,单步跟踪执行该语句会直接跳过,或者跑飞。
反编译内容如下:
   (*(void (*)())0)();            //Parameter中储存的均为重要参数,储存位置在info flash中,软件复位,重启
005036    1283               call    #0x0


希望大神指教!

chenxujiaoyang 发表于 2016-1-21 14:03:35

是不是编译器优化的问题。

ibichao 发表于 2016-1-21 14:12:39

51里不能直接(*(void (*)())0)(),只因这个方法中断优先级复位不了,不知道MSP430是不是也这样子

bujie8010 发表于 2016-1-21 14:16:48

尝试过不用优化,还是一样,最后发现问题在调试器上,IAR430的调试器在执行单步执行这个语句后会自动跳转重启,然后到这个语句后面再停下来,准确的说应该是软件在进行单步调试时是会在语句后面的位置打个断点(界面上看不见),然后执行这个之后会重启运行到该隐形断点后停住,该过程很快,所以我以为是没有重启,直接跳过了。

bujie8010 发表于 2016-1-21 14:18:49

问题已解决,(*(void (*)())0)(); 该语句还是起效的,只是调试器在单步执行后不停在程序main入口的地方,而是一直运行到该语句后面停下!

leafstamen 发表于 2016-1-21 15:59:51

这么玩,考虑过栈的感受么

mangocity 发表于 2016-1-21 17:35:38

leafstamen 发表于 2016-1-21 15:59
这么玩,考虑过栈的感受么

栈不会有问题。没有经过reset步骤,寄存器有问题。
现在没有SWRESET功能的MCU很少吧?

sbusr 发表于 2016-1-21 19:55:20

确认复位后的pc是0吗?

bujie8010 发表于 2016-1-22 10:17:11

mangocity 发表于 2016-1-21 17:35
栈不会有问题。没有经过reset步骤,寄存器有问题。
现在没有SWRESET功能的MCU很少吧? ...

相关寄存器的话又重新设置一遍。
页: [1]
查看完整版本: 单片机用(*(void (*)())0)(); 软件复位失败怎么回事?