在c ++ chronos和蓝牙`hcitool clock`之间产生时间差异

时间:2016-10-17 10:48:26

标签: c++ bluetooth

我想要的是什么

我想计算一个系统时钟和蓝牙设备的内部时钟之间的偏移量,看看偏移量是否恒定(理论上,它应该是常数)。

引物

蓝牙设备的内部时钟每秒嘀嗒3200次(即312.5 us / tick)。可以通过执行命令hcitool clock来检索它。这是演示:

我做了什么

  1. 我做了一个迭代100次的程序:
    1. 通过std::chronos::high_resolution_clock::now()
    2. 获取以微秒为单位的系统时钟值
    3. 通过hcitool clock获取蓝牙设备的内部时钟。
    4. 打印出两个值(以逗号分隔)。
  2. 我复制并粘贴了打印结果并计算system_clock - BT_clock * 312.5并绘制了它。
  3. 原始数据位于here (GitHub Gist)

    观察

    我预计每次试验的偏移应该(几乎)为零。然而,实际上,它在抖动时表现出一定的稳定价值。 Belows是个人价值和概率密度函数的图。

    enter image description here

    enter image description here

    问题

    那么,我该如何有效地消除抖动?我想有几个原因:

    • high_resolution_clock::now()hcitool clock不会同时执行。因此可能存在随机抖动(可能包括上下文切换)
    • 程序中的功能和打开过程都很昂贵(
    • USB型蓝牙适配器不能保证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;
    }
    

0 个答案:

没有答案