| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- /**
- * 应用定时器 模块
- * Author:Lzy
- * Greate Date:2012.10.20
- */
- #include <stdio.h>
- #include <sys/ioctl.h>
- #include <string.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/time.h>
- #include <signal.h>
- #include "timer.h"
- /**
- * 函数功能:创建一个应用定时器,时间片为10ms的倍数。
- * 本函数指定了定时器第一次定时时间和以后每次定时的时间,
- * 如果在创建应用定时器后不是立即允许运行,则需要以后调用
- * 控制应用定时器函数来激活定时器的运行
- * pcName:不大于8字节字符串,应用定时器的名字
- * ExpirationRoutine:定时器时间到时的处理函数
- * ulID:定时器处理函数用到的参数,用来区分同一处理函数不同事件
- * ulInitialTime:指定定时器初始化时间片
- * ulRescheduleTime:指定在第一次时间片到后每次定时的时间片,0表示定时器仅执行一次
- * uiEnable:4-->禁止应用定时器在创建完后运行,以后需要用ST_ControlTimer控制定时器运行
- * :5-->允许应用定时器在创建完后运行
- * phOSHandle( 出口): 创建的应用定时器句柄
- * 返回值:0x00------->创建成功
- */
- unsigned int ST_CreateAppTimer(const char *pcName, void (*ExpirationRoutine)(int), unsigned long ulID, unsigned long ulInitialTime, unsigned long ulRescheduleTime, int uiEnable, int *phOSHandle)
- {
- int timer_item;
- if (uiEnable < 4 || uiEnable > 5)
- return 0xFFFFFFFB; // 禁止和允许参数错误
- if (ulInitialTime == 0)
- return 0xFFFFFFF3; // 初始化时间片参数为0
- for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
- {
- if (hapi_timer[timer_item].id == 0)
- break;
- }
- memcpy(&hapi_timer[timer_item].timer_name, pcName, strlen(pcName));
- memset(&hapi_timer[timer_item].value, 0, sizeof(hapi_timer[timer_item].value));
- hapi_timer[timer_item].value.it_value.tv_sec = 0;
- hapi_timer[timer_item].value.it_value.tv_usec = 10000 * ulInitialTime;
- hapi_timer[timer_item].value.it_interval.tv_sec = 0;
- hapi_timer[timer_item].value.it_interval.tv_usec = ulRescheduleTime;
- if (uiEnable == 4)
- {
- setitimer(ITIMER_REAL, &hapi_timer[timer_item].value, 0);
- signal(SIGVTALRM, ExpirationRoutine);
- }
- else
- signal(SIGVTALRM, ExpirationRoutine);
- hapi_timer[timer_item].id = timer_item + 1;
- *phOSHandle = timer_item + 1;
- return 0;
- }
- /**
- * 函数功能:删除指定的应用定时器
- * phOSHandle( 入口):定时器句柄,由创建定时器函数获得
- * phOSHandle( 出口):删除成功后被设置成EM_INVALID_HANDLE,失败则不改变原来值
- * 返回值:0x00------->操作成功
- */
- unsigned int ST_DeleteAppTimer(int *phOSHandle)
- {
- int timer_item;
- for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
- {
- if (hapi_timer[timer_item].id == *phOSHandle)
- break;
- }
- if (timer_item >= TIMERNUM)
- return 0xFFFFFFDD;
- memset(&hapi_timer[timer_item], 0, sizeof(&hapi_timer[timer_item]));
- *phOSHandle = 0xFFFFFFE6;
- return 0;
- }
- /**
- * 函数功能:禁止或允许应用定时器运行,定时器是先前已经创建的
- * hOSHandle:指定应用定时器的句柄
- * uiEnable:---取值范围,EM_rtos_DISABLE_TIMER;实际值4,禁止应用定时器运行
- * ---取值范围,EM_rtos_ENABLE_TIMER;实际值5,允许应用定时器运行
- * 返回值: 0x00-->操作成功
- */
- unsigned int ST_ControlAppTimer(int hOSHandle, unsigned int uiEnable)
- {
- int timer_item;
- for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
- {
- if (hapi_timer[timer_item].id == hOSHandle)
- break;
- }
- if (timer_item >= TIMERNUM)
- return 0xFFFFFFE6;
- if (uiEnable < 4 || uiEnable > 5)
- return 0xFFFFFFFB;
- if (uiEnable == 4)
- {
- setitimer(ITIMER_REAL, &hapi_timer[timer_item].value, 0);
- }
- return 0;
- }
- /**
- * 函数功能:重新设置定时器,包括定时器处理程序,首次和以后时间,是否允许立即运行
- * hOSHandle:定时器句柄,由创建定时器函数获得
- * ExpirationRoutine:定时器时间到时的处理函数
- * ulInitialTime:指定定时器初始化时间片
- * ulRescheduleTime:指定在第一次时间片到后每次定时的时间片,0表示定时器仅执行一次
- * uiEnable: 4-->禁止应用定时器在重新设置完后运行,以后需要用ST_ControlTimer控制定时器运行
- * : 5-->允许应用定时器在重新设置完后运行
- * 返回值:0x00------->创建成功
- */
- unsigned int ST_ResetAppTimer(int hOSHandle, void (*ExpirationRoutine)(int), unsigned long ulInitialTime, unsigned long ulRescheduleTime, unsigned int uiEnable)
- {
- int timer_item;
- if (uiEnable < 4 || uiEnable > 5)
- return 0xFFFFFFFB;
- if (ulInitialTime == 0)
- return 0xFFFFFFF3;
- for (timer_item = 0; timer_item < TIMERNUM; timer_item++)
- {
- if (hapi_timer[timer_item].id == hOSHandle)
- break;
- }
- memset(&hapi_timer[timer_item].value, 0, sizeof(&hapi_timer[timer_item].value));
- hapi_timer[timer_item].value.it_value.tv_sec = 0;
- hapi_timer[timer_item].value.it_value.tv_usec = 10000 * ulInitialTime;
- hapi_timer[timer_item].value.it_interval.tv_sec = 0;
- hapi_timer[timer_item].value.it_interval.tv_usec = ulRescheduleTime;
- if (uiEnable == 4)
- {
- setitimer(ITIMER_REAL, &hapi_timer[timer_item].value, 0);
- signal(SIGVTALRM, ExpirationRoutine);
- }
- else
- signal(SIGVTALRM, ExpirationRoutine);
- return 0;
- }
|