OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4543|回复: 12

全局变量初始化的一个奇怪问题

[复制链接]

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2018-4-12 16:01:39 | 显示全部楼层 |阅读模式
10金钱
   我用的KEIL编译器,  在A.c定义初始化了一个全局数组变量(加static也一样). 我只在A.c用,但是在程序运行过程中全局数组里面的值被改变了.    然后我将该全局数组变量定义初始化在另一个源文件B.c,然后在A.c引用,全局数组使用又正常了.             哪位能帮忙解答下这是什么问题呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-4-12 16:03:06 | 显示全部楼层
估计是有些地方溢出了,修改了全局变量
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-12 16:12:41 | 显示全部楼层
哆啦A萌 发表于 2018-4-12 16:03
估计是有些地方溢出了,修改了全局变量

溢出是针对栈的,堆不会存在溢出的说法。而且栈溢出的话,程序会进入hard fault中断,导致死机。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-12 16:15:16 | 显示全部楼层
不知道你说的“全局数组里面的值被改变了”是什么意思,不该改变吗?什么叫“又正常了”?变量本来就是可以改变的,只是说有时候你不知道为什么被改变了,失控了而已。全局资源控制好互斥访问就可以了。
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
 楼主| 发表于 2018-4-12 16:18:07 | 显示全部楼层
candylife9 发表于 2018-4-12 16:15
不知道你说的“全局数组里面的值被改变了”是什么意思,不该改变吗?什么叫“又正常了”?变量本来就是可以 ...

全局初始化全是0, 然后我5分钟之后才会操作这个全局变量,但是在1分钟多点的时候,这个全局数组里存的都是很大的数值了.     
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-12 16:24:51 | 显示全部楼层
pthread 发表于 2018-4-12 16:18
全局初始化全是0, 然后我5分钟之后才会操作这个全局变量,但是在1分钟多点的时候,这个全局数组里存的都是 ...

你是打印出来看的吗,怎么判断他是一个很大的值。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-12 16:28:16 | 显示全部楼层
不知道你的程序规模怎么样,你可以看一下程序的地址镜像分布,看看这个变量非配的地址是不是靠近栈,有可能是栈越界。
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-4-12 16:48:59 | 显示全部楼层
单步调试看看,数组值啥时候发生变化了。
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-4-12 16:49:16 | 显示全部楼层
不一定栈越界,只要有一个临近的数组,使用的时候下标越界就可能改变这个变量
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
发表于 2018-5-10 11:10:54 | 显示全部楼层
你再中断中肯定修改了这个全局变量!一个全局变量,你再中断中修改其值,在while(1)中又修改这个值,然后还拿来比较,就会出现你这样的情况。造成偶发bug
work is work!!!
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2018-5-10 11:19:24 | 显示全部楼层
设个条件断点,当他被修改的时候停下,就知道了
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2018-5-10 11:28:35 | 显示全部楼层
shikihane 发表于 2018-5-10 11:19
设个条件断点,当他被修改的时候停下,就知道了


请教:
条件断点,是平台自带的功能吗?MDK 还是 IAR ?
还是自己加语句才能实现?


回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2018-5-10 11:30:30 | 显示全部楼层
xuande 发表于 2018-5-10 11:28
请教:
条件断点,是平台自带的功能吗?MDK 还是 IAR ?
还是自己加语句才能实现?

要jlink 和 stlink支持。详情百度
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 04:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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