找回密码
 立即注册
查看: 95|回复: 10

定义的全局变量数值总是随意变,修改名称就好,什么原因

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-22 11:17:03

16

主题

25

回帖

186

积分

注册会员

积分
186
发表于 2025-4-22 11:17:03 | 显示全部楼层 |阅读模式
如下图,定义一个变量unsigned int  ADC_xishu,从map里看到的分配的地址如图是0049H,此时进行485通信,ADC_xishu 高字节数值随意变,如果在定义中增加xdata或者static,就不会随便变了。我又试了,在变量名称后面加后缀变成ADC_xishu1,如图片从map看地址变为0022H,此时变量数值也不会随便变更。究竟是什么原因,我定义了10个变量和3个数组,就这个变量数值总是变。
截图202504221112042739.jpg
截图202504221112159736.jpg
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-22 11:18:01 | 显示全部楼层
问题分析

在嵌入式系统中,全局变量的数值异常变化通常与内存管理、编译器优化、硬件访问冲突等因素有关。根据您描述的现象,以下是一些可能的原因及解决方案:

1. 内存地址冲突
您提到变量 ADCxishu 的地址为 0049H,而修改名称后地址变为 0022H,且问题得到解决。这表明可能存在内存地址冲突。具体原因可能包括:
内存重叠:0049H 地址可能被其他变量或硬件寄存器占用,导致数据被意外修改。
编译器分配策略:编译器在分配内存时可能没有考虑到某些硬件限制或内存映射规则,导致地址冲突。

2. 编译器优化
编译器在优化代码时可能会对变量进行重新分配或优化,导致变量的地址或值发生变化。具体原因可能包括:
未初始化的变量:如果变量未初始化,编译器可能会将其分配到不稳定的内存区域。
优化级别:高优化级别可能会导致编译器对变量进行不必要的优化,从而引发问题。

3. 硬件访问冲突
在嵌入式系统中,硬件访问冲突也可能导致变量值异常变化。具体原因可能包括:
DMA 或中断:DMA 或中断服务程序可能会意外修改内存中的数据。
硬件寄存器映射:某些硬件寄存器可能与变量地址重叠,导致数据被意外修改。

解决方案

1. 检查内存映射
确保变量的地址不会与其他变量或硬件寄存器冲突。可以通过以下方式进行检查:
查看内存映射文件:通过编译器生成的内存映射文件,检查变量的地址是否与其他变量或硬件寄存器重叠。
手动指定地址:如果可能,可以手动指定变量的地址,避免与其他变量或硬件寄存器冲突。

2. 使用 xdata 或 static 关键字
您提到使用 xdata 或 static 关键字后问题得到解决。这是因为:
xdata 关键字:将变量分配到外部数据存储器,避免与内部数据存储器冲突。
static 关键字:将变量的作用域限制在当前文件内,避免与其他文件的变量冲突。

3. 初始化变量
确保所有变量在使用前都被正确初始化,避免未初始化变量导致的随机值问题。

4. 调整编译器优化级别
尝试调整编译器的优化级别,避免过度优化导致的问题。可以尝试将优化级别设置为 -O0 或 -O1,观察问题是否得到解决。

5. 检查硬件访问
确保硬件访问不会意外修改内存中的数据。可以通过以下方式进行检查:
禁用 DMA 或中断:暂时禁用 DMA 或中断,观察问题是否得到解决。
检查硬件寄存器映射:确保硬件寄存器不会与变量地址重叠。

总结

您遇到的问题可能是由于内存地址冲突、编译器优化或硬件访问冲突导致的。通过检查内存映射、使用 xdata 或 static 关键字、初始化变量、调整编译器优化级别以及检查硬件访问,可以有效解决变量值异常变化的问题。建议您根据上述分析逐步排查,找到问题的根本原因并进行修复。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-22 11:17:03

16

主题

25

回帖

186

积分

注册会员

积分
186
发表于 2025-4-22 11:25:46 | 显示全部楼层
国芯人*** 发表于 2025-4-22 11:18
问题分析

在嵌入式系统中,全局变量的数值异常变化通常与内存管理、编译器优化、硬件访问冲突等因素有关。 ...

好的,我把这几种方法都用上吧,将变量名称改了,使用xdata,同时在每次用之前,从eeprom中读取数据赋值给他。
还有两个问题,我只从eeprom中读取数据,会影响产品寿命吗,咱们说的10万次是擦写十万次,只读取不只是10万次吧
第二个问题,访问xdata是不是效率慢些,如果我不要求效率,正常不要求随意变更的变量,是不是都定义为xdata好些,还是用一般的data,或者加static更好

点评

擦除10万次,读取不影响寿命  详情 回复 发表于 2025-4-22 12:48
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-22 11:25:57 | 显示全部楼层
可以上传 完整工程。看下是不是和哪个变量重叠了
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-22 11:17:03

16

主题

25

回帖

186

积分

注册会员

积分
186
发表于 2025-4-22 11:29:32 | 显示全部楼层
erci*** 发表于 2025-4-22 11:25
可以上传 完整工程。看下是不是和哪个变量重叠了

有可能是变量定义的问题,两个名称相似或者一样?

点评

一样会报错,相似也不影响。看你有没有给变量指定内存地址  详情 回复 发表于 2025-4-22 11:40
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-22 11:40:44 | 显示全部楼层
ain*** 发表于 2025-4-22 11:29
有可能是变量定义的问题,两个名称相似或者一样?

一样会报错,相似也不影响。看你有没有给变量指定内存地址
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-22 12:48:11 | 显示全部楼层
ain*** 发表于 2025-4-22 11:25
好的,我把这几种方法都用上吧,将变量名称改了,使用xdata,同时在每次用之前,从eeprom中读取数据赋值 ...

擦除10万次,读取不影响寿命
xdata访问较data慢,建议编译器设置为变量默认放data,不够用了再把大数组手动指定为xdata
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

积分
2540
发表于 2025-4-22 13:13:56 | 显示全部楼层
10W次是擦写次数,读取不限制
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-4-22 13:23:33 | 显示全部楼层
估计是临界代码访问的问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-4-22 15:10:35 | 显示全部楼层
如果为了只是为了不让变量的地址重复,可以加上NOOVERLAY,,资源够用的情况下,,
看看在map文件里面搜一搜,,和什么变量重复了,,,大概率中断里面调用子函数了,,或者用了函数指针,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:50 , Processed in 0.153417 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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