查看: 1975|回复: 7

[求助] 函数还没有运行完,局部变量就释放了是什么情况

[复制链接]

该用户从未签到

7

主题

32

帖子

0

注册会员

Rank: 2

积分
77
最后登录
2016-6-15
发表于 2015-12-23 15:10:35 | 显示全部楼层 |阅读模式
在用IAR调试KL15的过程中出现的问题,函数并没有执行结束,定义的局部变量就已经被释放了,函数如下:
char SMBus_ReadTemp(unsigned char slaveAddress, unsigned char command)
{
                    char data;                                                  // Data storage (DataHataL)
           unsigned char Pec;                                                                 // PEC byte storage
           unsigned char DataL=0;                                                 // Low data byte storage
           unsigned char DataH=0;                                                 // High data byte storage
           unsigned char arr[6];                                                // Buffer for the sent bytes
           unsigned char PecReg;                                                // Calculated PEC byte storage

          SMBusReadRegisters( slaveAddress,command);
            DataL  = Tdata[0];
                DataH  = Tdata[1];
                Pec           = Tdata[2];
             arr[5] = slaveAddress<<1;                //
        arr[4] = command;                        //
        arr[3] = (slaveAddress<<1)+1;        //Load array arr
        arr[2] = DataL;                                //
        arr[1] = DataH;                                //
        arr[0] = 0;                                        //
        PecReg=PEC_Calculation(arr);//Calculate CRC

    while(PecReg != Pec);                //If received and calculated CRC are equal go out from do-while{}


        data = (DataH<<8) | DataL;        //data=DataHataL
    return data;
}

在执行到这一句的时候,把DATAH赋给了ARR[1],然后DataH就变成了unavailable了
执行前的状态:
执行前.jpg 执行后:
执行后.jpg

我知道答案 目前已有7人回答
回复

使用道具 举报

该用户从未签到

7

主题

32

帖子

0

注册会员

Rank: 2

积分
77
最后登录
2016-6-15
 楼主| 发表于 2015-12-23 16:15:23 | 显示全部楼层
char SMBus_ReadTemp(unsigned char slaveAddress, unsigned char command)
{
           unsigned char Pec;                                                                 // PEC byte storage
           unsigned char DataL;                                                 // Low data byte storage
           unsigned char DataH;                                                 // High data byte storage
           char data;                                                  // Data storage (DataHataL)
           unsigned char arr[6];                                                // Buffer for the sent bytes
           unsigned char PecReg;                                                // Calculated PEC byte storage

          SMBusReadRegisters( slaveAddress,command);
            DataL  = Tdata[0];
                DataH  = Tdata[1];
                Pec           = Tdata[2];
                data = (DataH<<8) | DataL;        //data=DataHataL
             arr[5] = slaveAddress<<1;                //
        arr[4] = command;                        //
        arr[3] = (slaveAddress<<1)+1;        //Load array arr
        arr[2] = DataL;                                //
        arr[1] = DataH;                                //
        arr[0] = 0;                                        //
        PecReg=PEC_Calculation(arr);//Calculate CRC
    while(PecReg != Pec);                //If received and calculated CRC are equal go out from do-while{}
    return data;
}
把DATA赋值放到前面,单步执行的时候直接跳过了这一行,并且DATA也只是低8位,高位依然丢失了
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-12-23 17:08:24 | 显示全部楼层
看看你优化等级选的是多少?
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

32

帖子

0

注册会员

Rank: 2

积分
77
最后登录
2016-6-15
 楼主| 发表于 2015-12-23 17:48:37 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-12-23 17:08
看看你优化等级选的是多少?

用PE生成的工程,都是默认的,没有设置
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

32

帖子

0

注册会员

Rank: 2

积分
77
最后登录
2016-6-15
 楼主| 发表于 2015-12-24 08:50:16 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-12-23 17:08
看看你优化等级选的是多少?

请问您说的优化等级在哪儿看
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2016-12-22 14:33
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    34

    主题

    512

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1378
    最后登录
    1970-1-1
    发表于 2015-12-24 09:18:02 | 显示全部楼层
    这是由于IAR的优化引起的,对于定义、赋了值却没有再使用的变量,IAR优化时不为其分配内存,此时watch就为unavailable,到option中设置编译器的优化级别为none就可以了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-24 11:12:07 | 显示全部楼层
    楼主,你现在是读取数据不能读准确吗?
    看你代码,应该是编译器认为你数据已经用完,就可以释放了。
    如果你不想释放,你可以在变量定义之前加一个volatile试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-12-24 12:59:02 | 显示全部楼层
    学习一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-24 02:44 , Processed in 0.106449 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表