small RTOS51原理及应用 ----笔记 第十六章 软定时器的实现

软定时器使用场合:

在这里插入图片描述

软定时器例子

在这里插入图片描述

发光二极管闪动的实现

初始化

        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();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值