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页;
概述:
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页;
相关文章推荐
- Linux 自检和 SystemTap
- 应用领航:盘点那些年我们一起追过的OS
- 无奇不有!盘点各国自己开发的操作系统
- LKRG:用于运行时完整性检查的可加载内核模块
- 一张图看尽 Linux 内核运行原理
- Greg Kroah-Hartman 解释内核社区是如何使 Linux 安全的
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- PowerShell实现时间管理小秘书
- C#实现判断操作系统是否为Win8以上版本
- js获取本机操作系统类型的两种方法
- Linux操作系统添加新硬盘方法
- Linux内核链表实现过程
- java如何获取本地操作系统进程列表
- Linux rdesktop操作系统下远程登录Windows XP桌面
- 32位操作系统认出超出4G内存的方法
- Linux rpm tar 操作系统下软件的安装与卸载方法
- JavaScript 获取用户客户端操作系统版本
- jsp 获取客户端的浏览器和操作系统信息
- Windows 操作系统的安全设置
- php判断当前操作系统类型