diff --git a/source/tools/monitor/unity/beeQ/clock/ee_clock.c b/source/tools/monitor/unity/beeQ/clock/ee_clock.c index 3ccebd204062d102d3aef1bb3bb337d505d52d19..37e5df54a59a81f07a41aa33fb71b14ae8b012e6 100644 --- a/source/tools/monitor/unity/beeQ/clock/ee_clock.c +++ b/source/tools/monitor/unity/beeQ/clock/ee_clock.c @@ -7,8 +7,10 @@ #include #include #include +#include #define TIME_SECOND_UNIT 100000UL // 睡眠校准时间, +#define MICRO_UNIT (1000 * 1000UL) static ee_clock_t clk_coef = 0; @@ -20,24 +22,43 @@ static ee_clock_t get_cycles() { return res; } +ee_clock_t get_native_us(void) { + ee_clock_t res = 0; + struct timeval tv; + + if (gettimeofday(&tv, NULL) == 0) { + res = tv.tv_sec * MICRO_UNIT + tv.tv_usec; + } + return res; +} + // 校准时钟 int calibrate_local_clock(){ ee_clock_t coef1, coef2; - ee_clock_t t1, t2, t3; + ee_clock_t t1, t2; + ee_clock_t ts1, ts2; ee_clock_t delta1, delta2; + ee_clock_t dts1, dts2; ee_clock_t res; t1 = get_cycles(); + ts1 = get_native_us(); usleep(TIME_SECOND_UNIT); t2 = get_cycles(); - usleep(TIME_SECOND_UNIT); - t3 = get_cycles(); - + ts2 = get_native_us(); delta1 = t2 - t1; - delta2 = t3 - t2; + dts1 = ts2 - ts1; + + t1 = get_cycles(); + ts1 = get_native_us(); + usleep(TIME_SECOND_UNIT); + t2 = get_cycles(); + ts2 = get_native_us(); + delta2 = t2 - t1; + dts2 = ts2 - ts1; - coef1 = delta1 / TIME_SECOND_UNIT; - coef2 = delta2 / TIME_SECOND_UNIT; + coef1 = delta1 / dts2; + coef2 = delta2 / dts1; if (coef1 <= 100 || coef2 <= 100) { fprintf(stderr, "read clock too small.\n"); @@ -47,6 +68,7 @@ int calibrate_local_clock(){ res = 100 * coef1 / coef2; if (res >= 110 || res <= 90) { fprintf(stderr, "calibrate local clock failed.\n"); + fprintf(stderr, "delta1: %ld, delta2: %ld, dts1: %ld, dts2: %ld.\n", delta1, delta2, dts1, dts2); return -EIO; } diff --git a/source/tools/monitor/unity/beeQ/foxRecv.lua b/source/tools/monitor/unity/beeQ/foxRecv.lua index 9537e10b6b963af26bde38888037d0c6fd2ca34d..fb3323dc01f12afbe3c493217b36fac819bdea05 100644 --- a/source/tools/monitor/unity/beeQ/foxRecv.lua +++ b/source/tools/monitor/unity/beeQ/foxRecv.lua @@ -11,7 +11,6 @@ local system = require("common.system") local CfoxRecv = class("CfoxRecv") local unistd = require("posix.unistd") local fcntl = require("posix.fcntl") -local bit = require("bit") local struct = require("struct") local function setupCo(fYaml) @@ -26,8 +25,7 @@ local function setupCo(fYaml) fcntl.fcntl(fdIn, 1031, 1024 * 1024) fcntl.fcntl(fdOut, 1031, 1024 * 1024) - local flag = fcntl.fcntl(fdOut, fcntl.F_GETFL, 0); - flag = bit.bor(flag, fcntl.O_NONBLOCK) + system:fdNonBlocking(fdOut) lua_push_start(fdIn) return fdIn, fdOut diff --git a/source/tools/monitor/unity/beeQ/lib/beeQ.c b/source/tools/monitor/unity/beeQ/lib/beeQ.c index a60afa85102112d997a212adca304f41f874da15..b8bbbe683376b2ddde9f055ca5692ef83a63678f 100644 --- a/source/tools/monitor/unity/beeQ/lib/beeQ.c +++ b/source/tools/monitor/unity/beeQ/lib/beeQ.c @@ -221,6 +221,7 @@ int beeQ_stop(struct beeQ *q) { int beeQ_send(struct beeQ *q, void *msg) { int loop = 0; + int wake = 0; pthread_mutex_lock(&q->mtx); if (q->stop) { @@ -243,11 +244,14 @@ int beeQ_send(struct beeQ *q, void *msg) { } if (isempty(q)) { - pthread_cond_signal(&q->cond); // need to wakeup. + wake = 1; } q->send = (q->send + 1) % q->size; q->msgs[q->send] = msg; pthread_mutex_unlock(&q->mtx); + if (wake) { + pthread_cond_signal(&q->cond); // need to wakeup. + } return 0; } diff --git a/source/tools/monitor/unity/collector/guard/calcJiffies.lua b/source/tools/monitor/unity/collector/guard/calcJiffies.lua index 922f345bcc7ab5c9d6ee6f6bef882741e0a2d40d..bbb914e91eae64074c0a2e71f3c9dee0993d31de 100644 --- a/source/tools/monitor/unity/collector/guard/calcJiffies.lua +++ b/source/tools/monitor/unity/collector/guard/calcJiffies.lua @@ -6,6 +6,7 @@ local mod = {} local ptime = require("posix.time") +local pstime = require("posix.sys.time") local unistd = require("posix.unistd") local system = require("common.system") @@ -26,7 +27,16 @@ local function read_jiffies(path, procffi) return res end -local function nproc() +local function get_native_us() + local res, err, errno = pstime.gettimeofday() + if res then + return res.tv_sec * 1e6 + res.tv_usec + else + system:posixError("gettimeofday failed", err, errno) + end +end + +local function nproc() -- get cpu numbers, exec nproc local r, err, errno = unistd.sysconf(84) if err then system:posixError("sysconf failed", err, errno) @@ -40,26 +50,30 @@ function mod.calc(mnt, procffi) local r, err, errno local j1 = read_jiffies(path, procffi) + local ns1 = get_native_us() r, err, errno = ptime.nanosleep(t) if err then system:posixError("nano sleep failed", err, errno) end local j2 = read_jiffies(path, procffi) + local ns2 = get_native_us() ptime.nanosleep(t) if err then system:posixError("nano sleep failed", err, errno) end local j3 = read_jiffies(path, procffi) + local ns3 = get_native_us() + local delta1, delta2 = j2 - j1, j3 -j2 - local comp = delta1 / delta2 + local dts1, dts2 = ns2 - ns1, ns3 - ns2 + local comp = (delta1 / dts1) / ( delta2 / dts2 ) if comp >= 1.1 or comp < 0.9 then - error("calculate jiffies failed.") + error(string.format("calculate jiffies failed, delta1: %d, delta2: %d, dts1: %d, dts2: %d", delta1, delta2, dts1, dts2)) end - - return (delta1 + delta2) * 2.5 / nproc() + return (delta1 + delta2) * ( 1e6 / (dts1 + dts2)) / nproc() end return mod