搜索
bottom↓
回复: 8

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

[复制链接]

出0入8汤圆

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


希望大神指教!

出0入0汤圆

发表于 2016-1-21 14:03:35 | 显示全部楼层
是不是编译器优化的问题。

出0入4汤圆

发表于 2016-1-21 14:12:39 | 显示全部楼层
51里不能直接(*(void (*)())0)(),只因这个方法中断优先级复位不了,不知道MSP430是不是也这样子

出0入8汤圆

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

出0入8汤圆

 楼主| 发表于 2016-1-21 14:18:49 | 显示全部楼层
问题已解决,(*(void (*)())0)(); 该语句还是起效的,只是调试器在单步执行后不停在程序main入口的地方,而是一直运行到该语句后面停下!

出0入57汤圆

发表于 2016-1-21 15:59:51 | 显示全部楼层
这么玩,考虑过栈的感受么

出0入0汤圆

发表于 2016-1-21 17:35:38 | 显示全部楼层
leafstamen 发表于 2016-1-21 15:59
这么玩,考虑过栈的感受么

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

出0入0汤圆

发表于 2016-1-21 19:55:20 来自手机 | 显示全部楼层
确认复位后的pc是0吗?

出0入8汤圆

 楼主| 发表于 2016-1-22 10:17:11 | 显示全部楼层
mangocity 发表于 2016-1-21 17:35
栈不会有问题。没有经过reset步骤,寄存器有问题。
现在没有SWRESET功能的MCU很少吧? ...

相关寄存器的话又重新设置一遍。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 10:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表