This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

变量在声明时已经初始化为0,仿真是没问题,烧录后是随机数



各位好,本人新手,在使用28035的过程一个问题反复出现。全局变量或者数组在声明时已经初始化为0,仿真时工作正常。烧录后发现程序不对,把变量一个一个用串口发上来发现已经初始化的变量竟然是随机数。如果另外在MAIN函数中重新初始化就正常了,为什么声明时初始化就不对?大家有没有遇到过类似问题。请问什么原因会导致这种情况发生。

  • 可以把您的代码贴上来看下。

  • 这是整个工程中的一个子函数,功能是读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];
       }
            }
        }
  • 您好,这部分看着是没啥问题,不知道是否有进去这段代码,串口发出来的随机数有变化吗?

  • 串口发上来的是一个不变的数。子函数中定义的static变量在定义时已经初始化为0,仿真时正确,烧录后变成随机数。我只好把这个static变量改成全局变量,在main函数中重新赋值为0。莫名其妙。请问子函数中定义的static变量在定义时始化为0这种方式有问题吗。如果没问题我再自己想想。我新手不熟悉,防止没抓住问题点浪费您的时间,谢谢。

  • 局部变量可以在定义时初始化,另外是不是开了优化,加 volatile试下。