ktime.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-07-10 xqyjlj The first version.
  9. * 2024-04-26 Shell Improve ipc performance
  10. */
  11. #ifndef __KTIME_H__
  12. #define __KTIME_H__
  13. #include <stdint.h>
  14. #include <sys/time.h>
  15. #include <ipc/completion.h>
  16. #include "rtthread.h"
  17. #define RT_KTIME_RESMUL (1000000ULL)
  18. struct rt_ktime_hrtimer
  19. {
  20. rt_uint8_t flag; /**< compatible to tick timer's flag */
  21. char name[RT_NAME_MAX];
  22. rt_list_t node;
  23. void *parameter;
  24. unsigned long delay_cnt;
  25. unsigned long timeout_cnt;
  26. rt_err_t error;
  27. struct rt_completion completion;
  28. void (*timeout_func)(void *parameter);
  29. };
  30. typedef struct rt_ktime_hrtimer *rt_ktime_hrtimer_t;
  31. /**
  32. * @brief Get boottime with us precision
  33. *
  34. * @param tv: timeval
  35. * @return rt_err_t
  36. */
  37. rt_err_t rt_ktime_boottime_get_us(struct timeval *tv);
  38. /**
  39. * @brief Get boottime with s precision
  40. *
  41. * @param t: time_t
  42. * @return rt_err_t
  43. */
  44. rt_err_t rt_ktime_boottime_get_s(time_t *t);
  45. /**
  46. * @brief Get boottime with ns precision
  47. *
  48. * @param ts: timespec
  49. * @return rt_err_t
  50. */
  51. rt_err_t rt_ktime_boottime_get_ns(struct timespec *ts);
  52. /**
  53. * @brief Get cputimer resolution
  54. *
  55. * @return (resolution * RT_KTIME_RESMUL)
  56. */
  57. rt_uint64_t rt_ktime_cputimer_getres(void);
  58. /**
  59. * @brief Get cputimer frequency
  60. *
  61. * @return frequency
  62. */
  63. unsigned long rt_ktime_cputimer_getfrq(void);
  64. /**
  65. * @brief Get cputimer the value of the cnt counter
  66. *
  67. * @return cnt
  68. */
  69. unsigned long rt_ktime_cputimer_getcnt(void);
  70. /**
  71. * @brief Get cputimer the cnt value corresponding to 1 os tick
  72. *
  73. * @return step
  74. */
  75. unsigned long rt_ktime_cputimer_getstep(void);
  76. /**
  77. * @brief Init cputimer
  78. *
  79. */
  80. void rt_ktime_cputimer_init(void);
  81. /**
  82. * @brief Get hrtimer resolution
  83. *
  84. * @return (resolution * RT_KTIME_RESMUL)
  85. */
  86. rt_uint64_t rt_ktime_hrtimer_getres(void);
  87. /**
  88. * @brief Get hrtimer frequency
  89. *
  90. * @return frequency
  91. */
  92. unsigned long rt_ktime_hrtimer_getfrq(void);
  93. /**
  94. * @brief Get hrtimer the value of the cnt counter
  95. *
  96. * @return cnt
  97. */
  98. unsigned long rt_ktime_hrtimer_getcnt(void);
  99. /**
  100. * @brief set hrtimer interrupt timeout count (cnt), you should re-implemented it in hrtimer device driver
  101. *
  102. * @param cnt: hrtimer requires a timing cnt value
  103. * @return rt_err_t
  104. */
  105. rt_err_t rt_ktime_hrtimer_settimeout(unsigned long cnt);
  106. /**
  107. * @brief called in hrtimer device driver isr routinue, it will process the timeouts
  108. */
  109. void rt_ktime_hrtimer_process(void);
  110. void rt_ktime_hrtimer_init(rt_ktime_hrtimer_t timer,
  111. const char *name,
  112. rt_uint8_t flag,
  113. void (*timeout)(void *parameter),
  114. void *parameter);
  115. rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer, unsigned long cnt);
  116. rt_err_t rt_ktime_hrtimer_stop(rt_ktime_hrtimer_t timer);
  117. rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg);
  118. rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer);
  119. rt_inline void rt_ktime_hrtimer_keep_errno(rt_ktime_hrtimer_t timer, rt_err_t err)
  120. {
  121. RT_ASSERT(timer != RT_NULL);
  122. timer->error = err;
  123. rt_set_errno(-err);
  124. }
  125. void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer);
  126. void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer);
  127. void rt_ktime_hrtimer_process(void);
  128. /**
  129. * @brief sleep by the cputimer cnt value
  130. *
  131. * @param cnt: the cputimer cnt value
  132. * @return rt_err_t
  133. */
  134. rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt);
  135. /**
  136. * @brief sleep by ns
  137. *
  138. * @param ns: ns
  139. * @return rt_err_t
  140. */
  141. rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns);
  142. /**
  143. * @brief sleep by us
  144. *
  145. * @param us: us
  146. * @return rt_err_t
  147. */
  148. rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us);
  149. /**
  150. * @brief sleep by ms
  151. *
  152. * @param ms: ms
  153. * @return rt_err_t
  154. */
  155. rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms);
  156. #endif