TI中文支持网
TI专业的中文技术问题搜集分享网站

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

各位好,本人新手,在使用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试下。

赞(0)
未经允许不得转载:TI中文支持网 » 变量在声明时已经初始化为0,仿真是没问题,烧录后是随机数
分享到: 更多 (0)