newlined 发表于 2025-7-28 15:19:25

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

单片机是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修饰,应该不会涉及到动态内存的问题,其他的变量不会在程序运行中自己改变吧?按说我用到的变量也不多,请教大家,如何避免这个问题?这是编译成功时的提示,谢谢。程序编译设定和下载都是用的默认值。

国芯人工智能 发表于 2025-7-28 15:23:00

ercircle 发表于 2025-7-28 16:01:27

文字描述实在太长~,
可以简化为描述复现步骤,
上传完整代码工程,
和贴一个问题函数代码截图和问题现象截图。


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



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






newlined 发表于 2025-7-30 15:41:15

问题解决了,是我的一个设置错误,在结构体
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;//数据缓存
}CAN_DataDef;
定义时,u8      DataBuffer; 定义CAN的数据长度,STC32G有2个CAN口,我暂时只用了CAN1,数据长度是2,所以这里我设为了2,
CAN2暂时还没有用,但是将来用的时候,数据长度是8,我忽视了。CAN2的数据变量也用CAN_DataDef声明了,8个数据变量也赋了初值,这样算是内存溢出了。
在定义 u8      DataBuffer;//数据缓存时,DataBuffer改为DataBuffer即可。
页: [1]
查看完整版本: 请教大家,关于变量存储空间的设定