Skip to content

Commit 5ca1e45

Browse files
authored
[components][drivers]improve ktimer sleep (#8838)
improve ktimer sleep
1 parent f13220d commit 5ca1e45

File tree

3 files changed

+38
-19
lines changed

3 files changed

+38
-19
lines changed

components/drivers/ktime/inc/ktime.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -139,36 +139,39 @@ rt_inline void rt_ktime_hrtimer_keep_errno(rt_ktime_hrtimer_t timer, rt_err_t er
139139
rt_set_errno(-err);
140140
}
141141

142+
void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer);
143+
void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer);
144+
142145
/**
143146
* @brief sleep by the cputimer cnt value
144147
*
145148
* @param cnt: the cputimer cnt value
146149
* @return rt_err_t
147150
*/
148-
rt_err_t rt_ktime_hrtimer_sleep(unsigned long cnt);
151+
rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt);
149152

150153
/**
151154
* @brief sleep by ns
152155
*
153156
* @param ns: ns
154157
* @return rt_err_t
155158
*/
156-
rt_err_t rt_ktime_hrtimer_ndelay(unsigned long ns);
159+
rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns);
157160

158161
/**
159162
* @brief sleep by us
160163
*
161164
* @param us: us
162165
* @return rt_err_t
163166
*/
164-
rt_err_t rt_ktime_hrtimer_udelay(unsigned long us);
167+
rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us);
165168

166169
/**
167170
* @brief sleep by ms
168171
*
169172
* @param ms: ms
170173
* @return rt_err_t
171174
*/
172-
rt_err_t rt_ktime_hrtimer_mdelay(unsigned long ms);
175+
rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms);
173176

174177
#endif

components/drivers/ktime/src/hrtimer.c

+23-14
Original file line numberDiff line numberDiff line change
@@ -356,37 +356,46 @@ rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer)
356356

357357
/************************** delay ***************************/
358358

359-
rt_err_t rt_ktime_hrtimer_sleep(unsigned long cnt)
359+
void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer)
360+
{
361+
rt_ktime_hrtimer_init(timer, "hrtimer_sleep", 0, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER,
362+
_sleep_timeout, &(timer->sem));
363+
}
364+
365+
void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer)
366+
{
367+
rt_ktime_hrtimer_detach(timer);
368+
}
369+
370+
rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt)
360371
{
361-
struct rt_ktime_hrtimer timer;
362372
rt_err_t err;
363373

364374
if (cnt == 0)
365375
return -RT_EINVAL;
366376

367-
rt_ktime_hrtimer_init(&timer, "hrtimer_sleep", cnt, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER,
368-
_sleep_timeout, &(timer.sem));
377+
timer->timeout_cnt = cnt + rt_ktime_cputimer_getcnt();
378+
timer->init_cnt = cnt;
369379

370-
rt_ktime_hrtimer_start(&timer); /* reset the timeout of thread timer and start it */
371-
err = rt_sem_take_interruptible(&(timer.sem), RT_WAITING_FOREVER);
372-
rt_ktime_hrtimer_keep_errno(&timer, err);
380+
rt_ktime_hrtimer_start(timer); /* reset the timeout of thread timer and start it */
381+
err = rt_sem_take_interruptible(&(timer->sem), RT_WAITING_FOREVER);
382+
rt_ktime_hrtimer_keep_errno(timer, err);
373383

374-
rt_ktime_hrtimer_detach(&timer);
375384
return RT_EOK;
376385
}
377386

378-
rt_err_t rt_ktime_hrtimer_ndelay(unsigned long ns)
387+
rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns)
379388
{
380389
unsigned long res = rt_ktime_cputimer_getres();
381-
return rt_ktime_hrtimer_sleep((ns * RT_KTIME_RESMUL) / res);
390+
return rt_ktime_hrtimer_sleep(timer, (ns * RT_KTIME_RESMUL) / res);
382391
}
383392

384-
rt_err_t rt_ktime_hrtimer_udelay(unsigned long us)
393+
rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us)
385394
{
386-
return rt_ktime_hrtimer_ndelay(us * 1000);
395+
return rt_ktime_hrtimer_ndelay(timer, us * 1000);
387396
}
388397

389-
rt_err_t rt_ktime_hrtimer_mdelay(unsigned long ms)
398+
rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms)
390399
{
391-
return rt_ktime_hrtimer_ndelay(ms * 1000000);
400+
return rt_ktime_hrtimer_ndelay(timer, ms * 1000000);
392401
}

components/libc/compilers/common/ctime.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,9 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
530530
{
531531
struct timespec old_ts = {0};
532532
struct timespec new_ts = {0};
533+
struct rt_ktime_hrtimer timer;
534+
535+
rt_ktime_hrtimer_delay_init(&timer);
533536

534537
if (rqtp == RT_NULL)
535538
{
@@ -544,7 +547,7 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
544547
}
545548
unsigned long ns = rqtp->tv_sec * NANOSECOND_PER_SECOND + rqtp->tv_nsec;
546549
rt_ktime_boottime_get_ns(&old_ts);
547-
rt_ktime_hrtimer_ndelay(ns);
550+
rt_ktime_hrtimer_ndelay(&timer, ns);
548551
if (rt_get_errno() == RT_EINTR)
549552
{
550553
if (rmtp)
@@ -565,9 +568,13 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
565568
rmtp->tv_nsec = rnsec;
566569
}
567570
}
571+
572+
rt_ktime_hrtimer_delay_detach(&timer);
568573
rt_set_errno(EINTR);
569574
return -1;
570575
}
576+
577+
rt_ktime_hrtimer_delay_detach(&timer);
571578
return 0;
572579
}
573580
RTM_EXPORT(nanosleep);

0 commit comments

Comments
 (0)