请教大家,关于变量存储空间的设定
单片机是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修饰,应该不会涉及到动态内存的问题,其他的变量不会在程序运行中自己改变吧?按说我用到的变量也不多,请教大家,如何避免这个问题?这是编译成功时的提示,谢谢。程序编译设定和下载都是用的默认值。文字描述实在太长~,
可以简化为描述复现步骤,
上传完整代码工程,
和贴一个问题函数代码截图和问题现象截图。
大致理解为data变量打印出来和赋值初值不一致?
在函数内使用之前手动初始化赋值下。
建议看下这个贴在能避免踩不少坑:
新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读! - 老鸟反刍/吐槽,新手乐园,毕业设计 国芯人工智能技术交流网站 - AI32位8051交流社区
问题解决了,是我的一个设置错误,在结构体
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]