1
0

ktime.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. struct rt_object parent; /**< inherit from rt_object */
  21. rt_list_t row;
  22. void *parameter;
  23. unsigned long init_cnt;
  24. unsigned long timeout_cnt;
  25. rt_err_t error;
  26. struct rt_completion completion;
  27. void (*timeout_func)(void *parameter);
  28. };
  29. typedef struct rt_ktime_hrtimer *rt_ktime_hrtimer_t;
  30. /**
  31. * @brief Get boottime with us precision
  32. *
  33. * @param tv: timeval
  34. * @return rt_err_t
  35. */
  36. rt_err_t rt_ktime_boottime_get_us(struct timeval *tv);
  37. /**
  38. * @brief Get boottime with s precision
  39. *
  40. * @param t: time_t
  41. * @return rt_err_t
  42. */
  43. rt_err_t rt_ktime_boottime_get_s(time_t *t);
  44. /**
  45. * @brief Get boottime with ns precision
  46. *
  47. * @param ts: timespec
  48. * @return rt_err_t
  49. */
  50. rt_err_t rt_ktime_boottime_get_ns(struct timespec *ts);
  51. /**
  52. * @brief Get cputimer resolution
  53. *
  54. * @return (resolution * RT_KTIME_RESMUL)
  55. */
  56. rt_uint64_t rt_ktime_cputimer_getres(void);
  57. /**
  58. * @brief Get cputimer frequency
  59. *
  60. * @return frequency
  61. */
  62. unsigned long rt_ktime_cputimer_getfrq(void);
  63. /**
  64. * @brief Get cputimer the value of the cnt counter
  65. *
  66. * @return cnt
  67. */
  68. unsigned long rt_ktime_cputimer_getcnt(void);
  69. /**
  70. * @brief Get cputimer the cnt value corresponding to 1 os tick
  71. *
  72. * @return step
  73. */
  74. unsigned long rt_ktime_cputimer_getstep(void);
  75. /**
  76. * @brief Init cputimer
  77. *
  78. */
  79. void rt_ktime_cputimer_init(void);
  80. /**
  81. * @brief Get hrtimer resolution
  82. *
  83. * @return (resolution * RT_KTIME_RESMUL)
  84. */
  85. rt_uint64_t rt_ktime_hrtimer_getres(void);
  86. /**
  87. * @brief Get hrtimer frequency
  88. *
  89. * @return frequency
  90. */
  91. unsigned long rt_ktime_hrtimer_getfrq(void);
  92. /**
  93. * @brief Get hrtimer the value of the cnt counter
  94. *
  95. * @return cnt
  96. */
  97. unsigned long rt_ktime_hrtimer_getcnt(void);
  98. /**
  99. * @brief set hrtimer timeout, when timeout, the timer callback will call timeout
  100. *
  101. * @param cnt: hrtimer requires a timing cnt value
  102. * @param timeout: timeout callback
  103. * @param param: parameter
  104. * @return rt_err_t
  105. */
  106. rt_err_t rt_ktime_hrtimer_settimeout(unsigned long cnt, void (*timeout)(void *param), void *param);
  107. void rt_ktime_hrtimer_init(rt_ktime_hrtimer_t timer,
  108. const char *name,
  109. unsigned long cnt,
  110. rt_uint8_t flag,
  111. void (*timeout)(void *parameter),
  112. void *parameter);
  113. rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer);
  114. rt_err_t rt_ktime_hrtimer_stop(rt_ktime_hrtimer_t timer);
  115. rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg);
  116. rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer);
  117. rt_inline void rt_ktime_hrtimer_keep_errno(rt_ktime_hrtimer_t timer, rt_err_t err)
  118. {
  119. RT_ASSERT(timer != RT_NULL);
  120. timer->error = err;
  121. rt_set_errno(-err);
  122. }
  123. void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer);
  124. void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer);
  125. /**
  126. * @brief sleep by the cputimer cnt value
  127. *
  128. * @param cnt: the cputimer cnt value
  129. * @return rt_err_t
  130. */
  131. rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt);
  132. /**
  133. * @brief sleep by ns
  134. *
  135. * @param ns: ns
  136. * @return rt_err_t
  137. */
  138. rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns);
  139. /**
  140. * @brief sleep by us
  141. *
  142. * @param us: us
  143. * @return rt_err_t
  144. */
  145. rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us);
  146. /**
  147. * @brief sleep by ms
  148. *
  149. * @param ms: ms
  150. * @return rt_err_t
  151. */
  152. rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms);
  153. #endif