搜索
bottom↓
回复: 21

求助:STM32运行过程中停在某个位置,死机了!

[复制链接]

出0入0汤圆

发表于 2021-10-10 14:29:49 | 显示全部楼层 |阅读模式
本帖最后由 Junsea 于 2021-10-10 19:08 编辑

片子型号:STM32F103VCT6,裸奔

程序在跑的过程中发现死机,死机的时候相应的输出IO能够维持正常输出,比如逻辑要求输出高电平的,死机状态IO还是能够维持高电平状态。

挂MDK监控全速运行发现,程序跑着跑着会在某一步停下来,MDK显示的状态也是退出了全速运行状态,此时MDK仍旧处于调试模式。
只是这个时候MDKd<run>按钮已经点亮(正常MDK调试模式全速运行后这个<run>按钮会灰掉),此时再点一下MDK的<run>按钮,程序会继续跑,逻辑也正常。
从上述现象看,程序没有跑飞,系统没有复位,也不是晶振停振。

出现实际频率很低,全天候24小时运行,几天才能碰到一次。
折腾一星期了,苦恼中……,恳请各路英豪支招!

问题更新:
1、初步怀疑堆栈问题,今天出现两次问题,一次死在 push {rxx,lr} 这句,另一次死在这句的后一句  mov r4,r0

出0入0汤圆

发表于 2021-10-10 15:02:25 | 显示全部楼层
写程序最痛苦的bug莫过于此,这个坑一般人帮不了你,只能靠自己痛苦的查找。

出0入0汤圆

 楼主| 发表于 2021-10-10 15:12:31 | 显示全部楼层
hexenzhou 发表于 2021-10-10 15:02
写程序最痛苦的bug莫过于此,这个坑一般人帮不了你,只能靠自己痛苦的查找。 ...

坛子上人多,高手也多,或许谁之前遇到过类似问题,说不定可以指明个大致方向

出105入79汤圆

发表于 2021-10-10 16:35:36 | 显示全部楼层
1.  换一个淘宝买的核心板,或者st官方核心板,挂上去跑一样的程序,排除硬件问题。

2.  开看门狗,卡住后自动复位,不解决,先出货。

3. 在2的基础上加入类似stackdump功能, 把所有寄存器和堆栈内容保存起来,事后查看卡在哪个代码。

出280入168汤圆

发表于 2021-10-10 16:44:30 | 显示全部楼层
这症状貌似有个固件的断点,你查查断点列表。

出0入0汤圆

 楼主| 发表于 2021-10-10 17:22:35 | 显示全部楼层
qwe2231695 发表于 2021-10-10 16:35
1.  换一个淘宝买的核心板,或者st官方核心板,挂上去跑一样的程序,排除硬件问题。

2.  开看门狗,卡住后 ...

初步估计可能也是堆栈的问题,今天发现出现两次。发现都停在子程序调用的地方,一次停在这个 这句 push{rxx, lr},一次停在这个的下一句

出0入0汤圆

发表于 2021-10-10 18:02:02 | 显示全部楼层
MDK版本多少

出0入0汤圆

发表于 2021-10-10 18:05:50 来自手机 | 显示全部楼层
堆栈可能性较大!

出0入0汤圆

发表于 2021-10-10 18:31:41 来自手机 | 显示全部楼层
你把没有的变量删一删,全局变量删一删,用完的变量,及时清掉,估计就好了

出0入0汤圆

发表于 2021-10-10 18:49:24 | 显示全部楼层

可以看看是不是这个文件不对,我之前就是这个文件不对,出错

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出105入79汤圆

发表于 2021-10-10 18:51:12 | 显示全部楼层
把s文件的堆栈大小改大。当堆栈不够时,一般是函数嵌套达到一定的程度,就对堆栈溢出,覆盖正常的内存,如果hardfault没有检测出来,但是流程又乱了就会假死一样。

出0入0汤圆

 楼主| 发表于 2021-10-10 18:57:17 | 显示全部楼层

535,比较新

出0入0汤圆

 楼主| 发表于 2021-10-10 18:58:37 | 显示全部楼层
hetao7241 发表于 2021-10-10 18:49
可以看看是不是这个文件不对,我之前就是这个文件不对,出错

实力不允许啊,基本从来没有看过这个文件,更谈不甄别这个文件对还是不对了!

出0入0汤圆

 楼主| 发表于 2021-10-10 19:00:11 | 显示全部楼层
本帖最后由 Junsea 于 2021-10-10 19:02 编辑
qwe2231695 发表于 2021-10-10 18:51
把s文件的堆栈大小改大。当堆栈不够时,一般是函数嵌套达到一定的程度,就对堆栈溢出,覆盖正常的内存,如 ...


如果hardfault 检测出来的是不是应该停在中断函数里面的while(1)
默认中断函数
void HardFault_Handler(void)
{
        while(1)
        {
        }
}

如果hardfault 没有检测出来,就会有我这样的表现

是这个意思么?

出105入79汤圆

发表于 2021-10-10 22:16:54 | 显示全部楼层
Junsea 发表于 2021-10-10 19:00
如果hardfault 检测出来的是不是应该停在中断函数里面的while(1)
默认中断函数
void HardFault_Handler(v ...

对的,你可以在while里加入点亮一个led,这样就能看出来是进入了hardfault。

出0入0汤圆

 楼主| 发表于 2021-10-11 00:01:36 | 显示全部楼层
qwe2231695 发表于 2021-10-10 22:16
对的,你可以在while里加入点亮一个led,这样就能看出来是进入了hardfault。

那肯定是没有进入 hardfault 了,因为debug模式下并没有看到死在 while(1)

出10入0汤圆

发表于 2021-10-11 00:28:46 来自手机 | 显示全部楼层
之前遇到一个是电源纹波大导致。

出200入2554汤圆

发表于 2021-10-11 03:53:40 来自手机 | 显示全部楼层
Junsea 发表于 2021-10-11 00:01
那肯定是没有进入 hardfault 了,因为debug模式下并没有看到死在 while(1)

编一个看门狗,不要复位只用中断那种。
在看门狗中断里设法输出堆栈就知道了。
为此可能得挂个串口或者存储器啥的

P.S. 堆栈里(MSP或者PSP,具体看手册)最近的程序地址就是死机发生时的位置,可以给你查bug提供参考。

出0入0汤圆

发表于 2021-10-11 09:34:09 | 显示全部楼层
“程序跑着跑着会在某一步停下来”这步你没分析?!

出0入16汤圆

发表于 2021-10-11 09:59:12 | 显示全部楼层
如果是我的话,先换一片芯片跑回相同程序

出0入0汤圆

 楼主| 发表于 2021-10-11 10:25:42 | 显示全部楼层
xstt 发表于 2021-10-11 09:59
如果是我的话,先换一片芯片跑回相同程序

已经是两台相同设备再跑,都会出现类似问题!

出0入4汤圆

发表于 2021-10-11 10:55:02 | 显示全部楼层
停下之后, 看下MDK堆栈窗口信息, 看下哪个函数导致的.  同时对比下SP指针, 是否已经越界
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 10:02

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

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