砍竹的人 发表于 2017-3-31 15:35:18

关于MCU开发生成的代码中上报机制有疑问

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));
    }

大灰狼 发表于 2017-4-3 19:19:11

本帖最后由 大灰狼 于 2017-4-3 19:26 编辑

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

大灰狼 发表于 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就不成立,后面就不会变化上报了。算了一下时间,大概要两个月左右的时间才会出现。

大灰狼 发表于 2017-4-3 19:30:23

大灰狼 发表于 2017-4-3 19:28
/**
* @brief 系统毫秒计时维护函数,毫秒自增,溢出归零



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

砍竹的人 发表于 2017-4-5 11:27:42

我主楼上贴的代码,就是网站上生成的MCU代码,我实际测试中出现过问题。我改成这样就好了。
    /** 定时上报机制 **/
    if((gizGetTimerCount() - lastFixedReportTime) >= 600000)
    {
      lastFixedReportTime = gizGetTimerCount();
      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));
    }
页: [1]
查看完整版本: 关于MCU开发生成的代码中上报机制有疑问