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. 为应用程序池 ''DefaultAppPool'' 提供服务的进程意外终止。进程 ID 是 ''xxx''问题的解决方法

    网上提供了很多办法,都未解决. 解决过程一波三折,依次用了下列方法: 1.解决办法 点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项, 选择其下的“I ...

  2. 20180802-Java 方法

    Java 方法 下面的方法包含2个参数num1和num2,它返回这两个参数的最大值. /** 返回两个整型变量数据的较大值**/ public static int max(int num1,int ...

  3. 相同name,取最小的id的值,mysql根据相同字段 更新其它字段

    id name info1 a 1232 a 2353 a 1244 b 125 b 987相同name,取最小的id的值id name info1 a 1232 a 1233 a 1234 b 12 ...

  4. Cisco Packet Tracer基本操作

    IOS主要模式模式 描述 提示符用户执行模式 路由器受限检查,远程访问 Router>特权执行模式 路由器的详细检查:调试和测试,文件处理,远程访问 Router#全局配置模式 全局配置命令 R ...

  5. 生产环境下,oracle不同用户间的数据迁移。第二部分

    任务名称:生产环境下schema ELON数据迁移至schema TIAN######################################## 测试二:测试参数remap_tablespa ...

  6. Java连接MySql数据库之JDBC

    1.首先创建一个java Project项目 2.起一个英文的项目名 3.此窗口点击NO 4.此时项目状态如下 5.创建一个文件夹,并将mysql-connector-java-5.1.8-bin.j ...

  7. 字符串 编码 utf-8 unicode asicc

    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681919628358 ...

  8. PHP-操作json

    输出 json 文件中文处理 <?php $json_array = array(); // 1.转换为json字符串(不自动转换为unicode编码) if (version_compare( ...

  9. day13—CSS之导航栏

    转行学开发,代码100天——2018-03-29 见过这么多网页,没有导航栏的几乎没见过.因此,对导航栏的练习非常之必要. 导航栏的实现,基本上都是通过链接列表实现,即ul->li->a标 ...

  10. Python笔记(十九)_继承

    继承 继承可以把父类的所有功能都直接拿过来,这样就不必从零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写 多重继承 通过多重继承,一个子类就可以同时获得多个父类的所有功能 > ...