专栏首页电子技术研习社uCOS | 软件定时器

uCOS | 软件定时器

今天说一下uCOS的软件定时器。

定时器有硬件定时器和软件定时器之分:

硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。

软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定时器也是类似的。

软件定时器在被创建之后,当经过设定的时钟计数值后会触发用户定义的回调函数。定时精度与系统时钟的周期有关。一般系统利用 SysTick 作为软件定时器的基础时钟,软件定时器的回调函数类似硬件的中断服务函数,所以,回调函数也要快进快出,而且回调函数中不能有任何阻塞任务运行的情况(软件定时器回调函数的上下文环境是任务),比如 OSTimeDly()以及其它能阻塞任务运行的函数,两次触发回调函数的时间间隔 period 叫定时器的定时周期。

接下来说一下软件定时器的相关函数。

1、创建软件定时器函数OSTmrCreate()

OSTmrCreate ((OS_TMR *)&my_tmr, //软件定时器对象

(CPU_CHAR *)"MySoftTimer", //命名软件定时器

(OS_TICK )10, //定时器初始值,依10Hz时基计算,即为1s

(OS_TICK )10, //定时器周期重载值,依10Hz时基计算,即为1s

(OS_OPT )OS_OPT_TMR_PERIODIC,//周期性定时

(OS_TMR_CALLBACK_PTR )TmrCallback, //回调函数

(void *)"Timer Over!", //传递实参给回调函数

(OS_ERR *)err); //返回错误类型

这里稍微注意一下,第三个参数是初始延时,第四个参数是定时周期。倒数第二个参数是一个回调函数,相当于我们的中断函数。所以在调用这个软件定时器创建函数之前,应该先写一个回调函数,否则会报错。

void TmrCallback (OS_TMR *p_tmr,void*p_arg)

{

}

关于定时时间,这个和软件定时器的中断频率有关,这个在os_cfg_app.h这个头文件里有定义。

#define OS_CFG_TMR_TASK_RATE_HZ 10u //定时器的时基 (一般不能大于 OS_CFG_TICK_RATE_HZ )

比如这里定时器的时基是10Hz,那么也就是发生一次定时中断的时间是100ms,那么计数十次当然就算1s了,这就算上面一秒的计算方法,我们也可以修改这个宏来改变定时器时基,但是不能大于系统的时钟节拍。

2、启动软件定时器函数OSTmrStart()

OSTmrStart ((OS_TMR *)&my_tmr,//软件定时器对象

(OS_ERR *)err); //返回错误类型

3、停止定时器函数 OSTmrStop()

CPU_BOOLEAN OSTmrStop (OS_TMR *p_tmr, //定时器控制块指针

OS_OPT opt, //选项

void *p_callback_arg,//传给回调函数的新参数

OS_ERR *p_err) //返回错误类型

4、删除软件定时器函数 OSTmrDel()

CPU_BOOLEAN OSTmrDel (OS_TMR *p_tmr,//定时器控制块指针

OS_ERR *p_err)//返回错误类型

总结:软件定时器可以缓解硬件定时器数量的限制,理论上可以创建无数多个软件定时器,只要RAM足够大。软件定时器的精度比不上硬件定时器,适用于对精度要求不高的场合。另外,回调函数是在定时器任务中被调用,所以回调函数的上下文环境是在任务中,并且运 行回调函数时调度器处于被锁状态。一般我们编写的回调函数越简短越好,并且不能在回调函数中等待消息队列、信号量、事件等操作,否则定时器任务会被挂起,导致定时器任务崩溃,这是绝对不允许的。

本文分享自微信公众号 - 电子技术研习社(zjf18770701843),作者:小小飞飞哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 温度采集系统上位机设计

    上一次我们讲到了多点温度采集系统的设计,为此,特意开发了一个上位机用于显示温度,这一节就是来说一下上位机的开发。

    飞哥
  • HC05蓝牙模块通信(附源码)

    实现的目标是利用蓝牙模块,实现手机与单片机通信,在手机上点击按钮,点亮单片机上面的小灯。

    飞哥
  • uCOS | 消息队列与信号量

    队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从...

    飞哥
  • 一起来学matlab-matlab学习笔记7-定时器

    本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一些负面...

    DrawSky
  • FreeRTOS 软定时器实现

    考虑平台硬件定时器个数限制的, FreeRTOS 通过一个 Daemon 任务(启动调度器时自动创建)管理软定时器, 满足用户定时需求. Daemon 任务会在...

    orientlu
  • Qt多种定时器

      使用startTimer开启定时器,使用killTimer(int id)接口来关闭指定的定时器。 启动定时器后会在对应间隔时间触发timerEvent事...

    Qt君
  • NSURLSession内存泄漏

    czjwarrior
  • TCP协议详解-定时器

            如代码所示,如果tcp的state<ESTABLISHED,表明其处于连接建立状态。定时器超时后,调用dropit终止连接。大多数伯克利系统将建...

    无毁的湖光-Al
  • Mysql将查询结果导出到外部文件的三种方式

    select * from tableName into outfile '/home/huangzx3/tableName';

    拓荒者
  • 使用SuperWebSocket 构建实时 Web 应用

    Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于...

    张善友

扫码关注云+社区

领取腾讯云代金券