很奇怪的问题程序问题。
本帖最后由 huangyiting1990 于 2014-8-7 09:55 编辑我的现在写的一个程序里面有个问题,有个变量的值会在程序运行中突然被篡改掉,我觉得是我程序问题,结果我先给变量设定一个初值(非0),把程序里面所有修改变量值的语句都屏蔽掉,结果运行的时候也还是被篡改成0了。 变量空间超了?我现在只是把这个变量改到另外一个.c文件里面定义,问题就没发现了(其他没改)。很奇怪,不知道什么问题。
修改原因:增加MCU型号 增加设置参数描述 不太可能啊,一定是有某个地方修改了它的值。最好上些代码,表达清楚。 指针?字节对齐? 挂上内存修改断点, 变量监视断点之类的. 别处内存越界, 指针乱了 把变量名改一个。 albert_w 发表于 2014-8-7 09:23
挂上内存修改断点, 变量监视断点之类的. 别处内存越界, 指针乱了
已增加,看是否你需要的? 会改变的变量名称是 Jishu_Fangshi 初始化等于1 。我测试的时候有把除定义变量和此处检测的地方其他所有用到Jishu_Fangshi这个变量的地方全删除了,但这个变量的实质还是会变成0 cqb98 发表于 2014-8-7 09:54
把变量名改一个。
该变量名称无效,倒是把定义的位置换一个.C文件 解决了。但心里不踏实。不知道还有没其他变量会出现这个情况 huangyiting1990 发表于 2014-8-7 09:59
该变量名称无效,倒是把定义的位置换一个.C文件 解决了。但心里不踏实。不知道还有没其他变量会出现这个 ...
你出这个问题, 因为你根本没搞明白c的指针机制。
多少奇怪的内存改写从来不是因为有人操作了这个变量。
你操作指针,指针没初始化,导致无意中指向你的变量,把你的变量改了。
挂上内存监视,一改写就停下来了。查看下调用栈就知道哪里出问题了。 如楼上所说! 可能是操作其它数组越界 或 其它变量指针操作到此变量地址! AVR_PIC 发表于 2014-8-7 10:10
如楼上所说! 可能是操作其它数组越界 或 其它变量指针操作到此变量地址! ...
很有可能,我对指针不熟,所以程序里面没有使用的指针变量。数组越界可能性最大。如果说数组越界的话,不知道怎么去确认。我觉得这个地方的数组定义除了问题。 albert_w 发表于 2014-8-7 10:01
你出这个问题, 因为你根本没搞明白c的指针机制。
多少奇怪的内存改写从来不是因为有人操作了这个变量 ...
再请教一下Keil 怎么查看内存越界?我发现一个地方可能是导致这个问题的。我其实是想定义一个不定长度的二维数组。 编译完后的内存,看看,以前我也碰过 zhouyan 发表于 2014-8-7 10:32
编译完后的内存,看看,以前我也碰过
编译后的内存情况上面有给出,没有超出MCU给出的空间。所以觉得很奇怪的{:lol:} 你这是做静态分析,这个比较难。我说的是动态分析,事故出现后冻结现场,反向溯源。 看看你的局部变量吧,XDATA大过了1280变量就会别从写!
还有DATA也是! zhouyan 发表于 2014-8-7 15:22
看看你的局部变量吧,XDATA大过了1280变量就会别从写!
还有DATA也是!
这两个参数都没有超出。 有时候很难找到问题的
我遇到一次,在EEPROM中增加了四个可调节的参数,所有参数一共大概60个左右的,都放在一个数组中,数组的体积什么的都改了,程序最后运行也没有问题了
但是有个一直设定为0的参数,在运行中会不定期出现非零的结果,注意是不定期,不是几天,是几个月出现一次,打开界面看这个参数,依然显示0,把他调整为1,然后再调整为0,系统即恢复正常,几个月后不定哪天,又出现这样问题。
在加这个参数之前,默认是0的,运行从来没有问题,但是加上去,还是设置为0,结果就这样莫名其妙的。加参数是因为一些特殊应用下可能设置为非零的数据,但是测试是在常规设备上面进行的,所以设定一直是0,后来直接又取消了这几个参数。
蹲点观察也没发现任何异常。 xiaobendan 发表于 2014-8-8 08:09
有时候很难找到问题的
我遇到一次,在EEPROM中增加了四个可调节的参数,所有参数一共大概60个左右的,都放 ...
我师父说 很有可能是指针的问题。就像我上面回复 albert_w 大师的地方那样子就很可能是导致我这个问题的地方不定大小的二维数组 导致指针指向我这个被修改的变量,修改了其内部值。修改办法给其固定大小空间。不知我师父这个解释是否正确 小心被封id ly674496415 发表于 2014-8-8 09:43
小心被封id
这怎么讲? huangyiting1990 发表于 2014-8-8 09:12
我师父说 很有可能是指针的问题。就像我上面回复 albert_w 大师的地方那样子就很可能是导致我这个问题的 ...
我是用了指针,但是这个参数如果非零,实际上的结果不是完全一样的,而是另外一个早就存在的位变量的改变产生的结果,但是这个结果却可以通过调整一次这个参数来复位,而这个参数无论怎么变,都应该不会影响到这个位变量的。
这个参数是用数组管理的,也不能随便挪地方。 xiaobendan 发表于 2014-8-8 11:52
我是用了指针,但是这个参数如果非零,实际上的结果不是完全一样的,而是另外一个早就存在的位变量的改变 ...
会不会是你的数组溢出? 麻将机的代码嘛? yklstudent 发表于 2014-8-8 13:17
麻将机的代码嘛?
是的。被你发现了{:lol:} 看MAP文件,有可能是某些数组或变量越界 huangyiting1990 发表于 2014-8-8 13:27
是的。被你发现了
PP暴露了
请教下,怎么区分麻将牌正负面的?
听说麻将牌内有奥秘? yklstudent 发表于 2014-8-8 16:54
PP暴露了
请教下,怎么区分麻将牌正负面的?
听说麻将牌内有奥秘?
磁铁的正负极{:lol:} huangyiting1990 发表于 2014-8-8 17:00
磁铁的正负极
下次用磁铁试试{:victory:} 上次帮哥们修一个机器,看到了里面的工作过程,大开眼界啊! 位变量是在IDATA的,0x20.6
数组是在XDATA的,共计76个INT,增加的在【27】-【30】的位置。实际上从31开始后面全是0的。 很有可能是数组越界,可以设置多个断点,看看在程序运行到哪后,变量被改写,再在附近单步运行。注意在对数组操作的那些代码,有没有越界情况 albert_w 发表于 2014-8-7 10:01
你出这个问题, 因为你根本没搞明白c的指针机制。
多少奇怪的内存改写从来不是因为有人操作了这个变量 ...
请问单片机程序调试如何挂内存监视器?没找到相关资料啊。KEIL里有带么? xiaobendan 发表于 2014-8-8 20:10
位变量是在IDATA的,0x20.6
数组是在XDATA的,共计76个INT,增加的在【27】-【30】的位置。实际上从31开始 ...
你好,不是很明白,能否详细一点? 或者留个联系方式聊聊? grassroots 发表于 2014-8-8 20:28
很有可能是数组越界,可以设置多个断点,看看在程序运行到哪后,变量被改写,再在附近单步运行。注意在对数 ...
STC好像没有硬件仿真吧 huangyiting1990 发表于 2014-8-9 23:08
STC好像没有硬件仿真吧
软件仿真不行么? huangyiting1990 发表于 2014-8-9 23:08
STC好像没有硬件仿真吧
IAP15F2K61S2有硬件仿真
页:
[1]