summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorxqyjlj <[email protected]>2023-07-26 14:48:00 +0800
committerguo <[email protected]>2023-07-27 11:35:29 +0800
commitd23dd56692c6cff65480fbed286362889c96c7ba (patch)
tree0f081dd0613366f119a976888eb59da11480a7be /components
parent0eaa757cffe21231ee6b57e0e2c9681f966e6f56 (diff)
🐞 fix(ktime): fix wrong boottime
因为tick从中断到设置中间的时延特别大,因此暂不采用tick做基准时间,直接取gtime的cnt做基准时间
Diffstat (limited to 'components')
-rw-r--r--components/ktime/inc/ktime.h6
-rw-r--r--components/ktime/src/aarch64/cputimer.c9
-rw-r--r--components/ktime/src/boottime.c27
-rw-r--r--components/ktime/src/cputimer.c5
-rw-r--r--components/ktime/src/risc-v/virt64/cputimer.c9
5 files changed, 39 insertions, 17 deletions
diff --git a/components/ktime/inc/ktime.h b/components/ktime/inc/ktime.h
index 86fbefd0bb..891da999bc 100644
--- a/components/ktime/inc/ktime.h
+++ b/components/ktime/inc/ktime.h
@@ -83,6 +83,12 @@ unsigned long rt_ktime_cputimer_getcnt(void);
unsigned long rt_ktime_cputimer_getstep(void);
/**
+ * @brief Init cputimer
+ *
+ */
+void rt_ktime_cputimer_init(void);
+
+/**
* @brief Get hrtimer resolution
*
* @return (resolution * RT_KTIME_RESMUL)
diff --git a/components/ktime/src/aarch64/cputimer.c b/components/ktime/src/aarch64/cputimer.c
index 53c60736d4..cc1c5255e9 100644
--- a/components/ktime/src/aarch64/cputimer.c
+++ b/components/ktime/src/aarch64/cputimer.c
@@ -11,6 +11,8 @@
#include "gtimer.h"
#include "ktime.h"
+static volatile unsigned long _init_cnt = 0;
+
unsigned long rt_ktime_cputimer_getres(void)
{
return ((1000UL * 1000 * 1000) * RT_KTIME_RESMUL) / rt_hw_get_gtimer_frq();
@@ -23,10 +25,15 @@ unsigned long rt_ktime_cputimer_getfrq(void)
unsigned long rt_ktime_cputimer_getcnt(void)
{
- return rt_hw_get_cntpct_val();
+ return rt_hw_get_cntpct_val() - _init_cnt;
}
unsigned long rt_ktime_cputimer_getstep(void)
{
return rt_ktime_cputimer_getfrq() / RT_TICK_PER_SECOND;
}
+
+void rt_ktime_cputimer_init(void)
+{
+ _init_cnt = rt_hw_get_cntpct_val();
+}
diff --git a/components/ktime/src/boottime.c b/components/ktime/src/boottime.c
index 9d05266d71..d380cd7e93 100644
--- a/components/ktime/src/boottime.c
+++ b/components/ktime/src/boottime.c
@@ -12,40 +12,37 @@
#define __KTIME_MUL ((1000UL * 1000 * 1000) / RT_TICK_PER_SECOND)
-rt_err_t rt_ktime_boottime_get_us(struct timeval *tv)
+rt_weak rt_err_t rt_ktime_boottime_get_us(struct timeval *tv)
{
RT_ASSERT(tv != RT_NULL);
- rt_tick_t ms = rt_tick_get();
- unsigned long ns =
- ((rt_ktime_cputimer_getcnt() % rt_ktime_cputimer_getstep()) * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL;
- ns = ((ms % RT_TICK_PER_SECOND) * __KTIME_MUL) + ns;
+ unsigned long ns = (rt_ktime_cputimer_getcnt() * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL;
- tv->tv_sec = ms / RT_TICK_PER_SECOND;
- tv->tv_usec = ns / 1000;
+ tv->tv_sec = ns / (1000UL * 1000 * 1000);
+ tv->tv_usec = (ns % (1000UL * 1000 * 1000)) / 1000;
return RT_EOK;
}
-rt_err_t rt_ktime_boottime_get_s(time_t *t)
+rt_weak rt_err_t rt_ktime_boottime_get_s(time_t *t)
{
RT_ASSERT(t != RT_NULL);
- *t = rt_tick_get() / RT_TICK_PER_SECOND;
+ unsigned long ns = (rt_ktime_cputimer_getcnt() * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL;
+
+ *t = ns / (1000UL * 1000 * 1000);
return RT_EOK;
}
-rt_err_t rt_ktime_boottime_get_ns(struct timespec *ts)
+rt_weak rt_err_t rt_ktime_boottime_get_ns(struct timespec *ts)
{
RT_ASSERT(ts != RT_NULL);
- rt_tick_t ms = rt_tick_get();
- unsigned long ns =
- ((rt_ktime_cputimer_getcnt() % rt_ktime_cputimer_getstep()) * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL;
+ unsigned long ns = (rt_ktime_cputimer_getcnt() * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL;
- ts->tv_sec = ms / RT_TICK_PER_SECOND;
- ts->tv_nsec = ((ms % RT_TICK_PER_SECOND) * __KTIME_MUL) + ns;
+ ts->tv_sec = ns / (1000UL * 1000 * 1000);
+ ts->tv_nsec = ns % (1000UL * 1000 * 1000);
return RT_EOK;
}
diff --git a/components/ktime/src/cputimer.c b/components/ktime/src/cputimer.c
index c878581cdf..f182be894c 100644
--- a/components/ktime/src/cputimer.c
+++ b/components/ktime/src/cputimer.c
@@ -29,3 +29,8 @@ rt_weak unsigned long rt_ktime_cputimer_getstep(void)
{
return 1;
}
+
+rt_weak void rt_ktime_cputimer_init(void)
+{
+ return;
+}
diff --git a/components/ktime/src/risc-v/virt64/cputimer.c b/components/ktime/src/risc-v/virt64/cputimer.c
index 9b0f754751..bbc7576c5e 100644
--- a/components/ktime/src/risc-v/virt64/cputimer.c
+++ b/components/ktime/src/risc-v/virt64/cputimer.c
@@ -10,6 +10,8 @@
#include "ktime.h"
+static volatile unsigned long _init_cnt = 0;
+
unsigned long rt_ktime_cputimer_getres(void)
{
return ((1000UL * 1000 * 1000) * RT_KTIME_RESMUL) / CPUTIME_TIMER_FREQ;
@@ -24,10 +26,15 @@ unsigned long rt_ktime_cputimer_getcnt(void)
{
unsigned long time_elapsed;
__asm__ __volatile__("rdtime %0" : "=r"(time_elapsed));
- return time_elapsed;
+ return time_elapsed - _init_cnt;
}
unsigned long rt_ktime_cputimer_getstep(void)
{
return rt_ktime_cputimer_getfrq() / RT_TICK_PER_SECOND;
}
+
+void rt_ktime_cputimer_init(void)
+{
+ __asm__ __volatile__("rdtime %0" : "=r"(_init_cnt));
+}