收藏官网首页
查看: 12930|回复: 4

[经验分享] 关于MCU开发生成的代码中上报机制有疑问

3

主题

6

帖子

70

积分

注册会员

Rank: 2

积分
70
跳转到指定楼层
楼主
发表于 2017-3-31 15:35:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
gizwits_protocol.c中的gizDevReportPolicy()处理函数,其中的“定时上报机制”会出现如下两种问题
1、如果此函数的调用间隔时间小于1ms,会上报多次。
2、如果此函数的调用间隔时间大于1ms,有可能会出现定时漏报。因为有可能在前一次判断是毫秒计数值为599999,而下一次轮询到判断是毫秒计数值为600001。
源代码:
    /** 定时上报机制 **/
    if(0 == (gizGetTimerCount() % (600000)))
    {
        GIZWITS_LOG("Info: 600S report data\n");
        if(0 == gizDataPoints2ReportData(currentData,&gizwitsProtocol.reportData.devStatus))
        {
                gizReportData(ACTION_REPORT_DEV_STATUS, (uint8_t *)&gizwitsProtocol.reportData.devStatus, sizeof(devStatus_t));
        }
        memcpy((uint8_t *)&gizwitsProtocol.gizLastDataPoint, (uint8_t *)currentData, sizeof(dataPoint_t));
    }

0

主题

7

帖子

48

积分

新手上路

Rank: 1

积分
48
沙发
发表于 2017-4-3 19:19:11 | 只看该作者
本帖最后由 大灰狼 于 2017-4-3 19:26 编辑

这个地方确实有些问题吧:1、是有可能楼主描述的存在这种问题的。
2、变化上报也存在问题吧...
  1.     if(last->valuetemperature_sta != cur->valuetemperature_sta)
  2.     {
  3.         if(gizGetTimerCount()-lastReportTime >= REPORT_TIME_MAX)
  4.         {
  5.             GIZWITS_LOG("valuetemperature_sta Changed\n");
  6.             lastReportTime = gizGetTimerCount();
  7.             ret = 1;
  8.         }
  9.     }
复制代码

0

主题

7

帖子

48

积分

新手上路

Rank: 1

积分
48
板凳
发表于 2017-4-3 19:28:46 | 只看该作者
大灰狼 发表于 2017-4-3 19:19
这个地方确实有些问题吧:1、是有可能楼主描述的存在这种问题的。
2、变化上报也存在问题吧... ...

/**
* @brief 系统毫秒计时维护函数,毫秒自增,溢出归零

* @param none
* @return none
*/
static uint32_t timerMsCount;
void gizTimerMs(void)
{
    timerMsCount++;
}

/**
* @brief 读取系统时间毫秒计时数

* @param none
* @return 系统时间毫秒数
*/
uint32_t gizGetTimerCount(void)
{
    return timerMsCount;
}
timerMsCount溢出归零后,中间的IF就不成立,后面就不会变化上报了。算了一下时间,大概要两个月左右的时间才会出现。

0

主题

7

帖子

48

积分

新手上路

Rank: 1

积分
48
地板
发表于 2017-4-3 19:30:23 | 只看该作者
大灰狼 发表于 2017-4-3 19:28
/**
* @brief 系统毫秒计时维护函数,毫秒自增,溢出归零

另外定时上报是不是也应该更新一下,lastReportTime呢?

3

主题

6

帖子

70

积分

注册会员

Rank: 2

积分
70
5#
 楼主| 发表于 2017-4-5 11:27:42 | 只看该作者
免费使用STM32、APP自动代码生成工具
我主楼上贴的代码,就是网站上生成的MCU代码,我实际测试中出现过问题。我改成这样就好了。
  1.     /** 定时上报机制 **/
  2.     if((gizGetTimerCount() - lastFixedReportTime) >= 600000)
  3.     {
  4.         lastFixedReportTime = gizGetTimerCount();
  5.         GIZWITS_LOG("Info: 600S report data\n");
  6.         if(0 == gizDataPoints2ReportData(currentData,&gizwitsProtocol.reportData.devStatus))
  7.         {
  8.                 gizReportData(ACTION_REPORT_DEV_STATUS, (uint8_t *)&gizwitsProtocol.reportData.devStatus, sizeof(devStatus_t));
  9.         }
  10.         memcpy((uint8_t *)&gizwitsProtocol.gizLastDataPoint, (uint8_t *)currentData, sizeof(dataPoint_t));
  11.     }
复制代码

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

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

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