搜索
bottom↓
回复: 13

遇到一个很奇怪的RAM数据异常变化的问题

[复制链接]

出0入0汤圆

发表于 2020-12-2 15:38:16 | 显示全部楼层 |阅读模式
遇到一个问题,用的是一个51核的MCU。

程序内定义的一个用来存储系统需要保存的参数的结构体,   其中的个别成员不知原因的变了。

问题偶尔可以复现,然后似乎温度10几度时能出现,20几度就不出现。   代码看来看去都没发现有什么问题

1. 有怀疑是不是程序什么地方内存写越界,写到结构体部分,但没找到,而且抓到现象的时候只有结构体个别成员错误,其他是正确的。判断应该不是这个问题

2.怀疑栈溢出,导致指针乱指,指到结构体把数据给改写了。       但如果是这个情况,程序应该会跑飞才对把。   现在情况是程序还可以正常运行 ,就是数据错了。

或者有没有可能局部变量申请的地址刚好和这个结构体地址重合,导致数据被改

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入442汤圆

发表于 2020-12-2 15:41:56 | 显示全部楼层
我记得有贴子说51中断如果和程序共用API,则RAM的数据有可能会被覆盖(高级优化模式下Keil可能会复用一部分RAM空间供两个函数共同使用造成中断返回之后异常)。你找找看

出0入8汤圆

发表于 2020-12-2 15:43:02 | 显示全部楼层
我也遇到了,也是51单片机,也是在结构体里面。一个变量的数据无缘无故的被修改,导致运行逻辑出错,后面我把这个变量放到结构体外面定义就正常了,不知道啥原因。

出0入0汤圆

发表于 2020-12-2 15:46:58 | 显示全部楼层
查看一下MAP地址,然后这个变量附件的变量有没有可能会越界什么的

出0入0汤圆

发表于 2020-12-2 16:27:26 | 显示全部楼层
1.结构体定义成全局变量。
2.内存需要初始化。也就是结构体需要赋值。
满足这两点还有问题的,一般是编译器问题。比如编译器没有限制堆栈指针,导致堆栈超出范围,影响到结构体。
当然,现阶段编译器应该没啥问题,有问题了就不可能编译通过。可以看反汇编找一下出现问题的点,看看编译器是否出了问题,即使内存不越界,也可能被多编译一条修改的指令。
还有一个最大的问题可能来自调试器,就是所谓的仿真器。宇宙无敌的51单片机自带的仿真器,就会出现这种问题。但是连续运行的时候,即使你看到的数据被修改,程序不会错乱。

出0入0汤圆

 楼主| 发表于 2020-12-2 16:37:50 | 显示全部楼层
SANMSONWANG 发表于 2020-12-2 16:27
1.结构体定义成全局变量。
2.内存需要初始化。也就是结构体需要赋值。
满足这两点还有问题的,一般是编译器 ...

1.结构体是全局变量。
2.内存有初始化。

我也并不是用仿真出问题的,  是烧录到芯片里运行出问题的。

你是说看反汇编的代码是不是正确吗?   工程这么大看汇编很难看出来把?

一般51单片机应该是内部data使用的剩余用作栈吧。   有没有可能剩余的栈太少,   但如果是栈太少,不应该是程序都运行不正常吗?

而我的现象是程序可以正常运行,就是结构体的个别成员变了

出0入0汤圆

 楼主| 发表于 2020-12-2 16:48:51 | 显示全部楼层
SANMSONWANG 发表于 2020-12-2 16:27
1.结构体定义成全局变量。
2.内存需要初始化。也就是结构体需要赋值。
满足这两点还有问题的,一般是编译器 ...

我被修改的结构体成员,在程序里也只有在特定界面,按特定按键才有接口可以修改

所以感觉是被异常修改的

出0入213汤圆

发表于 2020-12-2 17:00:48 | 显示全部楼层
2楼分析得有道理, 存在这种情况.

中断里面调用的函数在中断外就不用调用了. 有风险

出0入0汤圆

 楼主| 发表于 2020-12-2 17:07:10 | 显示全部楼层
wye11083 发表于 2020-12-2 15:41
我记得有贴子说51中断如果和程序共用API,则RAM的数据有可能会被覆盖(高级优化模式下Keil可能会复用一部分 ...

嗯, 你说的这个是有可能。

但我的程序这个结构体并没有在中断里使用

出0入0汤圆

 楼主| 发表于 2020-12-2 17:09:31 | 显示全部楼层
bailangcn 发表于 2020-12-2 15:46
查看一下MAP地址,然后这个变量附件的变量有没有可能会越界什么的

嗯,   这个我有看过,看来看去也没发现会越界

而且如果越界的话,也应该会是结构体连续的一块被修改吧。

而我遇到的是结构体并不连续的成员会被修改。  而且还不是固定的成员。 有时候是这个有时候那个

出0入21汤圆

发表于 2020-12-2 21:28:38 | 显示全部楼层
我碰到类似的问题,后来降低优化等级就正常了,到现在一直找不到原因

出0入0汤圆

发表于 2020-12-2 21:51:47 | 显示全部楼层
这个很大可能是电路布线引入的干扰,以前在PIC单片机上也见过

出0入0汤圆

发表于 2020-12-2 21:58:29 来自手机 | 显示全部楼层
结构体单字节对齐试试,大概率是这个问题导致的

出0入0汤圆

 楼主| 发表于 2020-12-9 10:47:24 | 显示全部楼层
感觉就是栈的问题。

我特意把全局变量加大。    然后51单片机内部data空间缩小。     也就意味着栈空间缩小。

然后运行程序,数据莫名其妙被修改的现象就会很容易出现。

程序可以正常运行,但有可能执行某一函数调用。就出问题。

用的单片机仿真有点问题,不好抓。    但我猜想可能是栈的问题。

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

本版积分规则

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

GMT+8, 2024-5-29 18:03

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

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