OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1938|回复: 4

萌新调用一个函数之后,程序无法运行,一直卡在那里

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-11-15
在线时间
11 小时
发表于 2018-1-22 15:00:48 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 JWdouble 于 2018-1-22 17:45 编辑

INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
    INT32S flag;
    INT16U val;
        
    flag = SHT2X_MeasureHM(TEMP, &val);
    if (flag == ERR_TRUE)
    {
     
        val &= ~0x0003;  //
        *pTmp = (INT16S)((-46.85+(float)val*175.72/65536)*10);

    }
    else
    {
        return ERR_FALSE;  
    }

    flag = SHT2X_MeasureHM(HUMIDITY, &val);
    if (flag == ERR_TRUE)
    {
        
        val &= ~0x0003;  //
        *pRH = (INT16S)((-6.0+(float)val*125/65536)*10);
    }
    else
    {
        return ERR_FALSE;  
    }

    return ERR_TRUE;
}

这是函数主体


        SHT2X_Read(&tmp,&rh);
        TMP=tmp;
        RH=rh;            printf("temp:%5.1fC\n temp:%5.1fC\n humi:%5.1f%%\n",TMP,RH)
这是我的调用。

编译是没有问题的,但是仿真的时候,会一直卡在这里。
如果隐掉调用程序正常运行
检查了一下,是没有死循环的

新手求帮忙
补充:
INT32S SHT2X_MeasureHM(SHT2X_MEASURE_TYPE MeaType, INT16U *pVal)
{
    INT32S flag;
    INT8U pBuf[3];
    INT16_TypeDef i16;
    //INT8U

    if (MeaType == TEMP)
    {
        flag = I2C_Read(I2C1_ID, I2C_ADR_W, TRIG_T_MEASURE_HM, pBuf, 3);
    }
    else
    {
        flag = I2C_Read(I2C1_ID, I2C_ADR_W, TRIG_RH_MEASURE_HM, pBuf, 3);
    }

    if (flag == ERR_TRUE)
    {
         flag = SHT2X_CheckCrc(pBuf, 2, pBuf[2]);
         if (flag == ERR_TRUE)
         {
             i16.chars.c0 = pBuf[1];  
             i16.chars.c1 = pBuf[0];               
             *pVal = i16.d;
         }
    }   
    return flag;      
}





总结:感谢大佬给我解决问题的思路
INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
INT16U val;
SHT2X_MeasureHM(TEMP, &val);
return 0;
}这个函数就无法正常退出,逐步排查发现了问题出在SHT2X_MeasureHM使用的是库函数i2c读写,导致卡死bug。
while(!I2C_CheckEvent(pI2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  卡死点







最佳答案

查看完整内容[请看2#楼]

如果程序是这样,可能导致卡死的原因有两个: ①死循环 ②滥用指针引起的跑飞 请再次确认SHT2X_MeasureHM函数是否能够正常运行。 并确认*pTmp、*pRH是否指向了正确的地址。 建议调试策略 [mw_shl_code=c,true]INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH) { *pTmp=12345;//随便一个数字 *pRH=54321;//随便一个数字 return 0; }[/mw_shl_code] 是否能正常退出。 [mw_shl_code=c,true]INT32S SHT2X_Read(IN ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-22 15:00:49 | 显示全部楼层
如果程序是这样,可能导致卡死的原因有两个:

①死循环
②滥用指针引起的跑飞

请再次确认SHT2X_MeasureHM函数是否能够正常运行。
并确认*pTmp、*pRH是否指向了正确的地址。

建议调试策略
[mw_shl_code=c,true]INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
*pTmp=12345;//随便一个数字
*pRH=54321;//随便一个数字
return 0;
}[/mw_shl_code]
是否能正常退出。


[mw_shl_code=c,true]INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
INT16U val;
SHT2X_MeasureHM(TEMP, &val);
return 0;
}[/mw_shl_code]
是否能正常退出。

[mw_shl_code=c,true]
INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
INT16U val;
SHT2X_MeasureHM(HUMIDITY, &val);
return 0;
}[/mw_shl_code]
是否能正常退出。


如此,应当能找到问题。

回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-22 15:20:49 | 显示全部楼层
你的图片真的是让人很着急。
想复制也复制不走。
问问题首先要做一个会提问的人。

回答问题。

你说的卡住,可能的原因有很多。
比如,SHT2X_MeasureHM这个函数本来就是一个死循环。

而且你是否发现了,你这个函数,虽然定义为INT32S类型,但是没有编写返回值(if(1)后面的else永远不会被指执行。

请努力检查更正上述两个问题。
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-11-15
在线时间
11 小时
 楼主| 发表于 2018-1-22 15:49:49 | 显示全部楼层
a496298685 发表于 2018-1-22 15:20
你的图片真的是让人很着急。
想复制也复制不走。
问问题首先要做一个会提问的人。

大佬,再帮忙看看啊,编辑完了
if是在我找问题的时候强制改成1
我只想知道可能会出错的地方。
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-22 18:02:26 | 显示全部楼层
最后发现问题出在了哪里?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 04:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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