FreeRTOS学习 -- 软件定时器

一、软件定时器简介

1、软件定时器概述

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期。

简而言之,当定时器的定时周期到了以后就会执行回调函数。

2、编写回调函数的注意事项

软件定时器的回调函数是在定时器服务任务重执行的,所以一定不能再回调函数中调用任何阻塞任务的 API函数。比如, 定时器回调函数中千万不能调用 vTaskDelay() 、 vTaskDelayUnti(),还有一些访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

二、定时器服务

FreeRTOS 提供了很多定时器有关的 API 函数,这些 API 函数大多都使用 FreeRTOS的队列发送命令给定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给 FreeRTOS 的软件定时器使用的,用户不能直接访问!

上图,左侧部分属于用户应用程序的一部分,并且会在某个用户创建的用户任务中调用。

上图,右侧部分是定时器服务任务的任务函数,定时器命令队列将用户应用任务和定时器服务任务送到定时器命令队列中。

在这个例子中,应用程序调用了函数 xTimerReset(),结果就是复位命令会被发送到定时器命令队列中,定时器服务任务会处理这个命令。应用程序是通过函数 xTimerReset(),间接的向定时器命令队列发送了复位命令,并不是直接调用类似 xQueueSend()这样的队列操作函数发送的。

三、单次定时器和周期定时器

软件定时器分两种:单次定时器和周期定时器,单次定时器的话定时器回调函数就执行一次。比如定时 1s,当定时器时间到了以后就会执行一次回调函数,然后定时器就会停止执行。对于单次定时器我们可以再次手动重启(调用相应的 API函数即可),但是单次定时器不能自动重启。

相反的,周期定时器一旦启动以后就会在执行回调函数以后自动的重新启动,这样回调函数就会周期性的执行。

图中 Timer1 为单次定时器,定时器周期为 100,Timer2 为周期定时器,定时器周期为 200。

相关推荐
云上艺旅6 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
你觉得2057 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
A旧城以西8 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
无所谓จุ๊บ8 小时前
VTK知识学习(50)- 交互与Widget(一)
学习·vtk
FAREWELL000758 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法
吴梓穆8 小时前
UE5学习笔记 FPS游戏制作38 继承标准UI
笔记·学习·ue5
Three~stone9 小时前
MySQL学习集--DDL
数据库·sql·学习
齐尹秦9 小时前
HTML 音频(Audio)学习笔记
学习
瞌睡不来9 小时前
(学习总结32)Linux 基础 IO
linux·学习·io
Moonnnn.9 小时前
运算放大器(四)滤波电路(滤波器)
笔记·学习·硬件工程