/******************************************************************************* * File Name: STimer.c * Function Describe: Soft Timer * Relate Module: * Explain: 针对RTX系统自带的定时器并不好用,特改进增加了本软定时器 支持设置回调函数,时间到调用相关回调函数,并且可在回调函数中重新设置定时器重新启动 需要注意的是:那个任务创建定时器,则哪个任务执行回调 * Writer:ShiLiangWen * Date: 2015.11.6 *******************************************************************************/ #include #include "stdio.h" #include "STimer.h" #include timer_t FirstTimer={0};//Timer列表中的第一个Timer.计时器永远从这个Timer中计时,时间到达后执行本Timer的Callback,然后将下一个Timer拷贝到本Timer. /*********************************************************************************** *STimerCreate *初始化定时器 入口参数: Timer 定时器实例的指针,必须是实例 CallBack 时间到的回调函数 Param 回调函数的参数 ************************************************************************************/ void STimerCreate(timer_t *Timer,timer_cb_t CallBack,void *Param) { Timer->next=NULL; Timer->handler=CallBack; Timer->param=Param; Timer->tcnt=0; } /*********************************************************************************** *STimerStart 启动定时器 入口参数: Timer 定时器实例的指针,必须是实例 ************************************************************************************/ void STimerStart(timer_t *Timer,uint32_t Interval) { p_timer_t p_tmr,p; uint32_t delta,itcnt = Interval; if (Interval == 0 || Timer == NULL) { return ; } p = (p_timer_t) &FirstTimer; tsk_lock (); delta = p->tcnt; while (delta < itcnt && p->next != NULL) { p = p->next; delta += p->tcnt; } /* Right place found, insert timer into the list */ Timer->tcnt=Interval; Timer->next = p->next; Timer->tcnt = (U16)(delta - itcnt); p->next = Timer; p->tcnt -= Timer->tcnt; tsk_unlock (); } /*********************************************************************************** *STimerStop 关停定时器。 入口参数: Timer 定时器实例的指针,必须是实例 ************************************************************************************/ void STimerStop(timer_t *Timer) { Timer->tcnt=0; } /*********************************************************************************** 等待回调,应在任务主循环里执行 ************************************************************************************/ void STimerWaitCall(void) { }