OpenEdv-开源电子网

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

单片机c异常情况求解,全局数据变化

[复制链接]

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
发表于 2022-12-19 15:44:03 | 显示全部楼层 |阅读模式
5金钱
我定义了一个全局数据如图1,只在圈住的地方用了,为啥打印出来的是3

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

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-19 16:08:02 | 显示全部楼层
代码量很大且加了boot的,这个是app的程序
回复

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2020-4-14
在线时间
67 小时
发表于 2022-12-19 16:09:27 | 显示全部楼层
改为其他数值,上传的会不会发生变化呢?
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6681
金钱
6681
注册时间
2017-4-12
在线时间
1254 小时
发表于 2022-12-19 22:10:50 | 显示全部楼层
先找代码有没改过,如果确定没有改过,看看是否有内存越界
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3329
金钱
3329
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-12-21 08:22:09 | 显示全部楼层
4楼正解。有可能被其他函数无意修改了。特别是用指针,不仔细检查即使修改了你也不知道。
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 09:49:06 | 显示全部楼层
c2007s 发表于 2022-12-21 08:22
4楼正解。有可能被其他函数无意修改了。特别是用指针,不仔细检查即使修改了你也不知道。

ctrl f查了,没其他地方调用
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 09:49:32 | 显示全部楼层
245925587 发表于 2022-12-19 22:10
先找代码有没改过,如果确定没有改过,看看是否有内存越界

怎么看内存有没有越界,以前试过栈溢出是卡死
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 09:51:07 | 显示全部楼层
杯酒问月 发表于 2022-12-19 16:09
改为其他数值,上传的会不会发生变化呢?

改成5变成6,绝对没有其他地方调用过
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 10:01:30 | 显示全部楼层
c2007s 发表于 2022-12-21 08:22
4楼正解。有可能被其他函数无意修改了。特别是用指针,不仔细检查即使修改了你也不知道。

我把这个数组重命名了也一样,输入2打印3
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-12-22 10:04:46 | 显示全部楼层
0孙悟空0 发表于 2022-12-22 10:01
我把这个数组重命名了也一样,输入2打印3

debug 看这个数组的值是在哪一步变的 可以先用断电粗筛一下 具体到在函数中变的 再单步看哪里改的
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 10:21:33 | 显示全部楼层
本帖最后由 0孙悟空0 于 2022-12-22 10:23 编辑
babyrabbit 发表于 2022-12-22 10:04
debug 看这个数组的值是在哪一步变的 可以先用断电粗筛一下 具体到在函数中变的 再单步看哪里改的

不存在变的过程,我一上电外设初始化完就打印也是3,明明我定义的事2,此外代码的zidata是3000多w,有影响吗
Program Size: Code=49672 RO-data=2112 RW-data=796 ZI-data=31705508  
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 10:22:32 | 显示全部楼层
babyrabbit 发表于 2022-12-22 10:04
debug 看这个数组的值是在哪一步变的 可以先用断电粗筛一下 具体到在函数中变的 再单步看哪里改的

我把那个数组放进函数内不用全局变量就是2,为啥当全局变量就是3
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-12-22 10:34:33 | 显示全部楼层
0孙悟空0 发表于 2022-12-22 10:21
不存在变的过程,我一上电外设初始化完就打印也是3,明明我定义的事2,此外代码的zidata是3000多w,有影 ...

ZIdata是存ram中的 这么大是设置了大数组或者用了外部ram吧 如果是外部ram实际没用到的话就没事 设置了大数组的话还是尽量避免下吧
你的变量放进函数内没问题 说明你这个函数里没有对这个局部变量进行过操作呗 全局变量别的函数也可以操作 所以让你先按函数粗筛一下 是在哪个函数或者中断里变的
至少进了main函数后第一个语句 这个变量应该是2吧
回复

使用道具 举报

9

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2016-9-5
在线时间
70 小时
发表于 2022-12-22 10:50:17 | 显示全部楼层
0孙悟空0 发表于 2022-12-22 09:49
怎么看内存有没有越界,以前试过栈溢出是卡死

可以通过变量读写的断点检查变量是否被其他地方修改了,设置为写入变量值就进断点,IAR里我试过,keil目前还没用过这个功能,网上找了一个方法你可以试试https://zhuanlan.zhihu.com/p/514827139,如果代码量不大的话也可以用楼上的方法找找看
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 11:00:05 | 显示全部楼层
babyrabbit 发表于 2022-12-22 10:34
ZIdata是存ram中的 这么大是设置了大数组或者用了外部ram吧 如果是外部ram实际没用到的话就没事 设置了大 ...

进入main里也是3,用的extern声明
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 11:03:04 | 显示全部楼层
猴子 发表于 2022-12-22 10:50
可以通过变量读写的断点检查变量是否被其他地方修改了,设置为写入变量值就进断点,IAR里我试过,keil目 ...

进入main就变成3了,明明定义的2
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 11:03:34 | 显示全部楼层
本帖最后由 0孙悟空0 于 2022-12-22 11:24 编辑
babyrabbit 发表于 2022-12-22 10:34
ZIdata是存ram中的 这么大是设置了大数组或者用了外部ram吧 如果是外部ram实际没用到的话就没事 设置了大 ...

用了ucosii所以特别大,有用外部ram,跟原子里申请内存那章一样
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 11:34:42 | 显示全部楼层
有很多种方法解决,但是我就是不知道为啥,比如给那个数组加个const,或者把前面声明的char*const   Statemsg[4] = {"断线", "混线", "未知", "正常"};变成const   char*Statemsg[4] = {"断线", "混线", "未知", "正常"};也行,无解
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 14:01:04 | 显示全部楼层
把boot去掉后也正常了
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 14:33:09 | 显示全部楼层
仿真发现那个值是从几个值最终跳到3
回复

使用道具 举报

17

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-4-28
在线时间
65 小时
 楼主| 发表于 2022-12-22 14:53:52 | 显示全部楼层
把boot里面的printf去掉也行了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 19:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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