各位好,本人新手,在使用28035的过程一个问题反复出现。全局变量或者数组在声明时已经初始化为0,仿真时工作正常。烧录后发现程序不对,把变量一个一个用串口发上来发现已经初始化的变量竟然是随机数。如果另外在MAIN函数中重新初始化就正常了,为什么声明时初始化就不对?大家有没有遇到过类似问题。请问什么原因会导致这种情况发生。
Seven Han:
可以把您的代码贴上来看下。
各位好,本人新手,在使用28035的过程一个问题反复出现。全局变量或者数组在声明时已经初始化为0,仿真时工作正常。烧录后发现程序不对,把变量一个一个用串口发上来发现已经初始化的变量竟然是随机数。如果另外在MAIN函数中重新初始化就正常了,为什么声明时初始化就不对?大家有没有遇到过类似问题。请问什么原因会导致这种情况发生。
user4675816:
回复 Seven Han:
这是整个工程中的一个子函数,功能是读EEPROM,出问题的变量是s_uwFrameCnt ,在声明时已经初始化为0,但是 if (s_uwFrameCnt < tPackage.uwFrameSum)一直无法进入。串口读tPackage.uwFrameSum等于2。s_uwFrameCnt是一个随机的很大 的数,这个变量没有在其他地方被使用。
INT16U SCLEepromReadORVerify(T_EEPROMFrame tPackage,INT16U uwType){
INT16U i = 0; // 循环计数器 INT16U uwChip = 0; // 片选 INT16U uwRom = 0; // 片内ROM地址 INT16U uwLength = 0; // 数据长度 INT16U *uwAddr = NULL; // 待存储数据地址 INT16U uwStatus = 0; // 状态 INT16U uwTemp = 0; INT16U uwI2CReadData[7] = {0, 0, 0, 0, 0, 0, 0}; static INT16U s_uwFrameCnt = 0; if (s_uwFrameCnt < tPackage.uwFrameSum) { uwLength = EEPROM_FRAME_LENGTH; // 中间帧,数据长度固定 uwStatus = EEPROM_FRAME_BUSY; // 写操作 } else // 结束帧 { uwLength = tPackage.uwByteNum; // 结束帧,数据长度=输入参数 uwStatus = EEPROM_FRAME_END; } // 计算待存储数据地址,ROM写入起始地址,输入片选地址 uwAddr = tPackage.pBegin + (s_uwFrameCnt * EEPROM_FRAME_LENGTH); uwChip = tPackage.uwEEPROMAddr; uwRom = tPackage.uwROMStart + (s_uwFrameCnt * (EEPROM_FRAME_LENGTH) * 2); // 获取读值 uwTemp = HalI2cReadArray(uwLength, &uwI2CReadData[0]);
if ((uwTemp == I2C_RECV_NULL)&&(uwLength>0)) { // 启动读取 HalI2cReadStart(uwChip, uwRom, uwLength * 2); I2cStop = 0; }
// 读取成功 if (uwTemp == I2C_RECV_SUCCESS) { s_uwFrameCnt++; // 帧读取结束,清除帧计数器 if (uwStatus == EEPROM_FRAME_END) { s_uwFrameCnt = 0; uwStatus = EEPROM_FRAME_IDLE; } for (i = 0; i < uwLength; i++) { // 读校验 if (EEPROM_VERIFY == uwType) {
if (*uwAddr != uwI2CReadData[i]) { uwStatus = EEPROM_FRAME_ERROR; s_uwFrameCnt = 0; break; } uwAddr++; } // 读数据 else if(EEPROM_READ == uwType) { *(uwAddr + i) = uwI2CReadData[i]; } } }
各位好,本人新手,在使用28035的过程一个问题反复出现。全局变量或者数组在声明时已经初始化为0,仿真时工作正常。烧录后发现程序不对,把变量一个一个用串口发上来发现已经初始化的变量竟然是随机数。如果另外在MAIN函数中重新初始化就正常了,为什么声明时初始化就不对?大家有没有遇到过类似问题。请问什么原因会导致这种情况发生。
Seven Han:
回复 user4675816:
您好,这部分看着是没啥问题,不知道是否有进去这段代码,串口发出来的随机数有变化吗?
各位好,本人新手,在使用28035的过程一个问题反复出现。全局变量或者数组在声明时已经初始化为0,仿真时工作正常。烧录后发现程序不对,把变量一个一个用串口发上来发现已经初始化的变量竟然是随机数。如果另外在MAIN函数中重新初始化就正常了,为什么声明时初始化就不对?大家有没有遇到过类似问题。请问什么原因会导致这种情况发生。
user4675816:
回复 Seven Han:
串口发上来的是一个不变的数。子函数中定义的static变量在定义时已经初始化为0,仿真时正确,烧录后变成随机数。我只好把这个static变量改成全局变量,在main函数中重新赋值为0。莫名其妙。请问子函数中定义的static变量在定义时始化为0这种方式有问题吗。如果没问题我再自己想想。我新手不熟悉,防止没抓住问题点浪费您的时间,谢谢。
各位好,本人新手,在使用28035的过程一个问题反复出现。全局变量或者数组在声明时已经初始化为0,仿真时工作正常。烧录后发现程序不对,把变量一个一个用串口发上来发现已经初始化的变量竟然是随机数。如果另外在MAIN函数中重新初始化就正常了,为什么声明时初始化就不对?大家有没有遇到过类似问题。请问什么原因会导致这种情况发生。
Seven Han:
回复 user4675816:
局部变量可以在定义时初始化,另外是不是开了优化,加 volatile试下。