amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 52

STM32F103RE全局数组的值自己变化,原因可能是某块内存坏了

[复制链接]
(695904)

打赏出0元收入0元

发表于 2020-6-30 14:12:39 | 显示全部楼层 |阅读模式
今天调试程序发现定义的一个全局数组里边的值偶尔会有几个数自己跳,在外部中断里给数组赋值之后过一会儿数组自己会清0,一开始以为又进中断了把值改了,后来测试发现并没有重复进中断,搜索了全部文件也确认没有其它地方操作这个数组,只是在外部中断里赋了一次值,反复找原因,最后在这个数组的内存地址前放了一些无用的数组,使其内存地址往后移,然后正常了,数组值不会自己变了,将程序改回去还是自己变,因此怀疑单片机的这段内存坏了,直接程序不动,换了个单片机,直接将.bin文件刷进去,数组值正常。
这么多年第一次遇见这问题,感觉以后再也遇不见这问题了,毕竟出现的几率极低极低。
(695751)

打赏出0元收入0元

发表于 2020-6-30 14:15:12 来自手机 | 显示全部楼层
有那么神奇
(695477)

打赏出0元收入0元

发表于 2020-6-30 14:19:46 | 显示全部楼层

有那么神奇
楼主要查BUG了
(695466)

打赏出0元收入0元

发表于 2020-6-30 14:19:57 | 显示全部楼层
这一般都是指针越界造成的,你可以专门写一个软件来测那个内存区域 ...
(695365)

打赏出0元收入0元

发表于 2020-6-30 14:21:38 | 显示全部楼层
楼主,你是来搞笑的吗?
(695309)

打赏出0元收入0元

发表于 2020-6-30 14:22:34 | 显示全部楼层
大部分时候是自己程序问题造成的吧
(693773)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 14:48:10 | 显示全部楼层
chunjiu 发表于 2020-6-30 14:19
这一般都是指针越界造成的,你可以专门写一个软件来测那个内存区域 ...

就没用指针
(693697)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 14:49:26 | 显示全部楼层
zhou_1989 发表于 2020-6-30 14:22
大部分时候是自己程序问题造成的吧

只有这块单片机会出这问题 换其它的就没事了 我一开始也是怀疑是程序问题 而且不用这块内存这个单片机也没事
(693668)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 14:49:55 | 显示全部楼层
bblythe2019 发表于 2020-6-30 14:21
楼主,你是来搞笑的吗?

我也觉得挺不可思议
(693621)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 14:50:42 | 显示全部楼层
changhui0222 发表于 2020-6-30 14:19
有那么神奇
楼主要查BUG了

查了半天程序还有设置的BUG最后发现不是
(693208)

打赏出0元收入0元

发表于 2020-6-30 14:57:35 | 显示全部楼层
100%是你自己的问题
(692716)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 15:05:47 | 显示全部楼层
442502587 发表于 2020-6-30 14:57
100%是你自己的问题

直接定义了个新数组占用原来数组的内存地址 原来数组后移 新数组确保没有被任何代码调用  新数组仍会自己变
(692571)

打赏出0元收入0元

发表于 2020-6-30 15:08:12 | 显示全部楼层
本帖最后由 chunjiu 于 2020-6-30 15:09 编辑


代码中没用到数组?

PS:

补充:数组和指针这两个就是差不多的意思 ...
(692335)

打赏出0元收入0元

发表于 2020-6-30 15:12:08 | 显示全部楼层
一般程序问题,可专门写代码测试一下RAM
(691254)

打赏出0元收入0元

发表于 2020-6-30 15:30:09 | 显示全部楼层
换个片子测试下看看
(690723)

打赏出0元收入0元

发表于 2020-6-30 15:39:00 | 显示全部楼层
指针乱指,数组越界这边看看先
(690063)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 15:50:00 | 显示全部楼层
jackjiao 发表于 2020-6-30 15:30
换个片子测试下看看

换过了没问题了 那块片子确实有问题 写了个最简单的程序 滴答定时器一直走同时主循环中调用滴答定时器实现LED心跳式闪烁代表单片机没死机 堆一堆变量或者空数组 查看map文件确定变量或数组在指定地址 程序中不给这些变量或数组赋值 然后运行程序 确实还会偶尔跳 在正常的单片机上测试没问题 在这里仅是告大家一声 当找程序找半天都发现不了问题时不妨换个思路 可多人都会首先认为是程序的事 会先找自己程序的问题 本来还打算截点图与代码补上让大家看看详细过程呢 但没想到直接拍脑门想当然的人这么多 没啥补的必要了 谨在此知会一声
(689899)

打赏出0元收入0元

发表于 2020-6-30 15:52:44 | 显示全部楼层
肯定是你程序问题
(689798)

打赏出0元收入0元

发表于 2020-6-30 15:54:25 | 显示全部楼层
Athelloren 发表于 2020-6-30 15:50
换过了没问题了 那块片子确实有问题 写了个最简单的程序 滴答定时器一直走同时主循环中调用滴答定时器实 ...

也不是没有可能内存坏了,相信自己。
(689727)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 15:55:36 | 显示全部楼层
yuyu87 发表于 2020-6-30 15:52
肯定是你程序问题

可能大家以为我上边说的换其它单片机是换了其它型号的 补充一下仍是换的这个型号的 程序问题怎么解释同样的程序在其它单片机上没问题 只在这个单片机有问题
(689471)

打赏出0元收入0元

发表于 2020-6-30 15:59:52 | 显示全部楼层
别的不出现 可能是时间不够长
(689272)

打赏出0元收入0元

发表于 2020-6-30 16:03:11 | 显示全部楼层
Athelloren 发表于 2020-6-30 15:55
可能大家以为我上边说的换其它单片机是换了其它型号的 补充一下仍是换的这个型号的 程序问题怎么解释同样 ...

哈哈,这里的键盘侠还是挺多的,我指出gcc编译一个巨大的switch case给我搞丢1个case一堆人喷我代码有问题,问题是我都能手写cpu了(写过一个avr8),会犯这种低级错误?只有gcc编译的会少一个case,改成if else也没有这个case,而且确实就这一个case不起作用。我这一大堆case是用来初始化设备的。后来把case精简了之后就正常了。

事实证明,让人意想不到的情况多去了。通常当你开始怀疑一个问题之前,还是要先查查代码有没有问题。不要查c代码,查汇编。汇编可以看出99%的问题。还有1%的问题就是硬件相关的问题了。比如我的avr核在rom超过12KB之后始终不太正常,后来riscv出来之后我就不再折腾它了,换riscv了。32位机在定时器之类上有很大的优势,8位机在中断时那个systick定时器总是会被改一半,导致后面程序必须得加一个计数器二次读取校验,非常不爽。如果忘了加校验程序一定会出错。
(688671)

打赏出0元收入0元

发表于 2020-6-30 16:13:12 | 显示全部楼层
内存够的话,舍弃异常RAM区域,使用其他范围的
(687796)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 16:27:47 | 显示全部楼层
2nd 发表于 2020-6-30 16:13
内存够的话,舍弃异常RAM区域,使用其他范围的

把那区域填上没用的变量或者数组可以 但也不打算这样牵就用那个片子 没必要为了它把其它所有单片机全加些没用的变量进去 直接把它去了就行了 又不值钱
(685804)

打赏出0元收入0元

发表于 2020-6-30 17:00:59 | 显示全部楼层
数组越界,指针乱指,绝壁是这两个里的一个。。。。。。
(685403)

打赏出0元收入0元

发表于 2020-6-30 17:07:40 | 显示全部楼层
99%  程序问题 (看看是不是数组越界了)
(685088)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 17:12:55 | 显示全部楼层
huangyiting1990 发表于 2020-6-30 17:07
99%  程序问题 (看看是不是数组越界了)

不用数组也能越界 请看我上边的回复 专门写的代码用变量或数组都会变
(684982)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 17:14:41 | 显示全部楼层
niechao15 发表于 2020-6-30 17:00
数组越界,指针乱指,绝壁是这两个里的一个。。。。。。

常规首先都这样想
(684866)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 17:16:37 | 显示全部楼层
问题已经解决了 大家不用瞎猜了
(684665)

打赏出0元收入0元

发表于 2020-6-30 17:19:58 | 显示全部楼层
Athelloren 发表于 2020-6-30 17:16
问题已经解决了 大家不用瞎猜了

解决了,就说明一下。。。
(684428)

打赏出0元收入0元

发表于 2020-6-30 17:23:55 | 显示全部楼层
我也遇到过,但是最终还是发现是自己代码问题,有可能和优化也有关系
(684158)

打赏出0元收入0元

 楼主| 发表于 2020-6-30 17:28:25 | 显示全部楼层
niechao15 发表于 2020-6-30 17:19
解决了,就说明一下。。。

看回复 已经说明了
(682271)

打赏出0元收入0元

发表于 2020-6-30 17:59:52 | 显示全部楼层
我猜是有野指针噢
(675118)

打赏出0元收入8元

发表于 2020-6-30 19:59:05 来自手机 | 显示全部楼层
大家怎么看楼主说的相同的bin代码换了一片单片机就好。而这个有问题的单片机就算执行最简单的程序也会出错。那些说楼主程序有问题的还是先解释一下为什么相同的程序别的单片机没问题这个单片机一定有问题
(674140)

打赏出0元收入0元

发表于 2020-6-30 20:15:23 来自手机 | 显示全部楼层
一般不要想片子的问题
(671271)

打赏出0元收入0元

发表于 2020-6-30 21:03:12 | 显示全部楼层
其实  编译器 和 MCU本身有问题都很正常,出货量大了,就会发现,总有那么几片 flash ram 都可能出问题。大多数问题是程序问题,不是所有问题都是程序问题。
(667243)

打赏出0元收入0元

发表于 2020-6-30 22:10:20 | 显示全部楼层
本帖最后由 EMOSYN 于 2020-6-30 22:25 编辑

楼主,高可靠性系统中,MCU 的 RAM自检是必需的,而不是可选的。
(661634)

打赏出0元收入0元

发表于 2020-6-30 23:43:49 | 显示全部楼层
1,指针越界了
2.bootload有中断程序或者DMA传输没有关闭,就跳到APP的代码了。

你程序有问题。
(624627)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
有没有检查是否堆栈溢出?
(624236)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
之前也遇到过类似问题,后来程序上改了点,就规避掉了,99.9%还是程序问题。当然楼主说的ram坏了也存在概率,只是极低
(623662)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
这个单片机可以留着纪念。
(622838)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
类似情况99%是程序问题,但楼主看来遇到了那1%
(618334)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
前段时间我也遇到了一个奇葩问题,结构体中有一个变量,在串口通信中,只要主机有数据过来,这个变量就被改写了,这个变量跟通讯那块一点关系都没有,后面我把那个变量挪到外面,不在结构体里面定义。就正常了。不知道是什么原因。
(617434)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
有可能是数组越界,或者是有初始化数据,我前段时间也遇到过这问题,莫名其妙数就变了
(617053)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
可以写个最简单的程序来验证问题的。
(616443)

打赏出0元收入0元

发表于 7 天前 来自手机 | 显示全部楼层
是否也有可能是外圍硬件不合格導致?
(605716)

打赏出0元收入0元

 楼主| 发表于 7 天前 | 显示全部楼层
dykwai1 发表于 2020-7-1 10:30
类似情况99%是程序问题,但楼主看来遇到了那1%

99.999999%是程序问题 所以我觉得以后再也不会遇到这问题了 因为几率太低了
(605400)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
可能是某些部分 内存越界了  不然不可能的   ST是大公司 IC这种问题早倒闭了  你要好好查自己代码   
(601960)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
我也碰到过,有个别单片机内存损坏
(580273)

打赏出0元收入0元

发表于 7 天前 | 显示全部楼层
一般莫名其妙的问题,都是自己的问题,可以另外拿个ic试一下,估计也是一样的
(531763)

打赏出0元收入0元

发表于 6 天前 | 显示全部楼层
不可能,数据溢出了吧
(529738)

打赏出0元收入0元

发表于 6 天前 来自手机 | 显示全部楼层
EMOSYN 发表于 2020-6-30 22:10
楼主,高可靠性系统中,MCU 的 RAM自检是必需的,而不是可选的。

说起这个倒是想起了的确是这样:简单的例子,我们天天用的电脑,开机时候bios不就是会检测ram嘛,还有一些仪器设备,自检里面都会有ram test pass 项
(444225)

打赏出0元收入0元

发表于 5 天前 | 显示全部楼层
RAM 占用芯片面积较大,出现问题概率较高。

我所在行业MCU出货量大,统计标本数量较大,统计出的MUC RAM出错率约在 1/5M(当然,芯片损坏率远高于这个数值),表现为:同一个RAM地址写入跟读出的数据不同。

FIB分析结果:RAM的行线(列线)断开。
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-8 15:31

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

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