1.硬件定时器与软件定时器

在MCU中有硬件定时器,由外部晶振提供时钟输入源,经过时钟模块寄存器的配置,得到中断时间,一般都是中断模式触发时间中断,在中断服务函数中设置中断操作。硬件中断时间很精准,最小能到ns级别。缺点是在MCU的外设中一般timer的数量是很少的,有限的。

而软件定时器事项功能和硬件定时器的功能是一样的,都是定时操作执行对应的服务,区别是软件定时器定时到了后执行的是回调函数,且在回调函数中不能执行阻塞任务的操作,如vTaskDelay()等。

2.软件定时器的任务

在FreeRTOS中,可以创建多个软件定时器,所有的软件定时器回调函数都执行在软件定时器任务上下文环境中。软件定时器任务在调度器启动时由内核自动创建,它是一个标准的FreeRTOS任务。当调用vTaskStartScheduler()来开启调度器后,这个函数内部使用xTimerCreateTimerTask()来创建软件定时器任务。

软件定时器任务的任务优先级和栈深度是在FreeRTOSConfig.h中通过configTIMER_TASK_PRIORITY和configTIMER_TASK_STACK_DEPTH这两个宏配置的。

3.软件定时器的属性

1)单次触发定时器:计数值到达后调用一次回调函数,然后定时器任务阻塞;

自动加载定时器:计数值到达后调用一次回调函数,然后循环计数触发回调函数。

2)定时器的精度:

定时器的时间精度是一系统时钟节拍为计时单位的,即心跳节拍,一般为systick,配置为configTICK_RATE_HZ,如1000,那么1s条1000次,即1次1ms.软件定时器设置的节拍数必须是这个sysTick的整数倍。系统节拍越小,精度越高,那么进入中断的次数就会越多,上下文切换就会很频繁,系统开销就会很大;系统节拍越大,时钟精度低,系统开销低。

3)软件定时器的状态:

  • 休眠状态:休眠状态时,定时器是存在的,可以通过它的句柄来操作它,但是它没有运行,没有计时,所以它的回调函数不会执行
  • 运行状态:定时器正在计时,包括正在执行它的回调函数

如下图所示,单次触发定时器和自动重装定时器主要的区别在于,当定时到期后,自动重装定时器会执行回调函数并再次进入到运行态,而单次触发定时器则会执行回调函数并进入到休眠状态

4.软件定时器的应用场景

在实际中,需要用到定时器任务,硬件定时器受硬件资源数量的限制,无法提供更多的定时器,那么这时候可以用软件定时器任务来替代硬件定时器的任务。但需要注意的是软件定时器的精度是无法和硬件定时器的精度相比的,因为软件定时器的任务可能被中断以及优先级更高的任务所打断,因为软件定时器本质也是任务,既然是任务就会存在被中断打断的可能。所以软件定时器是用于对时间精度要求不高的任务,做一些辅助性的任务。

5.demo分析

#include "APPTaskDef.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "timers.h"#define        START_TASK_PRIO         1
#define         START_STACK_SIZE        128
TaskHandle_t    startTask_handler;  //开始任务句柄
static void     start_task(void *param);#define         CONTROL_TIMER_TASK_PRIO     2
#define         CONTROL_TIMER_STACK_SIZE    128
TaskHandle_t    controlTimerTask_handler; //控制timer任务句柄
static void     control_timer_task(void *param);void periodTimer(TimerHandle_t xTimer);
void oneShotTimer(TimerHandle_t xTimer);TimerHandle_t   periodTimerHandle;
TimerHandle_t   oneshotTimerHandle;void APP_task(void)
{xTaskCreate((TaskFunction_t)start_task,(const char *)"start_task",(uint16_t)START_STACK_SIZE,NULL,(UBaseType_t)START_TASK_PRIO,(TaskHandle_t *)&startTask_handler);vTaskStartScheduler();          //开启任务调度
}static void start_task(void *param)
{taskENTER_CRITICAL();           //进入临界区periodTimerHandle = xTimerCreate((const char * )"periodTimer",(TickType_t        )1000,(UBaseType_t  )pdTRUE,(void *         )1,(TimerCallbackFunction_t)periodTimer);oneshotTimerHandle = xTimerCreate((const char*    )"oneshortTimer",(TickType_t      )1,(UBaseType_t )pdFALSE,(void *            )2,(TimerCallbackFunction_t)oneShotTimer);//创建获取event的任务xTaskCreate((TaskFunction_t )control_timer_task,        (const char*    )"control_timer",     (uint16_t       )CONTROL_TIMER_STACK_SIZE, (void*          )NULL,               (UBaseType_t    )CONTROL_TIMER_TASK_PRIO,   (TaskHandle_t*  )&controlTimerTask_handler);   vTaskDelete(startTask_handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}/*timer control task
*/static void control_timer_task(void *param)
{u8 key_pressed = 0;while(1){if(periodTimerHandle && oneshotTimerHandle){key_pressed = KEY_Scan(1);switch(key_pressed){case KEY0_PRESS:xTimerStart(periodTimerHandle, 0);printf("timer1 is running!\r\n");printf("timer ID is %d\r\n", (int)pvTimerGetTimerID(periodTimerHandle));break;          case KEY1_PRESS:xTimerStart(oneshotTimerHandle, 0);printf("timer2 is running!\r\n");break;case KEY_UP_PRESS:xTimerStop(periodTimerHandle, 0);xTimerStop(oneshotTimerHandle, 0);printf("timer1, timer2 stop!\r\n");break;default:break;}}    vTaskDelay(100);}
}void periodTimer(TimerHandle_t xTimer)
{static u8 cur_cnt1 = 0;cur_cnt1++;printf("period Timer cur_cnt1 = %d\r\n", cur_cnt1);
}void oneShotTimer(TimerHandle_t xTimer)
{static u8 cur_cnt2 = 0;cur_cnt2++;printf("oneshot Timer stop, cur_cnt2 = %d\r\n", cur_cnt2);LED1 = !LED1;
}

6.总结

1、软件定时器的最小定时周期等于一个tick周期。如果你需要更短的定时周期则考虑使用硬件定时器。

2、软件定时器的精度一般没有硬件定时器的高,但基本可以满足一般定时需求。提高软件定时器任务的优先级为最高可以提高软件定时器的精度。

3、软件定时器一般用于处理一些逻辑不复杂的,简短的定时任务,它的优点是简单方便,占用的系统资源低,缺点是不够灵活,扩展性不强,当业务逻辑复杂时,考虑使用单独的任务去做。

4、不能在软件定时器回调函数中执行让软件定时器任务阻塞的代码。要尽量保持回调函数简短高效执行。

5、软件定时器可以开多个,理论上只要FreeRTOS的堆内存足够,就可以继续创建新的软件定时器。

6、软件定时器的相关API同样有两个版本,普通版本和中断安全版本(FromISR),使用时需要注意在中断函数中只能使用中断安全版本的。

FreeRTOS软件定时器相关推荐

  1. FreeRTOS 软件定时器使用

    FreeRTOS 的软件定时器工作模式有两种:单次触发 和 自动重载. 1. 主要功能函数介绍 官方API文档:FreeRTOS 软件定时器 API文档 最为常用的函数有: // 创建软件定时器,返回 ...

  2. FreeRTOS软件定时器 | FreeRTOS十三

    目录 说明: 一.定时器简介 1.1.定时器 1.2.软件定时器 1.3.硬件定时器 1.4.FreeRTOS软件定时器 1.5.软件定时器服务任务作用 1.6.软件定时器的命令队列 1.7.软件定时 ...

  3. freeRTOS — 软件定时器的使用

    freeRTOS中加入了软件定时器这个功能组件,是一个可选的.不属于freeRTOS内核的功能,由定时器服务(其实就是一个定时器任务)来提供. 软件定时器是当设定一个定时时间,当达到设定的时间之后就会 ...

  4. FreeRTOS软件定时器 基于STM32

    文章目录 一·.软件定时器的基本概念 二.软件定时器应用场景 三.软件定时器的精度 四.软件定时器的运作机制 五.软件定时器函数接口讲解 1.软件定时器创建函数 xTimerCreate() 2.软件 ...

  5. FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件,是一个可选的.不属于freeRTOS内核的功能,由定时器服务任务(其实就是一个定时器任务)来提供. 软件定时器是当设定一个定时时间,当达到设定的时间之后 ...

  6. FreeRtos软件定时器复习

    一.基础概念 概念解析:定时器分为硬与软定,硬件定时器到达定时时间自动触发中断服务函数,使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的函数(也称超时函数/回调函数,为了统一,下文均 ...

  7. STM32cubeMX配置FreeRTOS软件定时器

    文章目录 前言 1.软件定时器概述 一.软件定时器特性 二.使用cubeMX生成软件定时器 三.代码讲解 总结 前言 本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器. 1 ...

  8. FreeRTOS 软件定时器

    系统节拍配置宏 configTICK_RATE_HZ, 即1S能跳动多少下, 软件定时器的运作机制. FreeRTOS 采用两个定时器列表维护软件定时器, pxCurrentTimerList 与 p ...

  9. freeRtos学习笔记 (6)软件定时器

    freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...

  10. FreeRTOS源码分析与应用开发06:软件定时器

    目录 1. 概述 1.1 软件定时器 & 硬件定时器 1.2 软件定时器精度 1.3 单次模式 & 周期模式 2. 软件定时器组件 2.1 定时器任务 2.2 定时器列表 2.3 定时 ...

最新文章

  1. Android零基础入门第38节:初识Adapter
  2. Android安全研究经验谈
  3. SQL那些事儿(二)
  4. Java使用IntelliJ IDEA创建JavaWeb应用程序并配置Tomcat
  5. 功能选中jquery实现全选反选功能
  6. 12、Java函数接口
  7. 进销存excel_excel进销存仓库表格同步手机操作
  8. 中国移动中兴ZTE F623光猫设置自动拨号启用wifi功
  9. Face photo recognition using sketch (人脸画像合成)
  10. 关于考研复习数学分析和高等代数
  11. Kubernetes 节点弹性伸缩开源组件 Amazon Karpenter 实践:部署GPU推理应用
  12. S7Comm Plus 协议研究
  13. C语言解决三色旗问题
  14. 北京区块链技术应用协会第一届第四次会员大会顺利召开
  15. MMD->Unity一站式解决方案
  16. excel操作技巧:“自定义名称”应用基础篇
  17. 关于vue-video-plaer 出现 this.el_.vjs_getProperty is not a function at Flash.buff解决方法
  18. java 登陆短信验证码_Java实现短信验证码
  19. 垂直搜索 vs 通用搜索
  20. pythonn说句心里话_《说句心里话》笑力满格 “战神”常远颠覆自我

热门文章

  1. MSDN2008中文版下载地址
  2. javaweb网上鞋店
  3. 计算机学院方阵入场词,学校运动会方阵入场解说词
  4. 2021考研——复习规划(数学篇)
  5. 稳压二极管型号大全(转载)
  6. js 正则表达式去空格
  7. 抓包工具——【Mac】Charles的下载和安装
  8. IE浏览器降级详细教程
  9. wsdl2java 参数_wsdl2java参数详解
  10. jQuery EasyUI/TopJUI创建日期时间输入框