FreeRTOS软件定时器的原理以及使用实例

简介: FreeRTOS软件定时器的原理以及使用实例


一.软件定时器介绍

我们知道,如果是裸机系统的话,定时器都是由硬件中断完成的。还有一个中断服务函数。而FreeRTOS是一个操作系统,它提供了软件定时器。它也是由系统心跳完成计数的。并不会单独产生硬件中断,同时也不用去写中断服务函数。不过的是我们只需要写一个回调函数即可。(创建软件定时器时,传递函数地址即可)如创建任务一样。

二.软件定时器工作原理

当我们创建出软件定时器时,它会把这个定时器挂载在定时器链表中。如图:

那么freeRTOS是如何知道定时器是否超时了呢?这里就设计的十分巧妙了!!认真看,这也是关键的地方。

其实我们系统也有一个时间,由全局变量xTimeNow进行计数的。系统时钟节拍跳一下就加1 ,系统时钟节拍在FreeRTOSConfig.h配置,下面是1ms跳一次。

#define configTICK_RATE_HZ  (( TickType_t )1000)

如果需要的可以去看博主的这篇文章FreeRTOSConfig.h文件讲解

如果当前加入一个定时器1。假设当前系统时间xTimeNow=20,定时器1定时长度为30。那么定时器链表如图所示:

那么过了10个系统时间我再创建一个定时器2,且定时器2定时长度为40。定时器链表又是什么样的呢?

假设我们此时系统时间已经到了50,那么就已经到了定时器1触发的时间了,那么操作系统又进行怎么样的操作呢。这是FreeRTOS会调用定时器1的回调函数,同时如果定时器1是周期定时器,就会重新挂载到定时器链表中,挂载时间是:当前时间+定时器定时时长,在这种情况下,就是50+30。如图:

当软件定时器2到了触发时间,同理,调用软件定时器2的回调函数,再重新挂载软件定时器2到链表中。

如此一来,就实现了软件定时器。

三.创建软件定时器

到了这一步就非常简单了,只需要调用FreeRTOS操作系统的API函数接口即可。

static TimerHandle_t tiemr1_Handle=NULL;
static void tiemr1_Callback();
timer1_Handle=((const char *)"timer1"
               (TickType_t)1000  //1000个系统时间
                (UBaseType_t)pdTRUE  //周期模式
                (void *)1 //分配定时器ID
                (TimerCallbackFunction_t)timer1_Callback)
                );
 if(timer1_Handle!=NULL)
 {
   xTimerStart(timer1_Handle,0);//开启定时器1
 }
 static void timer1_Callback()
 {
 /*
  
  */
 }

四.总结

FreeROTS软件定时器直接使用的话比硬件定时器方便很多,但是我们应该知其然而知其所以然。不管学习什么的话,我们尽量去了解它的底层以及原理,这样使用的时候出了问题比较容易去排查。最后,谢谢大家支持,点点关注!!!

目录
相关文章
|
18天前
|
API 调度
【FreeRTOS】软件定时器的使用
【FreeRTOS】软件定时器的使用
|
18天前
|
存储 消息中间件 API
FreeRTOS深入教程(软件定时器源码分析)
FreeRTOS深入教程(软件定时器源码分析)
111 0
|
18天前
|
API 调度
FreeRTOS深入教程(中断管理)
FreeRTOS深入教程(中断管理)
119 0
|
18天前
|
数据采集 API 数据处理
FreeRTOS入门教程(软件定时器)
FreeRTOS入门教程(软件定时器)
60 0
|
18天前
|
调度
FreeRTOS深入教程(空闲任务和Tick中断深入分析)
FreeRTOS深入教程(空闲任务和Tick中断深入分析)
94 0
|
6月前
|
监控 安全 API
6.9 Windows驱动开发:内核枚举进线程ObCall回调
在笔者上一篇文章`《内核枚举Registry注册表回调》`中我们通过特征码定位实现了对注册表回调的枚举,本篇文章`LyShark`将教大家如何枚举系统中的`ProcessObCall`进程回调以及`ThreadObCall`线程回调,之所以放在一起来讲解是因为这两中回调在枚举是都需要使用通用结构体`_OB_CALLBACK`以及`_OBJECT_TYPE`所以放在一起来讲解最好不过。
58 1
6.9 Windows驱动开发:内核枚举进线程ObCall回调
|
12月前
|
芯片
STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
140 0
|
存储 缓存 安全
11-FreeRTOS配置函数 FreeRTOSConfig.h(下)
11-FreeRTOS配置函数 FreeRTOSConfig.h