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时钟节拍和滴答定时器的关系的更多相关文章

  1. Cortex-M0系统滴答定时器Systick详解

    上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...

  2. STM32之系统滴答定时器

    一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...

  3. 系统滴答定时器(SysTick)中断配置

    系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...

  4. STM32 的系统滴答定时器( Systick) 彻底研究解读

    作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一 ...

  5. HAL库与Cubemx系列|Systick-系统滴答定时器详解

    Systick是什么? 关于Systick,在Context-M3权威指南中如此描述: SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15).在以前,大多操作系统需要一 ...

  6. STM32 - SYSTICK(系统滴答定时器)

    SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目 ...

  7. uCos 没有延时Tick滴答定时器测试

    原来学uCos只是表面,今天才发现uCos没有心跳也是可以活的,只是延时功能. 即:OSTimeDly.OSTimexxx 头的功能不能使用. 如果有是用OSTimexxx,任务将会卡死.其实,OST ...

  8. 利用滴答定时器(SysTick)实现简单的延时函数

    预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...

  9. RTX——第12章 系统时钟节拍和时间管理

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 RTX 操作系统的时钟节拍和时间管理函数,其中时间管理函数是 RTX 的基本函数,初学 ...

随机推荐

  1. flutter中的表单使用

    Flutter 中常见的表单有 TextField 单行文本框,TextField 多行文本框.CheckBox.Radio.Switch.CheckboxListTile.RadioListTile ...

  2. 减轻Temporal AA 的 拖影问题(ghosting)

    Temporal AA 效率高,但是有拖影等问题,UE4中可以如下修改减轻拖影问题: 搜索到PostProcessTemporalAA.usf文件,打开,找到 #define AA_DYNAMIC_A ...

  3. 攻防世界 | guess_num

    查源码发现v5可以覆盖sreed[0],这样这个随机数列就可控了 在随机种子这里我一开始使用devC++来生成,居然结果跟gcc的不一样

  4. IP地址的分类及各类IP的最大网络数、网络号范围和最大主机数

    总结自谢希仁老师的<计算机网络>第五版 每一类网络地址都由两部分组成:网络号net-id+主机号host-id.IP地址的分类可以参看下图: 可以看到各个类别的区别,同时,所有的类别都是3 ...

  5. 138、Tensorflow serving 实现模型的部署

    将Tensorflow模型部署成Restful接口 下面是实现过程,整个操作都是在Linux上面实现的,因为Tensorflow Serving 目前还只支持Linux 这个意义真的是革命性的,因为从 ...

  6. LinkedList 源码解读

    LinkedList 源码解读 基于jdk1.7.0_80 public class LinkedList<E> extends AbstractSequentialList<E&g ...

  7. rsync+sersync实现文件同步

    一.目的 A服务器:11.11.11.11 源服务器 B服务器:22.22.22.22 目标服务器,既同步备份的目标 将A服务器的文件同步到B服务器上 二.rsync环境部署 1.关闭selinux, ...

  8. 逻辑回归提高阈值对p和r的影响

    这里我做了一个实验 也就是随着阈值的增大,precision增加或者不变,recall减少或者不变.

  9. 关于public private protected访问修饰符

    这个似乎都是老生常谈了,特别是找工作第一轮笔试的时候很爱考这些,再罗列一次,特别要注意继承的情况:     默认状态:即是不加修饰符的时候,所谓的default状态,在类内部可以被访问,在相同的包下面 ...

  10. Java IO(3)

    字符流相关 字符流基本上可以类比字节流 只不过是将字节流的byte 换为char. 最根本的两个类是Reader以及Writer Reader的子类有:BufferedReader, CharArra ...