找回密码
 立即注册
查看: 52|回复: 3

请教大家,关于变量存储空间的设定

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 3 天前 | 显示全部楼层 |阅读模式
单片机是STC32G12K128,编译器是Keil C 251,程序开始定义了一些变量(包括位变量)和常量,变量有部分是用xdata修饰,放到01:0000H到01:1FFFH区域,其余的没有存储空间的修饰,比如 u8 i=0x99;希望由编译器分配空间。然后是一些函数的声明(包括使用变量i的函数,比如命名为i_data()),然后就是main函数,main函数开始后,在大循环之前,初始化了串口、定时器等,这些函数都没有调用i_data(),也没有用到变量i,i_data()在大循环中才用到。初始化串口、定时器完成后,在大循环之前,我把变量i通过串口送到V-95Z的CDC/HID-串口助手界面下,i变成了0x26,难道是前面变量定义时u8 i=0x99的初始值没有起作用吗?后经网友指导,定义变量i时用xdata修饰,即u8 xdata i=0x99后,可以了,初始化串口、定时器完成后,通过串口,把变量i送到了串口助手界面下,显示0x99.这只是程序中的一个变量,我担心别的变量也出现这个问题,考虑到32G12K128的xdata足够大,就把除了位变量的变量都用xdata修饰了,结果又不行了,然后我只把这个变量用edata修饰,又可以了,考虑到单片机的edata也不小,我把除了位变量的变量都用edata修饰,结果又不行了,然后我把这个变量,单独用data或者xdata修饰,都可以,我是Keil C小白,还没有用到指针,只是用到了几个固定大小的数组,和一些全局、局部变量,有几个局部变量用static修饰,应该不会涉及到动态内存的问题,其他的变量不会在程序运行中自己改变吧?按说我用到的变量也不多,请教大家,如何避免这个问题?这是编译成功时的提示,谢谢。程序编译设定和下载都是用的默认值。
无标题.png
回复

使用道具 举报 送花

3

主题

247

回帖

-795

积分

等待验证会员

积分
-795
发表于 3 天前 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 3 天前 | 显示全部楼层
文字描述实在太长~,
可以简化为描述复现步骤,
上传完整代码工程,
和贴一个问题函数代码截图和问题现象截图。


大致理解为data变量打印出来和赋值初值不一致?
在函数内使用之前手动初始化赋值下。



建议看下这个贴在能避免踩不少坑:
新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读! - 老鸟反刍/吐槽,新手乐园,毕业设计 国芯人工智能技术交流网站 - AI32位8051交流社区


截图202507281552536331.jpg



三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 昨天 15:41 | 显示全部楼层
问题解决了,是我的一个设置错误,在结构体
typedef struct
{
        u8        DLC:4;          //数据长度, bit0~bit3
        u8        :2;             //空数据, bit4~bit5
        u8        RTR:1;          //帧类型, bit6
        u8        FF:1;           //帧格式, bit7
        u32        ID;             //CAN ID
        u8        DataBuffer[2];  //数据缓存
}CAN_DataDef;
定义时,u8        DataBuffer[2]; 定义CAN的数据长度,STC32G有2个CAN口,我暂时只用了CAN1,数据长度是2,所以这里我设为了2,
CAN2暂时还没有用,但是将来用的时候,数据长度是8,我忽视了。CAN2的数据变量也用CAN_DataDef声明了,8个数据变量也赋了初值,这样算是内存溢出了。
在定义 u8        DataBuffer[2];  //数据缓存时,DataBuffer[2]改为DataBuffer[8]即可。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-31 23:05 , Processed in 0.113303 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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