Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8938
  • 博文数量: 22
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-04 07:52
文章分类
文章存档

2012年(22)

我的朋友
最近访客

分类:

2012-12-04 07:53:47

原文地址:Linux_C定时器实现 作者:luozhiyong131


点击(此处)折叠或打开

  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. }
源码: timer.zip   
阅读(198) | 评论(0) | 转发(0) |
0

上一篇:随机数

下一篇:linux 下sqlite的 C编程

给主人留下些什么吧!~~