我使用difftime的c函数有时返回65535
我有一个函数,它使用difftime来检测自通信心跳停止以来的时间(以秒为单位)。此函数可以每50毫秒运行一次。除了偶尔返回65535外,该函数似乎正常工作。我可以将执行时间减少到每秒一次,因为difftime的返回时间仅以秒为单位。但我不知道它是否能解决这个问题。这是因为我没有正确地将difftime返回从double返回uint16\U t造成的问题吗 这个程序在ubuntu 64位机器上运行 请帮忙。谢谢我使用difftime的c函数有时返回65535,c,C,我有一个函数,它使用difftime来检测自通信心跳停止以来的时间(以秒为单位)。此函数可以每50毫秒运行一次。除了偶尔返回65535外,该函数似乎正常工作。我可以将执行时间减少到每秒一次,因为difftime的返回时间仅以秒为单位。但我不知道它是否能解决这个问题。这是因为我没有正确地将difftime返回从double返回uint16\U t造成的问题吗 这个程序在ubuntu 64位机器上运行 请帮忙。谢谢 uint16_t commlost(uint16_t heartbeat_read_
uint16_t commlost(uint16_t heartbeat_read_cur)
{
time_t current_time;
static time_t previous_time;
static uint16_t commlost_secs_cur = 0;
static uint16_t commlost_secs_prev = 0;
static uint16_t heartbeat_read_prev = 0;
static bool first_time = TRUE;
if (first_time)
{
previous_time = time(NULL);
first_time = FALSE;
}
time(¤t_time);
commlost_secs_prev = commlost_secs_cur;
if(heartbeat_read_prev == heartbeat_read_cur)
{
commlost_secs_cur += difftime(current_time, previous_time);
}
else
{
heartbeat_read_prev = heartbeat_read_cur;
commlost_secs_cur = 0;
}
previous_time = current_time;
return (commlost_secs_cur);
}
在查询时间之前,请阅读手册页(然后再次阅读) 例如,我建议使用
CLOCK\u MONOTONIC
或CLOCK\u REALTIME
,最好使用double
进行时间计算(因为struct timespec
通常比任何整数类型都大)
不要将uint16\u t
用于此类时间计算
试用
inline double double_gettime (clockid_t cid) {
struct timespec ts = {0,0};
clock_gettime(cid, &ts);
return (double)ts.tv_sec + 1.0e-9*ts.tv_nsec;
}
您可能希望通过测试clock\u gettime是否出现故障,并在出现故障时给出NAN
,使该函数更加丰富多彩!这是留给读者的练习。对于CLOCK\u REALTIME
等,您还可以测量流程开始时的某个时间与当前时间之间的差异(即,计算差异的struct timespec
,并将该差异转换为双精度
)
然后像
double tstart = double_gettime(CLOCK_REALTIME);
some_long_computation();
double tend = double_gettime(CLOCK_REALTIME);
printf ("needed %f seconds to compute\n", tend-tstart);
另请参见在查询时间之前,阅读手册页(然后再次阅读) 例如,我建议使用
CLOCK\u MONOTONIC
或CLOCK\u REALTIME
,最好使用double
进行时间计算(因为struct timespec
通常比任何整数类型都大)
不要将uint16\u t
用于此类时间计算
试用
inline double double_gettime (clockid_t cid) {
struct timespec ts = {0,0};
clock_gettime(cid, &ts);
return (double)ts.tv_sec + 1.0e-9*ts.tv_nsec;
}
您可能希望通过测试clock\u gettime是否出现故障,并在出现故障时给出NAN
,使该函数更加丰富多彩!这是留给读者的练习。对于CLOCK\u REALTIME
等,您还可以测量流程开始时的某个时间与当前时间之间的差异(即,计算差异的struct timespec
,并将该差异转换为双精度
)
然后像
double tstart = double_gettime(CLOCK_REALTIME);
some_long_computation();
double tend = double_gettime(CLOCK_REALTIME);
printf ("needed %f seconds to compute\n", tend-tstart);
另请参见difftime()
用于time\t
支持时间分辨率高于整数秒的系统。虽然允许,但我从未遇到过这样的系统——我不认为存在这样的系统。特别是在POSIX系统上,time\u t
是以整数秒为单位测量的,而difftime()
相当于其参数的算术减法,因此实际上最好使用:
commlost_secs_cur += current_time - previous_time ;
这就是说,您的实现有点过于复杂,而不是自上次调用以来累积的时间(可能小于时钟分辨率),您可以简单地对观察到的最后一次心跳加上时间戳,然后返回此后的时间:
int commlost(uint16_t heartbeat_read_cur)
{
time_t current_time = time(0) ;
static time_t heartbeat_timestamp = 0 ;
static uint16_t heartbeat_read_prev ;
// If first time, or heartbeat changed...
if( heartbeat_timestamp == 0 || heartbeat_read_prev != heartbeat_read_cur)
{
// ... timestamp heartbeat
heartbeat_timestamp = time(0) ;
// ... keep last heartbeat
heartbeat_read_prev = heartbeat_read_cur ;
}
// Return seconds since last heartbeat timestamp
return current_time - heartbeat_timestamp ;
}
我不知道你为什么要用uint16\u t
来做这个;除非是为了与某些特定协议或文件格式兼容,否则几乎没有优势 difftime()
适用于time\u t
支持时间分辨率高于整数秒的系统。虽然允许,但我从未遇到过这样的系统——我不认为存在这样的系统。特别是在POSIX系统上,time\u t
是以整数秒为单位测量的,而difftime()
相当于其参数的算术减法,因此实际上最好使用:
commlost_secs_cur += current_time - previous_time ;
这就是说,您的实现有点过于复杂,而不是自上次调用以来累积的时间(可能小于时钟分辨率),您可以简单地对观察到的最后一次心跳加上时间戳,然后返回此后的时间:
int commlost(uint16_t heartbeat_read_cur)
{
time_t current_time = time(0) ;
static time_t heartbeat_timestamp = 0 ;
static uint16_t heartbeat_read_prev ;
// If first time, or heartbeat changed...
if( heartbeat_timestamp == 0 || heartbeat_read_prev != heartbeat_read_cur)
{
// ... timestamp heartbeat
heartbeat_timestamp = time(0) ;
// ... keep last heartbeat
heartbeat_read_prev = heartbeat_read_cur ;
}
// Return seconds since last heartbeat timestamp
return current_time - heartbeat_timestamp ;
}
我不知道你为什么要用
uint16\u t
来做这个;除非是为了与某些特定协议或文件格式兼容,否则几乎没有优势 这是一个奇数。。。可能是返回-1(假设返回类型是16位整数,而不是32位整数)?我会检查函数的文档。difftime()
返回double
。可能是double
-->uint16\u t
溢出了?请查看current\u time
和previous\u time
的值,以及通过使用调试器或添加printf
调用返回的difftime()。65535秒等于18+小时;它也是auint16)t
@chux的最大值:溢出是合理的,但我发现(在类似的系统上)它在65535处缠绕而不是饱和。您是否可能从多个线程调用此函数?这是一个奇数。。。可能是返回-1(假设返回类型是16位整数,而不是32位整数)?我会检查函数的文档。difftime()
返回double
。可能是double
-->uint16\u t
溢出了?请查看current\u time
和previous\u time
的值,以及通过使用调试器或添加printf
调用返回的difftime()。65535秒等于18+小时;这也是uint16)t
@chux的最大值:溢出是合理的,但我发现(在类似的系统上)它在65535处缠绕而不是饱和。您是否可能从多个线程调用此函数?注意:time
即使不是以秒为单位,也是difftime()的结果
以秒为单位。@chux:是的,但它不必要是一个双精度的。该问题询问问题是否存在于从双精度转换中;我对此表示怀疑,但是