timer.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. #ifndef SYS_TIMER_H
  2. #define SYS_TIMER_H
  3. #include "typedef.h"
  4. #include "generic/list.h"
  5. struct static_sys_timer {
  6. void (*func)(void *priv);
  7. void *priv;
  8. u32 msec;
  9. u32 jiffies;
  10. };
  11. struct sys_usec_timer {
  12. void (*func)(void *priv);
  13. void *priv;
  14. const char *owner;
  15. struct sys_cpu_timer *timer;
  16. };
  17. #define SYS_HI_TIMER_ADD(_func, _priv, _msec) \
  18. static struct static_sys_timer hi_timer sec(.hi_timer) = { \
  19. .func = _func, \
  20. .priv = _priv, \
  21. .msec = _msec, \
  22. }
  23. extern struct static_sys_timer static_hi_timer_begin[];
  24. extern struct static_sys_timer static_hi_timer_end[];
  25. #define list_for_each_static_hi_timer(p) \
  26. for (p=static_hi_timer_begin; p<static_hi_timer_end; p++)
  27. struct sys_cpu_timer {
  28. u8 busy;
  29. void *priv;
  30. void (*set)(u32 usec);
  31. void (*unset)();
  32. };
  33. #define DEFINE_SYS_CPU_TIMER(t) \
  34. struct sys_cpu_timer t sec(.sys_cpu_timer);
  35. #define REGISTER_SYS_CPU_TIMER(t) \
  36. struct sys_cpu_timer t sec(.sys_cpu_timer)
  37. extern struct sys_cpu_timer sys_cpu_timer_begin[];
  38. extern struct sys_cpu_timer sys_cpu_timer_end[];
  39. #define list_for_each_cpu_usec_timer(p) \
  40. for (p = sys_cpu_timer_begin; p < sys_cpu_timer_end; p++)
  41. /*
  42. * System Timer
  43. */
  44. /**
  45. * @brief 添加ms级系统非timeout类型定时任务。
  46. *
  47. * @param [in] priv 定时任务处理函数的输入参数
  48. * @param [in] func 定时任务处理函数
  49. * @param [in] msec 定时时间
  50. *
  51. * @return 定时器分配的ID
  52. *
  53. * @note
  54. * 1、系统会进入低功耗,节拍不会丢失,定时结束会唤醒系统;
  55. * 2、sys_timer由systimer线程提供时基,属于同步接口,
  56. * 也就是说在哪个线程add的sys_timer,当定时时基到了,
  57. * systimer线程会发事件通知对应的add线程响应(回调函数被执行);
  58. * 3、与sys_timer_del成对使用。
  59. */
  60. u16 sys_timer_add(void *priv, void (*func)(void *priv), u32 msec);
  61. /**
  62. * @brief 删除ms级非timeout类型定时任务。
  63. *
  64. * @param [in] id 要删除的任务ID
  65. *
  66. * @note
  67. * 1、与sys_timer_add成对使用。
  68. */
  69. void sys_timer_del(u16);
  70. /**
  71. * @brief 添加ms级系统timeout类型定时任务。
  72. *
  73. * @param [in] priv 定时任务处理函数的输入参数
  74. * @param [in] func 定时任务处理函数
  75. * @param [in] msec 定时时间
  76. *
  77. * @return 定时器分配的id号
  78. *
  79. * @note
  80. * 1、系统会进入低功耗,节拍不会丢失,定时结束会唤醒系统;
  81. * 2、sys_timeout由systimer线程提供时基,属于同步接口,
  82. * 也就是说在哪个线程add的sys_timeout,定时时基到了
  83. * systimer线程会发事件通知对应的add线程响应(回调函数被执行);
  84. * 3、timeout回调只会被执行一次;
  85. * 4、与sys_timerout_del成对使用。
  86. */
  87. u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec);
  88. /**
  89. * @brief 删除ms级timeout类型定时任务。
  90. *
  91. * @param [in] id 要删除的任务ID
  92. *
  93. * @note
  94. * 1、与sys_timerout_add成对使用。
  95. */
  96. void sys_timeout_del(u16);
  97. /**
  98. * @brief 重置ms级定时任务定时时间。
  99. *
  100. * @param [in] id 要修改的任务ID
  101. *
  102. * @note
  103. * 1、重置之后重新计时。
  104. */
  105. void sys_timer_re_run(u16 id);
  106. /**
  107. * @brief 修改ms级定时任务处理函数的输入参数。
  108. *
  109. * @param [in] id 要修改的任务ID
  110. * @param [in] priv 处理函数的输入参数
  111. */
  112. void sys_timer_set_user_data(u16 id, void *priv);
  113. /**
  114. * @brief 获取ms级定时任务处理函数的输入参数的值。
  115. *
  116. * @param [in] id 要获取处理函数的输入参数值的任务ID
  117. *
  118. * @return 返回add时的私有参数
  119. *
  120. * @note
  121. * 1、如果有通过sys_timer_set_user_data重新设置私有参数,
  122. * 则返回的是设置后的私有参数。
  123. */
  124. void *sys_timer_get_user_data(u16 id);
  125. /*-----------------------------------------------------------*/
  126. /*
  127. * System Usec Timer
  128. */
  129. int sys_timer_modify(u16 id, u32 msec);
  130. int sys_usec_timer_add(void *priv, void (*func)(void *priv), u32 usec);
  131. void sys_usec_timer_schedule(struct sys_cpu_timer *);
  132. void sys_usec_timer_set(int _t, u32 usec);
  133. void sys_usec_timer_del(int);
  134. void sys_timer_dump_time(void);
  135. u32 sys_timer_get_ms(void);
  136. /*-----------------------------------------------------------*/
  137. /*
  138. * Usr Timer
  139. */
  140. void usr_timer_schedule();
  141. /**
  142. * @brief usr_timer定时扫描增加接口
  143. *
  144. * @param [in] priv 私有参数
  145. * @param [in] func 定时扫描回调函数
  146. * @param [in] msec 定时时间, 单位:毫秒
  147. * @param [in] priority 优先级,范围:0/1
  148. *
  149. * @return 定时器分配的id号
  150. *
  151. * @note
  152. * 1、usr_timer的参数priority(优先级)为1,使用该类定时器,系统无法进入低功耗;
  153. * 2、usr_timer的参数priority(优先级)为0,使用该类定时器,系统低功耗会忽略该节拍,节拍不会丢失,但是定时周期会变;
  154. * 3、usr_timer属于异步接口, add的时候注册的扫描函数将在硬件定时器中时基到时候被调用;
  155. * 4、对应释放接口usr_timer_del。
  156. */
  157. u16 usr_timer_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority);
  158. /**
  159. * @brief usr_timer超时增加接口
  160. *
  161. * @param [in] priv 私有参数
  162. * @param [in] func 超时回调函数
  163. * @param [in] msec 定时时间, 单位:毫秒
  164. * @param [in] priority 优先级,范围:0/1
  165. *
  166. * @return 定时器分配的id号
  167. *
  168. * @note
  169. * 1、usr_timerout的参数priority(优先级)为1,使用该类定时器,系统无法进入低功耗;
  170. * 2、usr_timerout的参数priority(优先级)为0,使用该类定时器,系统低功耗会忽略该节拍,节拍不会丢失,但是定时周期会变;
  171. * 3、usr_timerout属于异步接口, add的时候注册的扫描函数将在硬件定时器中时基到时候被调用;
  172. * 4、对应释放接口usr_timerout_del;
  173. * 5、timeout回调只会被执行一次。
  174. */
  175. u16 usr_timeout_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority);
  176. /**
  177. * @brief usr_timer修改定时扫描时间接口
  178. *
  179. * @param [in] id usr_timer_add时分配的id号
  180. * @param [in] msec 定时时间,单位:毫秒
  181. */
  182. int usr_timer_modify(u16 id, u32 msec);
  183. /**
  184. * @brief usr_timerout修改超时时间接口
  185. *
  186. * @param [in] id usr_timerout_add时分配的id号
  187. * @param [in] msec 定时时间,单位:毫秒
  188. */
  189. int usr_timeout_modify(u16 id, u32 msec);
  190. /**
  191. * @brief usr_timer删除接口
  192. *
  193. * @param [in] id usr_timer_add时分配的id号
  194. *
  195. * @note
  196. * 1、注意与usr_timer_add成对使用。
  197. */
  198. void usr_timer_del(u16 id);
  199. /**
  200. * @brief usr_timeout删除接口
  201. *
  202. * @param [in] id usr_timerout_add时分配的id号
  203. *
  204. * @note
  205. * 1、注意与usr_timerout_add成对使用。
  206. */
  207. void usr_timeout_del(u16 id);
  208. /**
  209. * @brief usr_time输出调试信息
  210. *
  211. * @note
  212. * 1.调试时可用;
  213. * 2.将输出所有被add定时器的id及其时间(msec)。
  214. */
  215. void usr_timer_dump(void);
  216. /*-----------------------------------------------------------*/
  217. /*
  218. * For Compatible
  219. */
  220. #define sys_hi_timer_schedule()\
  221. usr_timer_schedule()
  222. #define sys_hi_timer_add(a, b, c)\
  223. usr_timer_add(a, b, c, 1)
  224. #define sys_hi_timeout_add(a, b, c)\
  225. usr_timeout_add(a, b, c, 1)
  226. #define sys_hi_timer_modify(a, b)\
  227. usr_timer_modify(a, b)
  228. #define sys_hi_timeout_modify(a, b)\
  229. usr_timeout_modify(a, b)
  230. #define sys_hi_timer_del(a)\
  231. usr_timer_del(a)
  232. #define sys_hi_timeout_del(a)\
  233. usr_timeout_del(a)
  234. #define sys_s_hi_timer_add(a, b, c)\
  235. usr_timer_add(a, b, c, 0)
  236. #define sys_s_hi_timerout_add(a, b, c)\
  237. usr_timeout_add(a, b, c, 0)
  238. #define sys_s_hi_timer_modify(a, b)\
  239. usr_timer_modify(a, b)
  240. #define sys_s_hi_timeout_modify(a, b)\
  241. usr_timeout_modify(a, b)
  242. #define sys_s_hi_timer_del(a)\
  243. usr_timer_del(a)
  244. #define sys_s_hi_timeout_del(a)\
  245. usr_timeout_del(a)
  246. #endif