一 软件定时器相关函数
创建定时器 | OSTmrCreate() | OS_CFG_TMR_EN | OS_TMR CloseDoorTmr; OS_ERR err; OSTmrCreate(&CloseDoorTmr, /* p_tmr */ |
删除定时器 | OSTmrDel() | OS_CFG_TMR_EN OS_CFG_TMR_DEL_EN | OS_TMR CloseDoorTmr; OS_ERR err; deleted = OSTmrDel(&CloseDoorTmr,&err); |
获取剩余时间 | OSTmrRemainGet() | OS_CFG_TMR_EN | OS_TICK TimeRemainToCloseDoor; TimeRemainToCloseDoor = OSTmrRemainGet(&CloseDoorTmr,&err) |
设置定时器 | OSTmrSet() | OS_CFG_TMR_EN | OS_TMR CloseDoorTmr; OS_ERR err; OSTmrSet(&CloseDoorTmr, /* p_tmr */ |
定时器开始运行 | OSTmrStart() | OS_CFG_TMR_EN | OS_TMR CloseDoorTmr; OS_ERR err; 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; is_stopped = OSTmrStop(&CloseDoorTmr, |
二 使用软件定时器
关于软件定时器,下面几点是必须要清楚的:
- 软件定时器的精度比不上硬件定时器,所以适用于对时间精度要求不高的任务。
- 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_EN | OSTimeDlyHMSM (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; clk = OSTimeGet(&err); | |
设置系统时间 | OSTimeSet() | OSTimeSet(0,&err); |