main.c
//======================// main.c//======================#include #include "win32timer.h" // UserTimerSet(uDelay,UserFun)int cnt = 0;void myISR_Called_Per_1000ms(void);int main(void){ /* 每1000ms调用一次myISR_Called_Per_1000ms */ UserTimerSet ( 1000, myISR_Called_Per_1000ms ) ; while (cnt<10); return 0; }void myISR_Called_Per_1000ms(void){ printf("The Program has run %ds\n",cnt++);}
win32timer.h
/* * 使用说明: * * 1. 用户程序需要 #include "win32timer.h" ; * 2. 用户需要将 win32timer.c 添加至根目录,或添加至工程; * 3. 用户程序直接调用UserTimerSet(uDelay,UserFun); 即可, * 其中,uDelay为定时调用的定时周期,单位为毫秒(ms), * UserFun为用户被调函数void ISR(void)的函数名ISR。 * 4. 可以同时使用多个timeSetEvent,每个timeSetEvent都可以 * 返回定时器编号。 *///=======================// win32timer.h//=======================#ifndef __WIN32TIMER_H__#define __WIN32TIMER_H__void UserTimerSet ( unsigned int uDelay, void (*UserFun)(void) ) ;#endif // @ #ifndef __WIN32TIMER_H__win32timer.c
//=======================// win32timer.c//=======================#include #include "win32timer.h"#pragma comment(lib,"winmm.lib") //导入winmm.lib多媒体库/* 全局变量 */HANDLE mainhandle; //主线程句柄CONTEXT Context; //主线程切换上下文static void (*TimerCallFun)(void); //声明用户调用函数指针/* 函数声明 */static void __stdcall TimerISR(unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, unsigned long dw1, unsigned long dw2);//======================================================================================// 函数功能:用户需要调用的定时器设置(初始化)函数// 入口参数:uDelay:定时器定时时长,单位为ms// void (*UserFun)(void):指向用户函数 void fun (void) 的函数指针// 返 回 值:无//======================================================================================void UserTimerSet ( unsigned int uDelay, void (*UserFun)(void) ) { HANDLE cp,ct; TimerCallFun = UserFun; //得到用户被定时调用的函数的函数指针 Context.ContextFlags = CONTEXT_CONTROL; cp = GetCurrentProcess(); //得到当前进程句柄 ct = GetCurrentThread(); //得到当前线程伪句柄 DuplicateHandle( cp, ct, cp, &mainhandle, 0, TRUE, 2 ); //伪句柄转换,得到线程真句柄 /*模拟设置定时器中断,开启一个定时器线程*/ timeSetEvent( uDelay, 0, TimerISR, 0, TIME_PERIODIC ); /*如果需要取消定时器,则可以调用timeKillEvent()函数,详见MSDN*/}//======================================================================================// 函数功能:timeSetEvent需要定时调用的函数// 入口参数:unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, unsigned long dw1, unsigned long dw2,详见MSDN// 返 回 值:无//======================================================================================static void __stdcall TimerISR(unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, unsigned long dw1, unsigned long dw2){ SuspendThread(mainhandle); //中止主线程的运行,模拟中断产生.但没有保存寄存器 GetThreadContext(mainhandle, &Context); //得到主线程上下文,为切换任务做准备 //=========================================================================================== (*TimerCallFun)(); //或者TimerCallFun(); ———— 用户自定义实现的中断调用 //=========================================================================================== ResumeThread(mainhandle); //模拟中断返回,主线程得以继续执行}
取消
评论