我想计算一个系统时钟和蓝牙设备的内部时钟之间的偏移量,看看偏移量是否恒定(理论上,它应该是常数)。
蓝牙设备的内部时钟每秒嘀嗒3200次(即312.5 us / tick)。可以通过执行命令hcitool clock
来检索它。这是演示:
std::chronos::high_resolution_clock::now()
hcitool clock
获取蓝牙设备的内部时钟。system_clock - BT_clock * 312.5
并绘制了它。原始数据位于here (GitHub Gist)
我预计每次试验的偏移应该(几乎)为零。然而,实际上,它在抖动时表现出一定的稳定价值。 Belows是个人价值和概率密度函数的图。
那么,我该如何有效地消除抖动?我想有几个原因:
high_resolution_clock::now()
和hcitool clock
不会同时执行。因此可能存在随机抖动(可能包括上下文切换)hcitool clock
在保证的时限内返回结果。然而,我没有信心这是真的,哪些不是,也不知道如果每个猜测都是真的我怎么能解决问题。
/* g++ soruce-code.cc -std=c++11*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <chrono>
using namespace std;
using namespace chrono;
int main() {
#define BUFLEN 128
#define CLKLEN 10
char buf[BUFLEN], clock_char[CLKLEN];
unsigned long clock_long;
FILE* pipe;
auto t = high_resolution_clock::now();
auto us = time_point_cast<microseconds>(t).time_since_epoch().count();
cout << "system,bt" << endl;
for (int i = 0; i != 100; i++) {
t = high_resolution_clock::now();
us = time_point_cast<microseconds>(t).time_since_epoch().count();
pipe = popen("hcitool clock", "r");
if (!pipe) {
cout << "command hcitool clock failed" << endl;
pclose(pipe);
break;
}
while (!feof(pipe)) {
if (fgets(buf, BUFLEN, pipe) == NULL) break;
if (strncmp(buf, "Clock", 5)) break;
strncpy(clock_char, buf + 10, CLKLEN);
clock_char[CLKLEN] = 0;
clock_long = stoul(clock_char, nullptr, 16);
cout << us << "," << clock_long << endl;
break;
}
pclose(pipe);
}
return 0;
}