硬汉嵌入式论坛

 找回密码
 立即注册
查看: 584|回复: 13
收起左侧

[技术讨论] 变量被悄悄修改了?

[复制链接]

2

主题

29

回帖

35

积分

新手上路

积分
35
发表于 2025-6-13 10:40:22 | 显示全部楼层 |阅读模式
本帖最后由 老陈_cmm 于 2025-6-13 10:45 编辑

问题描述:单片机进入休眠,等待一段时间(不固定,有些板子几分钟,有些几十分钟或者更长都有),按键唤醒发现LCD显示屏显示的数字变成了初始值;

根据现象判断是saveFreq[]这个数组的数据被改变了,,系统被复位了一样,,但是这个产品一上电的时候屏幕会亮,并且停留在开机的工作界面,,
排查复现问题的时候并没有出现这个现象,所以我把复位的问题排除了。

接着在map文件找这个数组地址前面的几个变量,排查了框里的,发现并没有数组越界的;
saveFreq[]这个数组只在中断的时候才会被赋值


看看大伙有没有什么排查方向和方法?



下载.png
下载 (1).png
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-6-13 11:36:49 | 显示全部楼层
不会弄排版,,,排版乱遭遭的,,,刚开始我直接把图片复制进去,但是提交的时候点进去一看发现图片都没有了,,,后面用的图片上传,排版就成这样子了。。
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
发表于 2025-6-13 14:08:35 | 显示全部楼层
watch窗口右键变量set access breakpoint at "variable name" 自己勾选条件
回复

使用道具 举报

0

主题

33

回帖

33

积分

新手上路

积分
33
发表于 2025-6-13 14:19:26 | 显示全部楼层
在被修改的地址打数据断点,配置成写数据时触发,有地方修改到的时候就会触发断点
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2025-6-13 15:33:49 | 显示全部楼层
我就当成saveFreq[]这个数组出错来做判断。。

1.去掉进入休眠的代码,搞几个设备一起挂机测试。看看是否也能复现该问题。。
2.会正常休眠的设备,加个打印。进入休眠之前,退出休眠之后。把你的数据打印出来。。

我希望验证的内容为:
该问题是否是在进入休眠到退出休眠这段时间之内发生的。
现象应该为,进入休眠之前打印的数据正常,但是退出休眠之后打印的数据错误。

验证了这个接下来再聊。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2025-6-13 15:34:01 | 显示全部楼层
我就当成saveFreq[]这个数组出错来做判断。。

1.去掉进入休眠的代码,搞几个设备一起挂机测试。看看是否也能复现该问题。。
2.会正常休眠的设备,加个打印。进入休眠之前,退出休眠之后。把你的数据打印出来。。

我希望验证的内容为:
该问题是否是在进入休眠到退出休眠这段时间之内发生的。
现象应该为,进入休眠之前打印的数据正常,但是退出休眠之后打印的数据错误。

验证了这个接下来再聊。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2025-6-13 15:34:11 | 显示全部楼层
我就当成saveFreq[]这个数组出错来做判断。。

1.去掉进入休眠的代码,搞几个设备一起挂机测试。看看是否也能复现该问题。。
2.会正常休眠的设备,加个打印。进入休眠之前,退出休眠之后。把你的数据打印出来。。

我希望验证的内容为:
该问题是否是在进入休眠到退出休眠这段时间之内发生的。
现象应该为,进入休眠之前打印的数据正常,但是退出休眠之后打印的数据错误。

验证了这个接下来再聊。
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-6-13 17:19:24 | 显示全部楼层
Xor_Li 发表于 2025-6-13 14:08
watch窗口右键变量set access breakpoint at "variable name" 自己勾选条件

好方法,之前都不知道这种用法,感谢
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-6-13 17:24:43 | 显示全部楼层
Zhyolo 发表于 2025-6-13 14:19
在被修改的地址打数据断点,配置成写数据时触发,有地方修改到的时候就会触发断点

这个回复怎么不能贴图片。。。设置了变量不等于进入休眠前的值(把休眠改成了while(1)判断到按键按下就跳出模拟进入了休眠)的时候就触发,,,不知道有没有设置对,第一次用这个调试方法,跟着CSDN上面操作的,但是没触发到,,
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-6-13 17:26:28 | 显示全部楼层
会飞的猪_2020 发表于 2025-6-13 15:34
我就当成saveFreq[]这个数组出错来做判断。。

1.去掉进入休眠的代码,搞几个设备一起挂机测试。看看是否 ...

1.去掉休眠代码。用while(1)
{
   if(按键按下)
   {

}
}
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-6-13 17:35:56 | 显示全部楼层
1.去掉休眠代码,,用while(1){ if(按键按下) break;} 模拟休眠,,这样测试也能复现该问题。                              
2.①同1我用JLINK在MDK上仿真调试挂着,,当板子和JLINK电源没连接时(只连接GND,CLK,DAT),,挂一段时间后,,发现系统复位了,MDK上显示如下图(附件链接),,我代码里面没有开看门狗;;;
②当板子和JLINK电源线也连接时,测试了很多次系统都正常
29e6202b570d1054d0b8a5500212dbf.png
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2025-6-16 10:00:52 | 显示全部楼层
老陈_cmm 发表于 2025-6-13 17:35
1.去掉休眠代码,,用while(1){ if(按键按下) break;} 模拟休眠,,这样测试也能复现该问题。              ...

1.去掉休眠代码也能复位,说明这个问题和休眠没关系,接下来你可以在非休眠情况下去测试了。
变量莫名其妙被修改,大概率就是因为哪里的数组越界导致的,估计是哪里程序写的不好导致的。

2.你的优化等级是多少?好的代码应该是所有优化等级通吃,不过你可以改成O0试试看,优化等级0的时候鲁棒性强一点。

3.另外,如果你没有看门狗,没有自己调用软件复位函数。我可以明确的告诉你,单片机是不会复位的。你插着JLINK是不是供电不稳定?或者硬件上其他方式导致的复位?

4.另外,你对复位的判定依据是什么?休眠有多种模式。standby模式下,休眠后唤醒相当于复位。我之前看你的map里面,变量也没放在.bss段里面。如果复位的话,里面数据是会被初始化的。
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-6-16 17:51:48 | 显示全部楼层
破案了,,最后发现按键唤醒的瞬间供给MCU的VCC有负脉冲,会被瞬间拉低到1V左右(唤醒马上开启负载导致),,
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-6-16 17:53:26 | 显示全部楼层
会飞的猪_2020 发表于 2025-6-16 10:00
1.去掉休眠代码也能复位,说明这个问题和休眠没关系,接下来你可以在非休眠情况下去测试了。
变量莫名其 ...

已排查到原因,感谢耐心教导
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:35 , Processed in 0.051455 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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