summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
authorzms123456 <[email protected]>2024-04-22 11:55:20 +0800
committerGitHub <[email protected]>2024-04-22 11:55:20 +0800
commit5ca1e450204f2b11de5c5e2f1b09a90a6b2d4d96 (patch)
tree332484679f5764dd95402c8a13663340868ec43d /components/drivers
parentf13220d91111bbb48abaae26507917c2fc9c6d12 (diff)
[components][drivers]improve ktimer sleep (#8838)
improve ktimer sleep
Diffstat (limited to 'components/drivers')
-rw-r--r--components/drivers/ktime/inc/ktime.h11
-rw-r--r--components/drivers/ktime/src/hrtimer.c37
2 files changed, 30 insertions, 18 deletions
diff --git a/components/drivers/ktime/inc/ktime.h b/components/drivers/ktime/inc/ktime.h
index 44e2578bcf..7ddb9e6584 100644
--- a/components/drivers/ktime/inc/ktime.h
+++ b/components/drivers/ktime/inc/ktime.h
@@ -139,13 +139,16 @@ rt_inline void rt_ktime_hrtimer_keep_errno(rt_ktime_hrtimer_t timer, rt_err_t er
rt_set_errno(-err);
}
+void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer);
+void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer);
+
/**
* @brief sleep by the cputimer cnt value
*
* @param cnt: the cputimer cnt value
* @return rt_err_t
*/
-rt_err_t rt_ktime_hrtimer_sleep(unsigned long cnt);
+rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt);
/**
* @brief sleep by ns
@@ -153,7 +156,7 @@ rt_err_t rt_ktime_hrtimer_sleep(unsigned long cnt);
* @param ns: ns
* @return rt_err_t
*/
-rt_err_t rt_ktime_hrtimer_ndelay(unsigned long ns);
+rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns);
/**
* @brief sleep by us
@@ -161,7 +164,7 @@ rt_err_t rt_ktime_hrtimer_ndelay(unsigned long ns);
* @param us: us
* @return rt_err_t
*/
-rt_err_t rt_ktime_hrtimer_udelay(unsigned long us);
+rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us);
/**
* @brief sleep by ms
@@ -169,6 +172,6 @@ rt_err_t rt_ktime_hrtimer_udelay(unsigned long us);
* @param ms: ms
* @return rt_err_t
*/
-rt_err_t rt_ktime_hrtimer_mdelay(unsigned long ms);
+rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms);
#endif
diff --git a/components/drivers/ktime/src/hrtimer.c b/components/drivers/ktime/src/hrtimer.c
index f22f39e128..184ee94fd0 100644
--- a/components/drivers/ktime/src/hrtimer.c
+++ b/components/drivers/ktime/src/hrtimer.c
@@ -356,37 +356,46 @@ rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer)
/************************** delay ***************************/
-rt_err_t rt_ktime_hrtimer_sleep(unsigned long cnt)
+void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer)
+{
+ rt_ktime_hrtimer_init(timer, "hrtimer_sleep", 0, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER,
+ _sleep_timeout, &(timer->sem));
+}
+
+void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer)
+{
+ rt_ktime_hrtimer_detach(timer);
+}
+
+rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt)
{
- struct rt_ktime_hrtimer timer;
rt_err_t err;
if (cnt == 0)
return -RT_EINVAL;
- rt_ktime_hrtimer_init(&timer, "hrtimer_sleep", cnt, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER,
- _sleep_timeout, &(timer.sem));
+ timer->timeout_cnt = cnt + rt_ktime_cputimer_getcnt();
+ timer->init_cnt = cnt;
- rt_ktime_hrtimer_start(&timer); /* reset the timeout of thread timer and start it */
- err = rt_sem_take_interruptible(&(timer.sem), RT_WAITING_FOREVER);
- rt_ktime_hrtimer_keep_errno(&timer, err);
+ rt_ktime_hrtimer_start(timer); /* reset the timeout of thread timer and start it */
+ err = rt_sem_take_interruptible(&(timer->sem), RT_WAITING_FOREVER);
+ rt_ktime_hrtimer_keep_errno(timer, err);
- rt_ktime_hrtimer_detach(&timer);
return RT_EOK;
}
-rt_err_t rt_ktime_hrtimer_ndelay(unsigned long ns)
+rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns)
{
unsigned long res = rt_ktime_cputimer_getres();
- return rt_ktime_hrtimer_sleep((ns * RT_KTIME_RESMUL) / res);
+ return rt_ktime_hrtimer_sleep(timer, (ns * RT_KTIME_RESMUL) / res);
}
-rt_err_t rt_ktime_hrtimer_udelay(unsigned long us)
+rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us)
{
- return rt_ktime_hrtimer_ndelay(us * 1000);
+ return rt_ktime_hrtimer_ndelay(timer, us * 1000);
}
-rt_err_t rt_ktime_hrtimer_mdelay(unsigned long ms)
+rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms)
{
- return rt_ktime_hrtimer_ndelay(ms * 1000000);
+ return rt_ktime_hrtimer_ndelay(timer, ms * 1000000);
}