测试环境如下

stm32F103C8T6
MDK keil5
stm32cube + FreeRTOS

概述

软件定时器用于在未来设定的时间内,或以固定的频率周期性地安排函数的执行。 由软件定时器执行的函数称为软件定时器的回调函数

软件定时器由Free RTOS内核实现并控制。 它们不需要硬件支持,也与硬件定时器或硬件计数器无关。

请注意,按照自由RTOS使用创新设计以确保最大效率的理念,除非实际执行软件定时器回调函数,否则软件定时器不使用任何处理时间。

软件定时器功能可选。 要包含软件定时器功能

  • 构建Free RTOS源文件Free RTOS/Source/timers.c作为项目的一部分。
  • 在Free RTOSConfig.h中将configUSE_TIMERS设置为1。

FreeRTOS笔记篇:第五章 --软件定时

读者

  • 软件定时器的特性与任务的特性相比。
  • RTOS守护进程任务。
  • 定时器命令队列。
  • 一拍软件定时器与周期软件定时器的区别。
  • 如何创建、启动、重置和更改软件计时器的周期。

软件定时器回调函数 ATimerCallback()

注意:可以看到,软件计时器回调函数在任务的上下文中执行,该任务是在启动Free RTOS调度程序时自动创建的。 因此,软件定时器回调函数绝不能调用FreeRTOSAPI函数,这将导致调用任务进入阻塞状态。 调用函数如xQueue Receive()是可以的,但只有当函数的xTick to Wait参数(它指定函数的块时间)设置为0时才可以。 调用 vTaskDelay()等函数是不可以的,因为 **vTaskDelay()**总是将调用任务放置到阻塞状态

软件计时器的属性和状态

软件定时器的“周期”是从软件定时器开始到软件定时器回调函数执行之间的时间。
One-shot and Auto-reload Timers

  • One-shot : 一旦启动,一次性计时器将只执行一次回调函数。 一次性计时器可以手动重新启动,但不会重新启动本身。
  • Auto-reload Timers: 一旦启动,自动重新加载计时器将在每次到期时重新启动,从而定期执行其回调函数。
  • FreeRTOS笔记篇:第五章 --软件定时
  • 计时器1是一个一次性计时器,周期为6个滴答。 它是在时间t1启动的,所以它的回调函数稍后执行6个滴答,时间t7。 由于定时器1是一次性定时器,其回调函数不会再次执行。
  • 计时器2是一个自动重新加载计时器,有5个滴答周期。 它是在时间t1启动的,所以它的回调函数在时间t1之后每5次执行一次。 在图38中,有时是t6、t11和t16

软件定时器可以处于以下两种状态之一

  • 休眠软件定时器存在,可以由其句柄引用,但不运行,因此其回调函数不会执行。
  • 运行软件计时器将在软件计时器进入运行状态或软件计时器上次重置后经过与其周期相等的时间后执行其回调函数。

自动重新加载计时器执行其回调函数,然后重新输入运行状态,
自动重新加载软件定时器状态和转换-------------图
FreeRTOS笔记篇:第五章 --软件定时

一次性计时器执行其回调函数,然后进入休眠状态。
一次性软件计时器状态和转换

FreeRTOS笔记篇:第五章 --软件定时

计时器服务-任务

守护进程任务是一个标准的免费RTOS任务,当调度程序启动时自动创建。 它的优先级和堆栈大小分别由configTIMER_TASK_PRIORITYconfigTIMER_TASK_STACK_DEPTH编译时间配置常量来设置。 这两个常量都是在FreeRTOSConfig.h中定义的。
软件定时器回调函数不能调用FreeRTOSAPI函数,这些函数将导致调用任务进入阻塞状态,因此将导致守护进程任务进入阻塞状态

计时器命令-队列

软件定时器API函数将命令从调用任务发送到称为“定时器命令队列”的队列上的守护进程任务’。 如图41所示。 命令的例子包括“启动计时器”、“停止计时器”和“重置计时器’。

定时器命令队列是一个标准的FreeRTOS队列,在调度程序启动时自动创建。 定时器命令队列的长度由Free RTOSConfig.h中的configTIMER_QUEUE_LENGTH编译时间配置常量来设置。

FreeRTOS笔记篇:第五章 --软件定时

相关文章: