| 本帖最后由 zhouwenbin1989 于 2011-3-31 13:48 编辑 
 24# 刘前辈
 前辈能帮我再看下这个软定时器吗?
 
 
 #define  IN_SOFT_TIMER
 #include "config.h"
 /* 软定时器的数据结构 */
 typedef SOFT_TIMER_MEM_SEL struct _TySoftTimerData
 {
 uint8 Falg;                                     /* 软定时器状态 */
 uint16 DelayTime;                               /* 软定时器运行时间 */
 void (const * Fuction)(void);                   /* 软定时器溢出调用的函数 */
 };
 #if MAX_SOFT_TIMER > 0
 uint16 SoftTimerCnt;                                /* 辅助定时器 */
 uint16 SoftTimerThisDelay;                          /* 辅助定时器初始值 */
 struct _TySoftTimerData SOFT_TIMER_MEM_SEL SoftTimerData[MAX_SOFT_TIMER];
 
 void SoftTimerSum(void)    //每次系统节拍处理时调用的函数,一个辅助定时器
 {
 if( --SoftTimerCnt == 0)
 {
 OSIntSendSignal(SOFT_TIMER_TASK_ID);
 }
 }
 void InitSoftTimer(void)//初始化软定时器模块
 {
 uint8 i;
 
 OS_ENTER_CRITICAL();
 for (i = 0; i < MAX_SOFT_TIMER; i++)
 {
 SoftTimerData.Falg = 0;
 SoftTimerData.DelayTime = 0;
 SoftTimerData.Fuction = NULL;
 }
 
 OS_EXIT_CRITICAL();
 }
 
 uint8 SoftTimerRun(uint8 Index, uint16 Delay, void (const * Fuction)(void))//运行一个软定时器
 {
 #if EN_SOFT_TIMER_CHK > 0
 if (Index >= MAX_SOFT_TIMER)
 {
 return NOT_OK;
 }
 #endif
 
 if (Delay != 0 && Fuction != NULL)
 {
 OS_ENTER_CRITICAL();
 SoftTimerData[Index].Fuction = Fuction;
 SoftTimerThisDelay -= SoftTimerCnt;
 SoftTimerCnt = 0;
 SoftTimerData[Index].DelayTime = Delay + SoftTimerThisDelay;
 SoftTimerData[Index].Falg &= ~SOFT_TIMER_TIMER_OUT;
 SoftTimerData[Index].Falg |= SOFT_TIMER_TIMER_RUN;
 OS_EXIT_CRITICAL();
 OSSendSignal(SOFT_TIMER_TASK_ID);
 return SOFT_TIMER_OK;
 }
 else
 {
 return NOT_OK;
 }
 }
 uint8 SoftTimerStop(uint8 Index)//停止一个正在运行的软定时器
 {
 #if EN_SOFT_TIMER_CHK > 0
 if (Index >= MAX_SOFT_TIMER)
 {
 return NOT_OK;
 }
 #endif
 
 OS_ENTER_CRITICAL();
 SoftTimerData[Index].DelayTime = 0;
 SoftTimerData[Index].Fuction = NULL;
 SoftTimerData[Index].Falg &= ~(SOFT_TIMER_TIMER_OUT | SOFT_TIMER_TIMER_RUN);
 OS_EXIT_CRITICAL();
 return SOFT_TIMER_OK;
 }
 void SoftTimer(void)  //软定时器管理任务
 {
 uint16 ThisDelay;
 uint8 i;
 
 SoftTimerCnt = 0;
 while (1)
 {
 OS_ENTER_CRITICAL(); //  找到定时最短的定时器
 ThisDelay = -1;
 for (i = 0; i< MAX_SOFT_TIMER; i++)
 {
 if (SoftTimerData.DelayTime != 0 &&
 SoftTimerData.DelayTime < ThisDelay)
 {
 ThisDelay = SoftTimerData.DelayTime;
 }
 }
 //  计算等待时间
 if (ThisDelay > -SoftTimerCnt)
 {
 SoftTimerCnt += ThisDelay;
 }
 else
 {
 SoftTimerCnt = 1;
 }
 SoftTimerThisDelay = ThisDelay;
 
 OSWait(K_SIG,0); //前面关中断到这句话后面才打开,中断都关了,那定时器怎么能唤起任务。??????
 ThisDelay = SoftTimerThisDelay;
 
 //  查询定时到的软定时器
 for (i = 0; i < MAX_SOFT_TIMER; i++)
 {
 SoftTimerData.Falg &= ~SOFT_TIMER_TIMER_OUT;
 if (SoftTimerData.DelayTime != 0)
 {
 if (SoftTimerData.DelayTime <= ThisDelay)
 {
 SoftTimerData.DelayTime = 0;
 if (SoftTimerData.Fuction != NULL)
 {
 SoftTimerData.Falg |= SOFT_TIMER_TIMER_OUT;
 }
 }
 else
 {
 SoftTimerData.DelayTime -= ThisDelay;
 }
 }
 }
 SoftTimerThisDelay = 0;
 OS_EXIT_CRITICAL();
 //  执行软定时器指定的任务
 for (i = 0; i < MAX_SOFT_TIMER; i++)
 {
 if (((SoftTimerData.Falg & SOFT_TIMER_TIMER_OUT) != 0) &&
 (SoftTimerData.Fuction != NULL))
 {
 SoftTimerData.Falg &= ~SOFT_TIMER_TIMER_OUT;
 SoftTimerData.Fuction();
 }
 }
 }
 }
 
 
 还有这里,在节拍函数中完成系统定时的计算和软定时器计数器的计算
 /* 将函数SoftTimerSum()挂接到函数OSTimeTick()的代码*/
 #ifdef IN_OS_CORE
 #define OSTimeTick    _OSTimeTick
 #else
 extern void _OSTimeTick(void);
 #define OSTimeTick    SoftTimerSum(),_OSTimeTick
 #endif
 
 这不是条件编译码,如果编译只能编译其中一块,另外一个文件中定义了IN_OS_CORE那么编译#define OSTimeTick    _OSTimeTick;
 extern void _OSTimeTick(void);
 #define OSTimeTick    SoftTimerSum(),_OSTimeTick这两句没法编译那怎么能将原来的OSTimeTick中包含SoftTimerSum(),_OSTimeTick。而且中间怎么是逗号啊。难道不是分号码。这样做怎么实现的两个函数挂接在一起啊。
 希望前辈能抽空帮我分析分析,感激不尽
 
 #endif
 |