timer.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /**
  2. * 应用定时器 模块
  3. * Author:Lzy
  4. * Greate Date:2012.10.20
  5. */
  6. #include <stdio.h>
  7. #include <sys/ioctl.h>
  8. #include <string.h>
  9. #include <fcntl.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <sys/time.h>
  13. #include <signal.h>
  14. #include "timer.h"
  15. /**
  16. * 函数功能:创建一个应用定时器,时间片为10ms的倍数。
  17. * 本函数指定了定时器第一次定时时间和以后每次定时的时间,
  18. * 如果在创建应用定时器后不是立即允许运行,则需要以后调用
  19. * 控制应用定时器函数来激活定时器的运行
  20. * pcName:不大于8字节字符串,应用定时器的名字
  21. * ExpirationRoutine:定时器时间到时的处理函数
  22. * ulID:定时器处理函数用到的参数,用来区分同一处理函数不同事件
  23. * ulInitialTime:指定定时器初始化时间片
  24. * ulRescheduleTime:指定在第一次时间片到后每次定时的时间片,0表示定时器仅执行一次
  25. * uiEnable:4-->禁止应用定时器在创建完后运行,以后需要用ST_ControlTimer控制定时器运行
  26. * :5-->允许应用定时器在创建完后运行
  27. * phOSHandle( 出口): 创建的应用定时器句柄
  28. * 返回值:0x00------->创建成功
  29. */
  30. unsigned int ST_CreateAppTimer(const char *pcName, void (*ExpirationRoutine)(int), unsigned long ulID, unsigned long ulInitialTime, unsigned long ulRescheduleTime, int uiEnable, int *phOSHandle)
  31. {
  32. int timer_item;
  33. if (uiEnable < 4 || uiEnable > 5)
  34. return 0xFFFFFFFB; // 禁止和允许参数错误
  35. if (ulInitialTime == 0)
  36. return 0xFFFFFFF3; // 初始化时间片参数为0
  37. for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
  38. {
  39. if (hapi_timer[timer_item].id == 0)
  40. break;
  41. }
  42. memcpy(&hapi_timer[timer_item].timer_name, pcName, strlen(pcName));
  43. memset(&hapi_timer[timer_item].value, 0, sizeof(hapi_timer[timer_item].value));
  44. hapi_timer[timer_item].value.it_value.tv_sec = 0;
  45. hapi_timer[timer_item].value.it_value.tv_usec = 10000 * ulInitialTime;
  46. hapi_timer[timer_item].value.it_interval.tv_sec = 0;
  47. hapi_timer[timer_item].value.it_interval.tv_usec = ulRescheduleTime;
  48. if (uiEnable == 4)
  49. {
  50. setitimer(ITIMER_REAL, &hapi_timer[timer_item].value, 0);
  51. signal(SIGVTALRM, ExpirationRoutine);
  52. }
  53. else
  54. signal(SIGVTALRM, ExpirationRoutine);
  55. hapi_timer[timer_item].id = timer_item + 1;
  56. *phOSHandle = timer_item + 1;
  57. return 0;
  58. }
  59. /**
  60. * 函数功能:删除指定的应用定时器
  61. * phOSHandle( 入口):定时器句柄,由创建定时器函数获得
  62. * phOSHandle( 出口):删除成功后被设置成EM_INVALID_HANDLE,失败则不改变原来值
  63. * 返回值:0x00------->操作成功
  64. */
  65. unsigned int ST_DeleteAppTimer(int *phOSHandle)
  66. {
  67. int timer_item;
  68. for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
  69. {
  70. if (hapi_timer[timer_item].id == *phOSHandle)
  71. break;
  72. }
  73. if (timer_item >= TIMERNUM)
  74. return 0xFFFFFFDD;
  75. memset(&hapi_timer[timer_item], 0, sizeof(&hapi_timer[timer_item]));
  76. *phOSHandle = 0xFFFFFFE6;
  77. return 0;
  78. }
  79. /**
  80. * 函数功能:禁止或允许应用定时器运行,定时器是先前已经创建的
  81. * hOSHandle:指定应用定时器的句柄
  82. * uiEnable:---取值范围,EM_rtos_DISABLE_TIMER;实际值4,禁止应用定时器运行
  83. * ---取值范围,EM_rtos_ENABLE_TIMER;实际值5,允许应用定时器运行
  84. * 返回值: 0x00-->操作成功
  85. */
  86. unsigned int ST_ControlAppTimer(int hOSHandle, unsigned int uiEnable)
  87. {
  88. int timer_item;
  89. for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
  90. {
  91. if (hapi_timer[timer_item].id == hOSHandle)
  92. break;
  93. }
  94. if (timer_item >= TIMERNUM)
  95. return 0xFFFFFFE6;
  96. if (uiEnable < 4 || uiEnable > 5)
  97. return 0xFFFFFFFB;
  98. if (uiEnable == 4)
  99. {
  100. setitimer(ITIMER_REAL, &hapi_timer[timer_item].value, 0);
  101. }
  102. return 0;
  103. }
  104. /**
  105. * 函数功能:重新设置定时器,包括定时器处理程序,首次和以后时间,是否允许立即运行
  106. * hOSHandle:定时器句柄,由创建定时器函数获得
  107. * ExpirationRoutine:定时器时间到时的处理函数
  108. * ulInitialTime:指定定时器初始化时间片
  109. * ulRescheduleTime:指定在第一次时间片到后每次定时的时间片,0表示定时器仅执行一次
  110. * uiEnable: 4-->禁止应用定时器在重新设置完后运行,以后需要用ST_ControlTimer控制定时器运行
  111. * : 5-->允许应用定时器在重新设置完后运行
  112. * 返回值:0x00------->创建成功
  113. */
  114. unsigned int ST_ResetAppTimer(int hOSHandle, void (*ExpirationRoutine)(int), unsigned long ulInitialTime, unsigned long ulRescheduleTime, unsigned int uiEnable)
  115. {
  116. int timer_item;
  117. if (uiEnable < 4 || uiEnable > 5)
  118. return 0xFFFFFFFB;
  119. if (ulInitialTime == 0)
  120. return 0xFFFFFFF3;
  121. for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
  122. {
  123. if (hapi_timer[timer_item].id == hOSHandle)
  124. break;
  125. }
  126. memset(&hapi_timer[timer_item].value, 0, sizeof(&hapi_timer[timer_item].value));
  127. hapi_timer[timer_item].value.it_value.tv_sec = 0;
  128. hapi_timer[timer_item].value.it_value.tv_usec = 10000 * ulInitialTime;
  129. hapi_timer[timer_item].value.it_interval.tv_sec = 0;
  130. hapi_timer[timer_item].value.it_interval.tv_usec = ulRescheduleTime;
  131. if (uiEnable == 4)
  132. {
  133. setitimer(ITIMER_REAL, &hapi_timer[timer_item].value, 0);
  134. signal(SIGVTALRM, ExpirationRoutine);
  135. }
  136. else
  137. signal(SIGVTALRM, ExpirationRoutine);
  138. return 0;
  139. }