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

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

3

主题

6

帖子

70

积分

注册会员

Rank: 2

积分
70
跳转到指定楼层
楼主
发表于 2017-3-31 15:35:18 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
汉枫LPB120模块
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));
    }

3

主题

6

帖子

70

积分

注册会员

Rank: 2

积分
70
沙发
 楼主| 发表于 2017-4-5 11:27:42 | 显示全部楼层
我主楼上贴的代码,就是网站上生成的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号 )

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