区别:
单片机的timer1-8:硬件定时器
UCOSIII提供:软件定时器
os_tmr.c文件中定义 软件定时器:本质,递减计数变量,当变量递减到=0,触发中断回调函数
与时间管理 延时函数的区别:
OSTimeDly (INT16U ticks) 他的最大参数才是65535个节拍。
但是OSTimeDlyHMSM所能定时的范围更广
1.软件定时器,有中断回调函数,时间到,执行某一函数;
时间延时,只是一个延时函数,没有回调函数
2.
调用OSTimeDly或者OSTimeDlyHMSM,意味着该任务CPU使用权会被没收,去执行其他任务了
然而你开启一个软件定时器OS_TMR之后,该任务还可以使用CPU。
时间分辨率的定义:os_cfg_app.h中
系统时钟周期:最小分辨率200HZ=5ms
#define OS_CFG_TICK_RATE_HZ 200u
软件定时器:最小分辨率100HZ=10ms,必须小于系统时钟周期
#define OS_CFG_TMR_TASK_RATE_HZ 100u
使能 宏定义:os_cfg.h中
#define OS_CFG_TMR_EN 1u
#define OS_CFG_TMR_DEL_EN 1u
定时器模式:
- 周期模式:OS_OPT_TMR_PERIODIC 带初始化延迟的,不带初始化延迟的
- 单次模式:OS_OPT_TMR_ONE_SHOT
UCOSIII软件定时器 结构体创建:
OS_TMR tmr1;
OS_TMR tmr2;
UCOSIII软件定时器 在main()中创建:
//创建软件定时器1、2
OSTmrCreate ( (OS_TMR *)&tmr1, //定时器分辨率10ms
(CPU_CHAR *)"tmr1",
(OS_TICK )500, //初始化延迟 500*10ms = 5s
(OS_TICK )100, //周期 100*10ms = 1s
(OS_OPT )OS_OPT_TMR_PERIODIC, //有初始化延迟的周期定时器模式
(OS_TMR_CALLBACK_PTR )tmr1_callback,
(void *)0,
(OS_ERR *)&err );
OSTmrCreate ( (OS_TMR *)&tmr2, //定时器分辨率10ms
(CPU_CHAR *)"tmr2",
(OS_TICK )200, //初始化后定时 200*10ms=2000ms
(OS_TICK )0, //无周期
(OS_OPT )OS_OPT_TMR_ONE_SHOT, //单次定时器模式
(OS_TMR_CALLBACK_PTR )tmr2_callback,
(void *)0,
(OS_ERR *)&err );
UCOSIII软件定时器回调函数
void tmr1_callback(void *p_tmr, void *p_arg)
{
static u8 cnt=0;
cnt++;
printf("%s cnt:%d \r\n",__FUNCTION__,cnt);
LED1=~LED1;
}
void tmr2_callback(void *p_tmr, void *p_arg)
{
static u8 cnt=0;
cnt++;
printf("%s cnt:%d \r\n",__FUNCTION__,cnt);
LED0=~LED0;
}
UCOSIII软件定时器的开启、关闭
在需要的任务中调用下面的函数, 定时器 才能正常工作
OSTmrStart(&tmr1,&err);//开启定时器1
OSTmrStart(&tmr2,&err);//开启定时器1
OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //关闭定时器1
OSTmrStop(&tmr2,OS_OPT_TMR_NONE,0,&err); //关闭定时器2