STimer.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*******************************************************************************
  2. * File Name: STimer.c
  3. * Function Describe: Soft Timer
  4. * Relate Module:
  5. * Explain: 针对RTX系统自带的定时器并不好用,特改进增加了本软定时器
  6. 支持设置回调函数,时间到调用相关回调函数,并且可在回调函数中重新设置定时器重新启动
  7. 需要注意的是:那个任务创建定时器,则哪个任务执行回调
  8. * Writer:ShiLiangWen
  9. * Date: 2015.11.6
  10. *******************************************************************************/
  11. #include <stm32f10x.h>
  12. #include "stdio.h"
  13. #include "STimer.h"
  14. #include <rtl.h>
  15. timer_t FirstTimer={0};//Timer列表中的第一个Timer.计时器永远从这个Timer中计时,时间到达后执行本Timer的Callback,然后将下一个Timer拷贝到本Timer.
  16. /***********************************************************************************
  17. *STimerCreate
  18. *初始化定时器
  19. 入口参数:
  20. Timer 定时器实例的指针,必须是实例
  21. CallBack 时间到的回调函数
  22. Param 回调函数的参数
  23. ************************************************************************************/
  24. void STimerCreate(timer_t *Timer,timer_cb_t CallBack,void *Param)
  25. {
  26. Timer->next=NULL;
  27. Timer->handler=CallBack;
  28. Timer->param=Param;
  29. Timer->tcnt=0;
  30. }
  31. /***********************************************************************************
  32. *STimerStart
  33. 启动定时器
  34. 入口参数:
  35. Timer 定时器实例的指针,必须是实例
  36. ************************************************************************************/
  37. void STimerStart(timer_t *Timer,uint32_t Interval)
  38. {
  39. p_timer_t p_tmr,p;
  40. uint32_t delta,itcnt = Interval;
  41. if (Interval == 0 || Timer == NULL) {
  42. return ;
  43. }
  44. p = (p_timer_t) &FirstTimer;
  45. tsk_lock ();
  46. delta = p->tcnt;
  47. while (delta < itcnt && p->next != NULL) {
  48. p = p->next;
  49. delta += p->tcnt;
  50. }
  51. /* Right place found, insert timer into the list */
  52. Timer->tcnt=Interval;
  53. Timer->next = p->next;
  54. Timer->tcnt = (U16)(delta - itcnt);
  55. p->next = Timer;
  56. p->tcnt -= Timer->tcnt;
  57. tsk_unlock ();
  58. }
  59. /***********************************************************************************
  60. *STimerStop
  61. 关停定时器。
  62. 入口参数:
  63. Timer 定时器实例的指针,必须是实例
  64. ************************************************************************************/
  65. void STimerStop(timer_t *Timer)
  66. {
  67. Timer->tcnt=0;
  68. }
  69. /***********************************************************************************
  70. 等待回调,应在任务主循环里执行
  71. ************************************************************************************/
  72. void STimerWaitCall(void)
  73. {
  74. }