ucos-iii 软件定时器 以及时间管理

一 软件定时器相关函数

创建定时器OSTmrCreate()OS_CFG_TMR_EN

OS_TMR CloseDoorTmr;

OS_ERR err;

OSTmrCreate(&CloseDoorTmr, /* p_tmr */
                       “Door close” /* p_name */
                       10, /* dly */
                       100, /* period */
                        OS_OPT_TMR_PERIODIC, /* opt */
                         DoorCloseFnct, /* p_callback */
                         0, /* p_callback_arg */
                        &err); /* p_err */

删除定时器OSTmrDel()

OS_CFG_TMR_EN

OS_CFG_TMR_DEL_EN

OS_TMR CloseDoorTmr;

OS_ERR err;
CPU_BOOLEAN deleted;

deleted = OSTmrDel(&CloseDoorTmr,&err);

获取剩余时间OSTmrRemainGet()OS_CFG_TMR_EN

OS_TICK TimeRemainToCloseDoor;
OS_TMR CloseDoorTmr;

TimeRemainToCloseDoor =                           

             OSTmrRemainGet(&CloseDoorTmr,&err)

设置定时器OSTmrSet()OS_CFG_TMR_EN

OS_TMR CloseDoorTmr;

OS_ERR err;

OSTmrSet(&CloseDoorTmr, /* p_tmr */
                    10, /* dly */
                    100, /* period */
                     DoorCloseFnct, /* p_callback */
                     0, /* p_callback_arg */
                     &err); /* p_err */

定时器开始运行OSTmrStart()OS_CFG_TMR_EN

OS_TMR CloseDoorTmr;

OS_ERR err;
CPU_BOOLEAN status;

status = OSTmrStart(&CloseDoorTmr,&err);

获取定时器状态OSTmrStateGet()OS_CFG_TMR_EN

OS_STATE CloseDoorTmrState;

OS_TMR CloseDoorTmr;

CloseDoorTmrState = OSTmrStateGet(&CloseDoorTmr,&err);

停止定时器OSTmrStop()OS_CFG_TMR_EN

OS_TMR CloseDoorTmr;

OS_ERR err;
CPU_BOOLEAN is_stopped;

is_stopped = OSTmrStop(&CloseDoorTmr,
                      OS_TMR_OPT_CALLBACK,(void *)0,&err);

二  使用软件定时器

关于软件定时器,下面几点是必须要清楚的:

  • 软件定时器的精度比不上硬件定时器,所以适用于对时间精度要求不高的任务。
  • uCOS 软 件 定 时 器 的 精 度 取决于变 量OS_CFG_TMR_TASK_RATE_HZ 的值,默认值为10(即1S中10次)。
  • 定时器任务的频率 OS_CFG_TMR_TASK_RATE_HZ 的值不能大于系统时基频率 OS_CFG_TMR_TASK_RATE_HZ 的值。
  • 系统中必须要一个任务来管理所有的软件定时器

下面是一个简单的定时器任务与定时器回调函数例子:

CPU_TS             ts_start;       //时间戳变量
CPU_TS             ts_end; 

void TmrCallback (OS_TMR *p_tmr, void *p_arg) //软件定时器MyTmr的回调函数
{
    CPU_INT32U       cpu_clk_freq;
    
    printf ( "%s", ( char * ) p_arg );
    
    cpu_clk_freq = HAL_RCC_GetSysClockFreq();  //获取CPU时钟,时间戳是以该时钟计数
    ts_end = OS_TS_GET() - ts_start;              //获取定时后的时间戳(以CPU时钟进行计数的一个计数值)
    
    printf ( "\r\n定时1s,通过时间戳测得定时%04d ms。\r\n", ts_end / (cpu_clk_freq/1000) );//将定时时间折算成 ms
    ts_start = OS_TS_GET();                            //获取定时前时间戳
}


void  tmr_task( void * p_arg )
{
    OS_ERR      err;
    OS_TMR      my_tmr;   //声明软件定时器对象
    (void)p_arg;

    /* 创建软件定时器 */
    OSTmrCreate ((OS_TMR              *)&my_tmr,             //软件定时器对象
                 (CPU_CHAR            *)"MySoftTimer",       //命名软件定时器
                 (OS_TICK              )10,                  //定时器初始值,依10Hz时基计算,即为1s
                 (OS_TICK              )10,                  //定时器周期重载值,依10Hz时基计算,即为1s
                 (OS_OPT               )OS_OPT_TMR_PERIODIC, //周期性定时
                 (OS_TMR_CALLBACK_PTR  )TmrCallback,         //回调函数
                 (void                *)"Timer Over!",       //传递实参给回调函数
                 (OS_ERR              *)err);                //返回错误类型

    /* 启动软件定时器 */
    OSTmrStart(&my_tmr, &err);
    ts_start = OS_TS_GET();                       //获取定时前时间戳
                 
    while (DEF_TRUE) {                            //任务体,通常写成一个死循环
        OSTimeDly ( 1000, OS_OPT_TIME_DLY, &err ); //不断阻塞该任务
    }
}

三 时间管理相关函数

延时函数OSTimeDly() OSTimeDly(10,OS_OPT_TIME_PERIODIC,&err);
延时函数OSTimeDlyHMSM() OS_CFG_TIME_DLY_HMSM_ENOSTimeDlyHMSM (CPU_INT16U hours, //小时数
                               CPU_INT16U minutes, //分钟数
                               CPU_INT16U seconds, //秒数
                               CPU_INT32U milli,  //毫秒数
                               OS_OPT opt, //选项
                                   OS_ERR *err)
取消任务延时OSTimeDlyResume()OS_CFG_TIME_DLY_RESUME_EN

OS_TCB AnotherTaskTCB;

OS_ERR err;

OSTimeDlyResume(&AnotherTaskTCB,&err);

 OSTimeDynTick()OS_CFG_DYN_TICK_EN 
获取系统时间OSTimeGet() 

OS_TICK clk;
OS_ERR err;

clk = OSTimeGet(&err);

设置系统时间OSTimeSet() OSTimeSet(0,&err);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值