diff options
| author | xqyjlj <[email protected]> | 2023-07-26 14:48:00 +0800 |
|---|---|---|
| committer | guo <[email protected]> | 2023-07-27 11:35:29 +0800 |
| commit | d23dd56692c6cff65480fbed286362889c96c7ba (patch) | |
| tree | 0f081dd0613366f119a976888eb59da11480a7be /components | |
| parent | 0eaa757cffe21231ee6b57e0e2c9681f966e6f56 (diff) | |
🐞 fix(ktime): fix wrong boottime
因为tick从中断到设置中间的时延特别大,因此暂不采用tick做基准时间,直接取gtime的cnt做基准时间
Diffstat (limited to 'components')
| -rw-r--r-- | components/ktime/inc/ktime.h | 6 | ||||
| -rw-r--r-- | components/ktime/src/aarch64/cputimer.c | 9 | ||||
| -rw-r--r-- | components/ktime/src/boottime.c | 27 | ||||
| -rw-r--r-- | components/ktime/src/cputimer.c | 5 | ||||
| -rw-r--r-- | components/ktime/src/risc-v/virt64/cputimer.c | 9 |
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)); +} |
