uCOS的软件定时器、uCOS时钟节拍和滴答定时器的关系
uCOS2.81后的版本中有软件定时器的概念,如果要开启定时器任务,需要在OS_CFG.H文件中 #define OS_TMR_EN 1
软件定时器其实跟硬件中断是相似的,定时时间到了,就执行一次回调函数,虽然好用,但是也会降低系统的实时性。
软件定时器也需要一个时钟节拍驱动,这个驱动也是由硬件实现的,一般使用uCOS中的任务延时节拍驱动来驱动软件定时器,每个时钟节拍OSTmrCtr(全局变量,初始值为0)加1,当OSTmrCtr的值等于OS_TICKS_PER_SEC /OS_TMR_CFG_TICKS_PER_SEC(前者是ucos节拍频率,后者是软件定时器的节拍频率,相当于分频)时,调用函数OSTmrSignl()函数,发送信号量OSTmrSemSignal(初始值0,决定软件定时器扫描任务OSTmr_Task的运行),也就是说,对软件定制器的处理不在时钟节拍中断函数中执行,而是以发生信号量的方式激活任务OSTmr_Task,任务OSTmr_Task对定时器进行检测,包括定时器定时完成的判断,回调函数的执行。
举例来讲,ucos中的OS_TICKS_PER_SEC设定值为1000(最大),OS_TMR_CFG_TICKS_PER_SEC为100,则可知uCOS的节拍时间为1ms,软件定时器的节拍时间为1000/100*1=10ms
在软件定时器的生成函数中:
OS_TMR *OSTmrCreate (INT32U dly,
INT32U period,
INT8U opt,
OS_TMR_CALLBACK callback,
void *callback_arg,
INT8U *pname,
INT8U *perr)
其中dly表示第一次延时时间节拍数(软件定时器节拍,不是ucos的节拍)
period表示重复节拍数,如果设定dly为10,period为20,opt设定OS_TMR_OPT_PERIODIC,则表示这是1个重复执行软件定时器,第一次执行定时时间为10x10=100ms,以后每隔20x10=200ms的间隔时间执行回调函数。
uCOS2.81后的版本中有软件定时器的概念,软件定时器其实跟硬件中断是相似的,定时时间到了,就执行一次回调函数,虽然好用,但是也会降低系统的实时性。
软件定时器也需要一个时钟节拍驱动,这个驱动也是由硬件实现的,一般使用uCOS中的任务延时节拍驱动来驱动软件定时器,每个时钟节拍OSTmrCtr(全局变量,初始值为0)加1,当OSTmrCtr的值等于OS_TICKS_PER_SEC /OS_TMR_CFG_TICKS_PER_SEC(前者是ucos节拍频率,后者是软件定时器的节拍频率,相当于分频)时,调用函数OSTmrSignl()函数,发送信号量OSTmrSemSignal(初始值0,决定软件定时器扫描任务OSTmr_Task的运行),也就是说,对软件定制器的处理不在时钟节拍中断函数中执行,而是以发生信号量的方式激活任务OSTmr_Task,任务OSTmr_Task对定时器进行检测,包括定时器定时完成的判断,回调函数的执行。
举例来讲,ucos中的OS_TICKS_PER_SEC设定值为1000(最大),OS_TMR_CFG_TICKS_PER_SEC为100,则可知uCOS的节拍时间为1ms,软件定时器的节拍时间为1000/100*1=10ms
在软件定时器的生成函数中:
OS_TMR *OSTmrCreate (INT32U dly,
INT32U period,
INT8U opt,
OS_TMR_CALLBACK callback,
void *callback_arg,
INT8U *pname,
INT8U *perr)
其中dly表示第一次延时时间节拍数(软件定时器节拍,不是ucos的节拍)
period表示重复节拍数,如果设定dly为10,period为20,opt设定OS_TMR_OPT_PERIODIC,则表示这是1个重复执行软件定时器,第一次执行定时时间为10x10=100ms,以后每隔20x10=200ms的间隔时间执行回调函数。
===========================================
uCOS时钟节拍和滴答定时器的关系
在使用uCOS时,有一个非常重要,非常关键的概念就是操作系统的时钟节拍,uCOS的时钟节拍来源于滴答定时器,滴答定时器按照设定的时间不停的计时和产生中断,在uCOS-III中滴答定时器的中断服务函数如下:
void OS_CPU_SysTickHandler (void)
{
CPU_SR_ALLOC();
CPU_CRITICAL_ENTER();
OSIntNestingCtr++; /* Tell uC/OS-III that we are starting an ISR */
CPU_CRITICAL_EXIT();
OSTimeTick(); /* Call uC/OS-III's OSTimeTick() */
OSIntExit(); /* Tell uC/OS-III that we are leaving the ISR */
}
其中OSTimeTick();的作用是检查每个任务的任务控制块中OSTCBDly减1后是否为0(翻译过来就是检查任务延时函数OSTimeDly中的节拍数是否减为0了),如果是,则表明这个任务刚才是挂起状态,此时应变为就绪态,接着在任务中OSTimeDly函数进行一次任务调度。
所以可以得出一个重要关系:
滴答定时器的中断时间 = uCOS的1个节拍时间
这个节拍就是OSTimeDly (OS_TICK dly, OS_OPT opt,OS_ERR *p_err)函数中的dly。
在uCOS-III中针对节拍的时间有如下定义:
/* ------------------------ TICKS ----------------------- */
#define OS_CFG_TICK_RATE_HZ 1000u /* Tick rate in Hertz (10 to 1000 Hz) */
这个OS_CFG_TICK_RATE_HZ表示节拍的频率,如果设定为1000,则表示频率为1000Hz,则1个节拍为1ms。
那么问题来了,如果想要uCOS-III的节拍时间为1ms,如何设定滴答定时器的reload数值呢?
通过上面的分析可知,我们只需要设定滴答定时器的中断时间为1ms即可,以STM32为例,典型的系统时钟频率为72MHz(外部晶振选择为8MHz),滴答定时器时钟源也选择为HCLK(不是除以8),
则滴答定时器计数1次的时间为:1/72000000 s
要想中断时间为1ms = 1/1000 s,则reload = (1/10000)/(1/72000000) = 72000
而72000 = 72000000(系统时钟)/1000(OS_CFG_TICK_RATE_HZ)
所以在设定滴答定时器初始化函数时,只需设定:
SysTick_Config(SystemCoreClock/OS_CFG_TICK_RATE_HZ);
就能满足uCOS-III想要的节拍时间了。
摘自:https://blog.csdn.net/u012351051/article/details/51262503
uCOS的软件定时器、uCOS时钟节拍和滴答定时器的关系的更多相关文章
- Cortex-M0系统滴答定时器Systick详解
上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...
- STM32之系统滴答定时器
一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...
- 系统滴答定时器(SysTick)中断配置
系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...
- STM32 的系统滴答定时器( Systick) 彻底研究解读
作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一 ...
- HAL库与Cubemx系列|Systick-系统滴答定时器详解
Systick是什么? 关于Systick,在Context-M3权威指南中如此描述: SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15).在以前,大多操作系统需要一 ...
- STM32 - SYSTICK(系统滴答定时器)
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目 ...
- uCos 没有延时Tick滴答定时器测试
原来学uCos只是表面,今天才发现uCos没有心跳也是可以活的,只是延时功能. 即:OSTimeDly.OSTimexxx 头的功能不能使用. 如果有是用OSTimexxx,任务将会卡死.其实,OST ...
- 利用滴答定时器(SysTick)实现简单的延时函数
预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...
- RTX——第12章 系统时钟节拍和时间管理
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 RTX 操作系统的时钟节拍和时间管理函数,其中时间管理函数是 RTX 的基本函数,初学 ...
随机推荐
- MS4W安装教程
简介 欢迎使用MS4W,这是由Gateway Geomatics开发的快速简便的安装程序,用于为Windows及其附带应用程序(如Geomoose.MapBender.Openlayers等)设置Ma ...
- [CSP-S模拟测试]:count(树分块)
题目描述 李华终于逃离了无尽的英语作文,重获自由的他对一棵树产生了兴趣.首先,他想知道一棵树是否能分成大小相同的几块(即切掉一些边,使得每个连通块的点数相同).然后,他觉得这个问题过于简单,于是他想知 ...
- Matplotlib系列(四)--plt.bar与plt.barh条形图
(一)竖条条形图 参数说明 参数 说明 类型 x x坐标 int,float height 条形的高度 int,float width 线条的宽度 0~1,默认是0.8 botton 条形的起始位置 ...
- Apache检查配置文件语法
Windows环境:httpd -t或者: httpd.exe -w -t -f "C:\Apache2.2\conf\httpd.conf" -d "C:\Apache ...
- jmeter之关联的使用(正则、json)
部分接口的测试中,一个接口会依赖上一个接口的响应信息,但上一个接口的响应信息又不是固定不变的,这时候,需要提取上一个接口的响应信息,将二者每一次的信息关联起来 目录 1.应用场景 2.jmeter正则 ...
- Mac009--Axure RP安装
Mac--Axure RP安装 一.下载Axure RP8.0 下载网址:https://www.axure.com/download (下载mac版本) Axure RP说明: Axure RP是 ...
- Synchronized 详解
为了方便记忆,将锁做如下的分类 一.对象锁 包括方法锁(默认锁对象为this,当前实例对象)和同步代码块锁(自己指定锁对象) 1.代码块形式:手动指定锁定对象,也可是是this,也可以是自定义的锁 p ...
- js提交map类型参数
方式一:使用 xmlHttpRequest 对象发送数据 function sendMapPost(map, url){ var xmlHttpRequest = createXMLHttpReque ...
- mybatis使用Dao和Mapper方式
1.配置jdcp.properties数据库连接文件 #mysql database setting jdbc.type=mysql jdbc.driver=com.mysql.jdbc.Driver ...
- Codeforces - 1195E - OpenStreetMap - 单调队列
https://codeforc.es/contest/1195/problem/E 一个能运行但是会T的版本,因为本质上还是\(O(nmab)\)的算法.每次\(O(ab)\)初始化矩阵中的可能有用 ...