您的位置:首页 > 其它

4.时间管理、定时器管理

2016-06-09 14:17 344 查看
时间管理:

概述:

uCOS通过周期性时间中断来作为系统时序坐标,此即时钟节拍;

OS_CFG_TICK_RATE_HZ是os_cfg_app.h中配置时钟节拍频率的,常在10~1000Hz之间;

时钟节拍频率越大,精度越高,然而系统负担亦越大(上下文切换等);

uCOSIII不一定必须要时钟节拍(如低功耗时),但此时不可进行延时和超时判断而已;

相关函数:

函数OSTimeDly(OS_TICK
dly,
OS_OPT opt, OS_ERR *p_err);

函数调用此任务时会触发任务调度,停止执行直到延时结束;

该函数有三种模式,取决于第二个参数:

相对模式(OS_OPT_TIME_DLY):

第一个参数为延时的节拍的个数,下一个节拍算作第一个,此种有较大误差:

如图,该任务设置两个节拍的延时(假设一个节拍5ms),即10ms;

但事实上这个任务的优先级未知,其可能在这个节拍内处理次序很靠后;

其调用该延时函数后可能马上就进入了下一个节拍,所以误差较大(0~5ms);

周期模式(OS_OPT_TIME_PERIODIC):

功能是每隔若干个节拍任务被唤醒一次(很多不常用的任务就会每个一段时间唤醒一次);

虽然周期模式还是会有相对模式的误差弊端,但整体上每隔若干个节拍,其必会完成相关功能,可以考虑用来作为周期性延时;

绝对模式(OS_OPT_TIME_MATCH):

此时第一个参数的值时时钟节拍计数器OSTickCtr的值,而非一个对于当前节拍的相对值;

函数OSTimeDlyHMSM(CPU_INT16U
hours,
CPU_INT16U minutes,
CPU_INT16U seconds,
CPU_INT32U milli,
OS_OPT
opt,
OS_ERR *p_err);

前四个参数是需要延时时间长度(时/分/秒/毫秒),由于此函数只在相对模式下工作,故而定时进度取决于时钟频率;

当参数设为OS_OPT_TIME_HMSM_STRICT,前四个依次参数范围为0~99,0~59,0~59,0~999;当为OS_OPT_TIME_HMSM_NON_STRICT,依次为0~999,
0~9999, 0~65535, 0~2^32;

函数OSTimeDlyResume();

用来恢复其他调用了前两个函数的任务;

但延时的任务并不会知道其是被恢复的,还是以为自己是延时结束得到恢复的;

函数OSTimeGet();

获取系统自系统运行起来以后经历的时钟节拍计数器的值;

函数OSTimeSet();

设置系统自系统运行起来以后经历的时钟节拍计数器的值;

函数OSTimeTick();

是时钟节拍中断时必定会提供的操作;

该函数内一进入就是一个钩子函数(hook),用于用户对于节拍作额外操作,放在函数确保每次钩子函数之间接个均匀;

延迟发布时,系统读取当前时间戳信息,在中断缓冲队列放入信息,中断结束后中断缓冲队列向时钟节拍任务发信息;

直接模式时则直接向时钟节拍任务发信息,后者进行延时处理和超时判断;

定时器管理

基本介绍:

文件os_cfg.h中的OS_CFG_TMR_EN为1时启用定时器任务;

此处指的是软件定时器(一种内核对象),其频率由OS_CFG_TMR_TASK_RATE_HZ决定,此处定时器时基是时钟节拍,即每若干个时钟节拍定时器值-1,其定时精度不会很高;

每次定时器值减到0时,触发回调函数;

回调函数不可使用阻塞调用;

定时器相关函数:

定时器模式:

单次定时器:

创建后调用OSTmrStart(),启动定时器从延时值(dly)倒计数到0,调用回调函数后即停止;

计时中途(类似于喂狗)或者停止后再次调用OSTmrStart()函数,定时器又从初始值(dly)递减计数;

OSTmrStop()函数可以在定时器值未到0时终止计时,用户可自行决定是否调用回调函数;

无延迟周期定时器:

创建后调用OSTmrStart()定时器从周期值(period)开始计数,计数完成后,定时器调用回调函数,之后重新递减计数;

此过程中可随时使用OSTmrStart()重置定时器;

有初始延迟周期定时器:

创建后调用OSTmrStart()定时器从延迟值(dly)开始计数,计数完成后,定时器调用回调函数,之后则从周期值(period)重新递减计数,重复;

此过程中可随时使用OSTmrStart()重置定时器,从头开始上一过程;

定时器状态:

OSTmrStateGet()函数可以用来查看定时器状态;

OSTmrRemainGet()返回定时器到定时结束所剩的定时器节拍数;若定时器为停止状态,则为延迟值(dly,单次或延迟周期)或周期值(period);

周期模式可被OSTmrStop()变为停止态;未使用即系统不识别此状态;完成即定时器过期后状态;

定时器结构体及定时器任务:

结构体:

该结构体中第一个元素即为内核对象类型标志,定时器为OS_TMR(os.h);

结构体内表示时间的相关元素计算单位基本都是定时器时间基元;

定时器任务(OSTmrTask()系统任务):

该周期任务每个若干个时钟节拍(软件分频后)触发一次;

当该次时钟节拍ISR向OSTmrTask()发信号后,OSTmrTickCtr加1,定时器任务更新所有定时器;

所有定时器回调函数均在该任务内完成,占用该任务的时空资源(堆栈,时间片),故而不可触发等待事件;

回调函数执行顺序取决于其在定时器列表内的位置,且此时调度器都是上锁的;

定时器列表:

是一个构造思想和时钟节拍列表很像的循环数组,数组每一项都是一个链表的表头;

数组最大项数即由OS_CFG_TMR_WHEEL_SIZE;

具体看中文书P152页;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息