搜索
bottom↓
回复: 35

很奇怪的问题程序问题。

[复制链接]

出0入0汤圆

发表于 2014-8-7 08:42:12 | 显示全部楼层 |阅读模式
本帖最后由 huangyiting1990 于 2014-8-7 09:55 编辑

  我的现在写的一个程序里面有个问题,有个变量的值会在程序运行中突然被篡改掉,我觉得是我程序问题,结果我先给变量设定一个初值(非0),把程序里面所有修改变量值的语句都屏蔽掉,结果运行的时候也还是被篡改成0了。 变量空间超了?我现在只是把这个变量改到另外一个.c文件里面定义,问题就没发现了(其他没改)。很奇怪,不知道什么问题。

修改原因:增加MCU型号 增加设置参数描述

本帖子中包含更多资源

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

x

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-8-7 09:16:52 | 显示全部楼层
不太可能啊,一定是有某个地方修改了它的值。最好上些代码,表达清楚。

出0入0汤圆

发表于 2014-8-7 09:17:59 | 显示全部楼层
指针?字节对齐?

出0入42汤圆

发表于 2014-8-7 09:23:28 | 显示全部楼层
挂上内存修改断点, 变量监视断点之类的. 别处内存越界, 指针乱了

出0入0汤圆

发表于 2014-8-7 09:54:53 | 显示全部楼层
把变量名改一个。

出0入0汤圆

 楼主| 发表于 2014-8-7 09:58:00 | 显示全部楼层
albert_w 发表于 2014-8-7 09:23
挂上内存修改断点, 变量监视断点之类的. 别处内存越界, 指针乱了

已增加,看是否你需要的?     会改变的变量名称是 Jishu_Fangshi   初始化等于  1    。我测试的时候有把除定义变量和此处检测的地方  其他所有用到Jishu_Fangshi这个变量的地方全删除了,但这个变量的实质还是会变成0

出0入0汤圆

 楼主| 发表于 2014-8-7 09:59:01 | 显示全部楼层
cqb98 发表于 2014-8-7 09:54
把变量名改一个。

该变量名称无效,倒是把定义的位置换一个.C文件 解决了。但心里不踏实。不知道还有没其他变量会出现这个情况

出0入42汤圆

发表于 2014-8-7 10:01:44 | 显示全部楼层
huangyiting1990 发表于 2014-8-7 09:59
该变量名称无效,倒是把定义的位置换一个.C文件 解决了。但心里不踏实。不知道还有没其他变量会出现这个 ...

你出这个问题, 因为你根本没搞明白c的指针机制。

多少奇怪的内存改写从来不是因为有人操作了这个变量。

你操作指针,指针没初始化,导致无意中指向你的变量,把你的变量改了。


挂上内存监视,一改写就停下来了。查看下调用栈就知道哪里出问题了。

出0入0汤圆

发表于 2014-8-7 10:10:31 | 显示全部楼层
如楼上所说! 可能是操作其它数组越界 或 其它变量指针操作到此变量地址!

出0入0汤圆

 楼主| 发表于 2014-8-7 10:26:19 | 显示全部楼层
AVR_PIC 发表于 2014-8-7 10:10
如楼上所说! 可能是操作其它数组越界 或 其它变量指针操作到此变量地址! ...

很有可能,我对指针不熟,所以程序里面没有使用的指针变量。数组越界可能性最大。  如果说数组越界的话,不知道怎么去确认。  我觉得这个地方的数组定义除了问题。

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-8-7 10:28:12 | 显示全部楼层
albert_w 发表于 2014-8-7 10:01
你出这个问题, 因为你根本没搞明白c的指针机制。

多少奇怪的内存改写从来不是因为有人操作了这个变量 ...

再请教一下  Keil 怎么查看内存越界?  我发现一个地方可能是导致这个问题的。我其实是想定义一个不定长度的二维数组。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-8-7 10:32:48 来自手机 | 显示全部楼层
编译完后的内存,看看,以前我也碰过

出0入0汤圆

 楼主| 发表于 2014-8-7 10:35:49 | 显示全部楼层
zhouyan 发表于 2014-8-7 10:32
编译完后的内存,看看,以前我也碰过

编译后的内存情况上面有给出,没有超出MCU给出的空间。所以觉得很奇怪的

出0入42汤圆

发表于 2014-8-7 10:52:41 | 显示全部楼层
你这是做静态分析,这个比较难。我说的是动态分析,事故出现后冻结现场,反向溯源。

出0入0汤圆

发表于 2014-8-7 15:22:37 | 显示全部楼层
看看你的局部变量吧,XDATA大过了1280变量就会别从写!
还有DATA也是!

出0入0汤圆

 楼主| 发表于 2014-8-8 07:35:53 | 显示全部楼层
zhouyan 发表于 2014-8-7 15:22
看看你的局部变量吧,XDATA大过了1280变量就会别从写!
还有DATA也是!

这两个参数都没有超出。

出0入0汤圆

发表于 2014-8-8 08:09:22 | 显示全部楼层
有时候很难找到问题的
我遇到一次,在EEPROM中增加了四个可调节的参数,所有参数一共大概60个左右的,都放在一个数组中,数组的体积什么的都改了,程序最后运行也没有问题了
但是有个一直设定为0的参数,在运行中会不定期出现非零的结果,注意是不定期,不是几天,是几个月出现一次,打开界面看这个参数,依然显示0,把他调整为1,然后再调整为0,系统即恢复正常,几个月后不定哪天,又出现这样问题。
在加这个参数之前,默认是0的,运行从来没有问题,但是加上去,还是设置为0,结果就这样莫名其妙的。加参数是因为一些特殊应用下可能设置为非零的数据,但是测试是在常规设备上面进行的,所以设定一直是0,后来直接又取消了这几个参数。
蹲点观察也没发现任何异常。

出0入0汤圆

 楼主| 发表于 2014-8-8 09:12:19 | 显示全部楼层
xiaobendan 发表于 2014-8-8 08:09
有时候很难找到问题的
我遇到一次,在EEPROM中增加了四个可调节的参数,所有参数一共大概60个左右的,都放 ...

我师父说 很有可能是指针的问题。就像我上面回复 albert_w 大师的地方那样子就很可能是导致我这个问题的地方  不定大小的二维数组 导致指针指向我这个被修改的变量,修改了其内部值。  修改办法给其固定大小空间。不知我师父这个解释是否正确

出0入0汤圆

发表于 2014-8-8 09:43:01 来自手机 | 显示全部楼层
小心被封id

出0入0汤圆

 楼主| 发表于 2014-8-8 11:44:06 | 显示全部楼层

这怎么讲?

出0入0汤圆

发表于 2014-8-8 11:52:32 | 显示全部楼层
huangyiting1990 发表于 2014-8-8 09:12
我师父说 很有可能是指针的问题。就像我上面回复 albert_w 大师的地方那样子就很可能是导致我这个问题的 ...

我是用了指针,但是这个参数如果非零,实际上的结果不是完全一样的,而是另外一个早就存在的位变量的改变产生的结果,但是这个结果却可以通过调整一次这个参数来复位,而这个参数无论怎么变,都应该不会影响到这个位变量的。
这个参数是用数组管理的,也不能随便挪地方。

出0入0汤圆

 楼主| 发表于 2014-8-8 11:56:46 | 显示全部楼层
xiaobendan 发表于 2014-8-8 11:52
我是用了指针,但是这个参数如果非零,实际上的结果不是完全一样的,而是另外一个早就存在的位变量的改变 ...

会不会是你的数组溢出?

出0入0汤圆

发表于 2014-8-8 13:17:23 | 显示全部楼层
麻将机的代码嘛?

出0入0汤圆

 楼主| 发表于 2014-8-8 13:27:18 | 显示全部楼层
yklstudent 发表于 2014-8-8 13:17
麻将机的代码嘛?

是的。被你发现了

出0入0汤圆

发表于 2014-8-8 13:42:13 | 显示全部楼层
看MAP文件,有可能是某些数组或变量越界

出0入0汤圆

发表于 2014-8-8 16:54:50 | 显示全部楼层

PP暴露了
请教下,怎么区分麻将牌正负面的?
听说麻将牌内有奥秘?

出0入0汤圆

 楼主| 发表于 2014-8-8 17:00:52 | 显示全部楼层
yklstudent 发表于 2014-8-8 16:54
PP暴露了
请教下,怎么区分麻将牌正负面的?
听说麻将牌内有奥秘?

磁铁的正负极

出0入0汤圆

发表于 2014-8-8 17:03:23 | 显示全部楼层

下次用磁铁试试

出0入0汤圆

发表于 2014-8-8 19:40:34 | 显示全部楼层
上次帮哥们修一个机器,看到了里面的工作过程,大开眼界啊!

出0入0汤圆

发表于 2014-8-8 20:10:36 | 显示全部楼层
位变量是在IDATA的,0x20.6
数组是在XDATA的,共计76个INT,增加的在【27】-【30】的位置。实际上从31开始后面全是0的。

出0入0汤圆

发表于 2014-8-8 20:28:46 | 显示全部楼层
很有可能是数组越界,可以设置多个断点,看看在程序运行到哪后,变量被改写,再在附近单步运行。注意在对数组操作的那些代码,有没有越界情况

出0入0汤圆

发表于 2014-8-8 20:42:28 | 显示全部楼层
albert_w 发表于 2014-8-7 10:01
你出这个问题, 因为你根本没搞明白c的指针机制。

多少奇怪的内存改写从来不是因为有人操作了这个变量 ...

请问单片机程序调试如何挂内存监视器?没找到相关资料啊。KEIL里有带么?

出0入0汤圆

 楼主| 发表于 2014-8-9 23:07:41 | 显示全部楼层
xiaobendan 发表于 2014-8-8 20:10
位变量是在IDATA的,0x20.6
数组是在XDATA的,共计76个INT,增加的在【27】-【30】的位置。实际上从31开始 ...

你好,不是很明白,能否详细一点? 或者留个联系方式聊聊?

出0入0汤圆

 楼主| 发表于 2014-8-9 23:08:24 | 显示全部楼层
grassroots 发表于 2014-8-8 20:28
很有可能是数组越界,可以设置多个断点,看看在程序运行到哪后,变量被改写,再在附近单步运行。注意在对数 ...

STC好像没有硬件仿真吧

出0入0汤圆

发表于 2014-8-11 11:02:23 | 显示全部楼层
huangyiting1990 发表于 2014-8-9 23:08
STC好像没有硬件仿真吧

软件仿真不行么?

出0入0汤圆

发表于 2014-8-11 12:20:04 | 显示全部楼层
huangyiting1990 发表于 2014-8-9 23:08
STC好像没有硬件仿真吧

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

本版积分规则

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

GMT+8, 2024-8-26 03:58

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

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