⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 softtimer.c

📁 Small RTOSv1.12.x 下dp-51例子, 包括完整的原程序和说明
💻 C
字号:
/*********************************************************************************************************
**				                               Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2002, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.12.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: SoftTimer.C
**创   建   人: 陈明计
**最后修改日期:  2003年3月30日
**描        述: 软定时器源程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.00
** 日 期: 2003年2月16日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年3月30日
** 描 述: 增加注释
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#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];

/*********************************************************************************************************
** 函数名称: SoftTimerSum
** 功能描述: 每次系统节拍处理时调用的函数,一个辅助定时器
** 输 入: 无
** 输 出: 无
** 全局变量: SoftTimerCnt
** 调用模块: OSIntSendSignal()
**
** 作 者: 陈明计
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void SoftTimerSum(void)
{        
    if( --SoftTimerCnt == 0)
    {
        OSIntSendSignal(SOFT_TIMER_TASK_ID);
    }
}

/*********************************************************************************************************
** 函数名称: InitSoftTimer
** 功能描述: 初始化软定时器模块
** 输 入: 无
** 输 出: 无
** 全局变量: SoftTimerData
** 调用模块: OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陈明计
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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();
}

/*********************************************************************************************************
** 函数名称: SoftTimerRun
** 功能描述: 运行一个软定时器
** 输 入: Index:软定时器的索引
**        Delay:延时时间
**        Fuction:定时器溢出执行的函数
** 输 出: NOT_OK:参数错误
**        SOFT_TIMER_OK:操作正确
** 全局变量: SoftTimerData
** 调用模块: OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陈明计
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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;
    }
}

/*********************************************************************************************************
** 函数名称: SoftTimerStop
** 功能描述: 停止一个正在运行的软定时器
** 输 入: Index:软定时器的索引
** 输 出: NOT_OK:软定时器不存在
**        SOFT_TIMER_OK:操作成功
** 全局变量: SoftTimerData
** 调用模块: OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陈明计
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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;
}

/***************软定时器任务***************************************/

/*********************************************************************************************************
** 函数名称: SoftTimer
** 功能描述: 软定时器管理任务
** 输 入: 无
** 输 出: 无
** 全局变量: SoftTimerCnt,SoftTimerData,SoftTimerThisDelay
** 调用模块: OSWait(),OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陈明计
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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();
            }
        }
    }
}

#endif
/**********************end****************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -