本帖最后由 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 |