关于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: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: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:28
/**
* @brief 系统毫秒计时维护函数,毫秒自增,溢出归零
另外定时上报是不是也应该更新一下,lastReportTime呢? 我主楼上贴的代码,就是网站上生成的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]