UCOSII软件定时器

来源:互联网 发布:王晓东视频 算法 编辑:程序博客网 时间:2024/06/03 14:04

一、基本知识

1、创建定时器

OS_TMR  *OSTmrCreate

(       

        INT32U           dly,
        INT32U           period,
        INT8U            opt,
        OS_TMR_CALLBACK  callback,
        void            *callback_arg,
        INT8U           *pname,
        INT8U           *perr

)

入口参数解释:

(1)dly:延时时间(单位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)

如果参数opt为:OS_TMR_OPT_ONE_SHOT,则dly表示定时器超时时间

如果参数opt为:OS_TMR_OPT_PERIODIC,则dly表示定时器在开始循环模式前等待第一次启动的超时时间

(2)period:定时器重复运行的时间周期(单位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)
如果参数opt为:OS_TMR_OPT_PERIODIC,则period表示定时器自动周期重启的时间

如果参数opt为:OS_TMR_OPT_ONE_SHOT,则period无效

(3)opt:选择定时器运行模式

如果参数opt为:OS_TMR_OPT_PERIODIC,则表示定时器会自动重载超时时间,周期运行

如果参数opt为:OS_TMR_OPT_ONE_SHOT,则表示定时器只运行一次

(4)callback:超时处理回调函数(定时器中断服务程序)

必须定义成类似这种函数接口的形式:void MyCallback (OS_TMR *ptmr, void *p_arg);

当定时器时间到了,就执行这个函数

(5)callback_arg:当callback被调用时传递给callback的入口参数

(6)pname:定时器的名称(是一个字符串,如"Timer0")

(7)*perr:定时器错误码,是下面之一:

OS_ERR_NONE:没有错误
OS_ERR_TMR_INVALID_DLY:指定了一个无效的延时时间     
OS_ERR_TMR_INVALID_PERIOD:指定了一个无效的周期  
OS_ERR_TMR_INVALID_OPT:指定了一个无效的选项    
OS_ERR_TMR_ISR :在中断服务程序里调用错误           
OS_ERR_TMR_NON_AVAIL:定时器池里没有空闲的定时器

2、启动定时器

BOOLEAN  OSTmrStart (OS_TMR   *ptmr, INT8U    *perr)

这个函数是用来被应用程序调用,来启动定时器的。

入口参数解释:

(1)ptmr:指向待启动的定时器

(2)*perr:错误码

μC/OS-II定时器的创建、启动等函数不能在中断服务程序里调用

二、过程

于定时器相关的函数

OSTmrCreate();

OSTmrDel();

OSTmrNameGet();

OSTmrRemainGet();

OSTmrStateGet();

OSTmrStart();

OSTmrStop();

OSTmrSignal();

1、定义定时器 

2、创建定时器

3、写定时器回调函数

4、启动定时器

5、停止定时器

OS_TMR *timer1;//定时器OS_TMR *timer2;void timer1CallBack();//定时器回调函数void timer2CallBack();#define START_TASK_PRIO  10#define START_STK_SIZE   64OS_STK START_TASK_STK[START_STK_SIZE];void startTask(void *p_arg);#define SCAN_TASK_PRIO   7#define SCAN_STK_SIZE    64OS_STK  SCAN_TASK_STK[SCAN_STK_SIZE];void scanTask(void *p_arg);int main(){delay_init(168);LED_Init();KEY_Init();OSInit();OSTaskCreate(startTask, (void*)0, (OS_STK*)&START_TASK_STK[START_STK_SIZE - 1], START_TASK_PRIO);OSStart();}//开始任务,创建两个任务后在后面不再使用,删除掉开始任务void startTask(void *p_arg){OS_CPU_SR cpu_sr=0;INT8U  err = 0; p_arg = p_arg;OS_ENTER_CRITICAL();timer1 = OSTmrCreate(10, 10, OS_TMR_OPT_ONE_SHOT, timer1CallBack, (void*)0, "OS_TIMER1", &err);//创建定时器timer2 = OSTmrCreate(10, 10, OS_TMR_OPT_PERIODIC, timer2CallBack, (void*)0, "OS_TIMER2", &err);OSTaskCreate(scanTask, (void*)0, (OS_STK*)&SCAN_TASK_STK[SCAN_STK_SIZE - 1], SCAN_TASK_PRIO);//创建任务OSTaskSuspend(START_TASK_PRIO);OS_EXIT_CRITICAL();}//按键扫描任务void scanTask(void *p_arg){u8 key, num;INT8U  err = 0;p_arg = p_arg;while(1){key = KEY_Scan(0);switch(key){case WKUP_PRES:OSTmrStart(timer1, &err);//启动定时器break;case KEY0_PRES:OSTmrStart(timer2, &err);break;case KEY1_PRES://关闭定时器break;}OSTimeDlyHMSM(0, 0, 0, 10);}}//LED灯亮灭void timer1CallBack(){LED0 =~ LED0;}//LED灯亮灭void timer2CallBack(){LED1 =~ LED1;}


原创粉丝点击