软定时器使用场合:
软定时器例子
发光二极管闪动的实现
初始化
void TimeSum(void)
{
/* 初始化软定时器模块 */
InitSoftTimer();
/* 运行两个软定时器 */
SoftTimerRun(1,OS_TICKS_PER_SEC / 2,SoftTimerFunction2);
SoftTimerRun(2,OS_TICKS_PER_SEC * 4 + OS_TICKS_PER_SEC / 2,SoftTimerFunction3);
ShowCase[4] = ~0x00;
while (1)
{
OSWait(K_TMO,OS_TICKS_PER_SEC);
/* 计时并显示 */
... ...
}
}
发光二极管 闪烁
// 软定时器0运行的任务,与软定时器1配合使发光 二极管闪动
void SoftTimerFunction1(void)
{
ShowCase[4] = ~0xc0;
SoftTimerRun(1,(OS_TICKS_PER_SEC + 1) / 2,SoftTimerFunction2);
}
ddd
//软定时器1运行的任务,与软定时器0配合使发光 二极管闪动
void SoftTimerFunction2(void)
{
ShowCase[4] = ~0x00;
SoftTimerRun(0,OS_TICKS_PER_SEC / 2,SoftTimerFunction1);
}
数码管闪烁
//软定时器2运行的任务,与任务TimeSum配合使LED数码显示器闪动
void SoftTimerFunction3(void)
{
ShowCase[0] = ~0x00;
ShowCase[1] = ~0x00;
ShowCase[2] = ~0x00;
ShowCase[3] = ~0x00;
SoftTimerRun(2,OS_TICKS_PER_SEC * 4,SoftTimerFunction3);
}
软件定时器的实现
初始化软定时器模块
/* 软定时器的数据结构 */
typedef struct _TySoftTimerData
{
uint8 Falg; /* 软定时器状态 */
uint16 DelayTime; /* 软定时器运行时间 */
void (const * Fuction)(void); /* 软定时器溢出调用的函数 */
};
#define MAX_SOFT_TIMER 4 /* 最大软定时器数目
struct _TySoftTimerData SoftTimerData[MAX_SOFT_TIMER];
void InitSoftTimer(void)
{
uint8 i;
OS_ENTER_CRITICAL();
for (i = 0; i < MAX_SOFT_TIMER; i++)
{
SoftTimerData[i].Falg = 0;
SoftTimerData[i].DelayTime = 0;
SoftTimerData[i].Fuction = NULL;
}
OS_EXIT_CRITICAL();
}
启动定时器
运行一个软定时器
Index:软定时器的索引
Delay:延时时间
Fuction:定时器溢出执行的函数
//OSIntSendSignal 是增加一个准备运行的任务。
//由于SoftTimer 这个任务的优先级 比较低
//不会影响当前任务的执行
//所以不会中止当前任务的运行,而去执行SoftTimer
//OSClearSignal 是将那个任务的运行标志清除
//功能描述: 任务中给指定任务发送信号,既使指定任务就绪
void OSSendSignal(uint8 TaskId)
{
OSIntSendSignal(TaskId);
OSSched(); //开始任务切换
}
#define SOFT_TIMER_TASK_ID 2 /* 软定时器管理任务ID */
uint8 SoftTimerRun(uint8 Index, uint16 Delay, void (const * Fuction)(void))
{
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;
}
}
软定时器管理任务
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[i].DelayTime != 0 &&
SoftTimerData[i].DelayTime < ThisDelay)
{
ThisDelay = SoftTimerData[i].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[i].Falg &= ~SOFT_TIMER_TIMER_OUT;
if (SoftTimerData[i].DelayTime != 0)
{
if (SoftTimerData[i].DelayTime <= ThisDelay)
{
SoftTimerData[i].DelayTime = 0;
if (SoftTimerData[i].Fuction != NULL)
{
SoftTimerData[i].Falg |= SOFT_TIMER_TIMER_OUT;
}
}
else
{
SoftTimerData[i].DelayTime -= ThisDelay;
}
}
}
SoftTimerThisDelay = 0;
OS_EXIT_CRITICAL();
// 执行软定时器指定的任务
for (i = 0; i < MAX_SOFT_TIMER; i++)
{
if (((SoftTimerData[i].Falg & SOFT_TIMER_TIMER_OUT) != 0) &&
(SoftTimerData[i].Fuction != NULL))
{
SoftTimerData[i].Falg &= ~SOFT_TIMER_TIMER_OUT;
SoftTimerData[i].Fuction();
}
}
}
}