一、概述
1.创建软件定时器
void OSTmrCreate (OS_TMR *p_tmr, CPU_CHAR *p_name, OS_TICK dly, OS_TICK period, OS_OPT opt, OS_TMR_CALLBACK_PTR p_callback, void *p_callback_arg, OS_ERR *p_err)
- p_tmr:软件定时器对象
- p_name:软件定时器的名字
- dly:启动定时器后,延迟多长时间执行,默认隐含dly*10ms
- period:定时周期,默认隐含period*10ms
- opt:
- p_callback:软件定时器执行的回调函数 void MyCallback (OS_TMR *p_tmr, void *p_arg);
- p_callback_arg:传递参数给软件定时器的回调函数
- p_err:返回错误码,没有错误的就返回OS_ERR_NONE
- 单次触发
- 重复单次触发
- 周期性执行
2.启动软件定时器
CPU_BOOLEAN OSTmrStart (OS_TMR *p_tmr, OS_ERR *p_err)
- p_tmr:软件定时器对象
- p_err:返回错误码,没有错误的就返回OS_ERR_NONE
- DEF_TRUE is the timer was started
- DEF_FALSE if not or upon an error
3.停止软件定时器
CPU_BOOLEAN OSTmrStop (OS_TMR *p_tmr, OS_OPT opt, void *p_callback_arg, OS_ERR *p_err)
- p_tmr:软件定时器对象
- os_opt:默认参数,OS_OPT_TMR_NONE
- p_callback_arg:填写OSTmrCreate创建时传递给软件定时器arg的参数
- p_err:返回错误码,没有错误的就返回OS_ERR_NONE
- DEF_TRUE is the timer was started
- DEF_FALSE if not or upon an error
4.删除软件定时器
CPU_BOOLEAN OSTmrDel (OS_TMR *p_tmr, OS_ERR *p_err)
- p_tmr:软件定时器对象
- p_err:返回错误码,没有错误的就返回OS_ERR_NONE
- DEF_TRUE is the timer was started
- DEF_FALSE if not or upon an error
二、示例
1、创建1个软件定时器。
OS_TMR g_tmr; void mytimer_Callback (OS_TMR *p_tmr, void *p_arg) { printf("mytimer_Callback
"); } OSTmrCreate(&g_tmr,"g_tmr",0,100,OS_OPT_TMR_PERIODIC,(OS_TMR_CALLBACK_PTR)mytimer_Callback,NULL,&err);
2、创建2个软件定时器。
OS_TMR g_tmr1; OS_TMR g_tmr2; void mytimer_Callback (OS_TMR *p_tmr1, void *p_arg) { if(p_tmr1 == &g_tmr1) printf("gtmr1 mytimer_Callback "); if(p_tmr2 == &g_tmr2) printf("gtmr2 mytimer_Callback "); } OSTmrCreate(&g_tmr1,"g_tmr1",0,100,OS_OPT_TMR_PERIODIC,(OS_TMR_CALLBACK_PTR)mytimer_Callback,NULL,&err); OSTmrCreate(&g_tmr2,"g_tmr2",0,100,OS_OPT_TMR_PERIODIC,(OS_TMR_CALLBACK_PTR)mytimer_Callback,NULL,&err); OSTmrStart (&g_tmr1,&err); OSTmrStart (&g_tmr2,&err);
void timer_callback (OS_TMR *p_tmr, void *p_arg) { OS_ERR err; OS_FLAGS flags; printf("timer_callback ... "); OSFlagPend(&g_flag_grp, 0x03, 0, OS_OPT_PEND_FLAG_SET_ANY +OS_OPT_PEND_FLAG_CONSUME +OS_OPT_PEND_BLOCKING,NULL, &err); delay_ms(2000); }
三、定时器状态
四、实例
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "includes.h" //任务1控制块 OS_TCB Task1_TCB; void task1(void *parg); CPU_STK task1_stk[128]; //任务1的任务堆栈,大小为128字,也就是512字节 OS_TMR g_tmr; //软件定时器的对象 void MyCallback (OS_TMR *p_tmr, void *p_arg); //主函数 int main(void) { OS_ERR err; systick_init(); //时钟初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置 usart_init(9600); //串口初始化 LED_Init(); //LED初始化 //OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器 OSInit(&err); //创建任务1 OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块,等同于线程id (CPU_CHAR *)"Task1", //任务的名字,名字可以自定义的 (OS_TASK_PTR)task1, //任务函数,等同于线程函数 (void *)0, //传递参数,等同于线程的传递参数 (OS_PRIO)6, //任务的优先级6 (CPU_STK *)task1_stk, //任务堆栈基地址 (CPU_STK_SIZE)128/10, //任务堆栈深度限位,用到这个位置,任务不能再继续使用 (CPU_STK_SIZE)128, //任务堆栈大小 (OS_MSG_QTY)0, //禁止任务消息队列 (OS_TICK)0, //默认时间片长度 (void *)0, //不需要补充用户存储区 (OS_OPT)OS_OPT_TASK_NONE, //没有任何选项 &err //返回的错误码 ); if(err!=OS_ERR_NONE) { printf("task 1 create fail "); while(1); } //创建软件定时器 //启动软件定时器再延时 10*10ms才真正开始运行 //定时触发周期时间 200*10ms=2S //OS_OPT_TMR_PERIODIC:周期执行 OS_OPT_TMR_ONE_SHOT:只执行一次回调函数 //MyCallback 回调函数 //NULL ,不传递参数给MyCallback OSTmrCreate(&g_tmr,"g_tmr",10,200,OS_OPT_TMR_PERIODIC,(OS_TMR_CALLBACK_PTR)MyCallback,NULL,&err); OSTmrStart(&g_tmr,&err); //启动OS,进行任务调度 OSStart(&err); printf("....... "); while(1); } void task1(void *parg) { uint32_t t=0; printf("task1 is create ok "); while(1) { printf("task1 is running...... "); delay_ms(1000); } } void MyCallback (OS_TMR *p_tmr, void *p_arg)//回调函数 相当于你之前的定时器中断服务函数 { printf("MyCallback OK "); delay_ms(6000); //在回调函数中延时是没有作用的,和没延时一样。 }