首页 > 其他分享 >FreeRTOS中的定时器介绍和使用

FreeRTOS中的定时器介绍和使用

时间:2023-12-24 11:32:24浏览次数:30  
标签:定时器 FreeRTOS void 介绍 任务 xTimer 执行

FreeRTOS作为一款流行的嵌入式实时操作系统,提供了强大的任务调度和同步机制。在实时嵌入式系统中,定时器是一项重要的功能,用于执行特定任务、延时操作或周期性执行代码。本文将深入介绍FreeRTOS中的定时器,并提供详细的代码演示,以帮助开发者更好地理解和应用定时器功能。

1. 定时器的基本概念

在FreeRTOS中,定时器是一种用于延时和定期执行任务的机制。定时器可以被用于执行回调函数、产生周期性的事件,或者在一定时间后执行特定的任务。FreeRTOS提供了丰富的定时器API,使得开发者能够轻松地集成定时器功能到他们的嵌入式应用中。

2. 定时器的创建与删除

使用FreeRTOS的定时器需要包含头文件timers.h。以下是一个简单的定时器创建和删除的代码示例:

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"

// 定时器句柄
TimerHandle_t xTimer;

// 定时器回调函数
void vTimerCallback(TimerHandle_t pxTimer) {
    // 定时器到期时执行的操作
}

void vInitTimer() {
    // 创建定时器,参数依次为定时器名称、定时器周期、自动重载、定时器ID、回调函数
    xTimer = xTimerCreate("MyTimer", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, vTimerCallback);

    // 检查定时器是否成功创建
    if (xTimer != NULL) {
        // 启动定时器
        xTimerStart(xTimer, 0);
    }
}

void vDeleteTimer() {
    // 删除定时器
    xTimerDelete(xTimer, 0);
}

在上述示例中,vTimerCallback函数是定时器到期时执行的回调函数,vInitTimer函数用于创建和启动定时器,vDeleteTimer函数用于删除定时器。

3. 定时器的使用场景

3.1 周期性任务执行

定时器非常适用于需要以固定周期执行的任务,例如周期性地采样传感器数据、发送心跳包等。

void vPeriodicTask(TimerHandle_t pxTimer) {
    // 执行周期性任务
}

void vInitPeriodicTimer() {
    // 创建定时器,参数依次为定时器名称、定时器周期、自动重载、定时器ID、回调函数
    xTimer = xTimerCreate("PeriodicTimer", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, vPeriodicTask);

    // 启动定时器
    xTimerStart(xTimer, 0);
}

3.2 延时任务执行

定时器还可以用于实现任务的延时执行,避免在任务中使用vTaskDelay造成的阻塞。

void vDelayTask(TimerHandle_t pxTimer) {
    // 执行延时任务
}

void vInitDelayTimer() {
    // 创建定时器,参数依次为定时器名称、定时器周期、非自动重载、定时器ID、回调函数
    xTimer = xTimerCreate("DelayTimer", pdMS_TO_TICKS(500), pdFALSE, (void *)0, vDelayTask);

    // 启动定时器
    xTimerStart(xTimer, 0);
}

4. 代码演示

以下是一个完整的FreeRTOS定时器使用示例:

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"

TimerHandle_t xTimer;

void vTimerCallback(TimerHandle_t pxTimer) {
    // 定时器到期时执行的操作
    // 例如:任务唤醒、数据处理等
}

void vInitTimer() {
    // 创建定时器,参数依次为定时器名称、定时器周期、自动重载、定时器ID、回调函数
    xTimer = xTimerCreate("MyTimer", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, vTimerCallback);

    // 检查定时器是否成功创建
    if (xTimer != NULL) {
        // 启动定时器
        xTimerStart(xTimer, 0);
    }
}

void vDeleteTimer() {
    // 删除定时器
    xTimerDelete(xTimer, 0);
}

void vTask(void *pvParameters) {
    while (1) {
        // 任务逻辑

        // 任务休眠(可选)
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

int main() {
    // FreeRTOS初始化

    // 初始化定时器
    vInitTimer();

    // 创建任务
    xTaskCreate(vTask, "Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    // 启动FreeRTOS调度器
    vTaskStartScheduler();

    // 正常情况下不会执行到这里
    return 0;
}

5. 总结

FreeRTOS中的定时器提供了灵活、可靠的定时任务机制,适用于各种实时嵌入式系统的场景。通过本文的介绍和示例代码,希望读者能够更深入地了解FreeRTOS中定时器的使用方法,从而更高效地设计和实现嵌入式应用。


标签:定时器,FreeRTOS,void,介绍,任务,xTimer,执行
From: https://blog.51cto.com/u_16192077/8954805

相关文章

  • FreeRTOS中的中断中能否使用互斥量
    在嵌入式系统中,实时操作系统(RTOS)是为了确保任务的实时性和协同工作而设计的。FreeRTOS作为一款流行的RTOS,提供了丰富的同步和通信机制,其中互斥量是一种用于保护共享资源的关键工具。然而,开发者在使用FreeRTOS时,经常会面临一个问题,即在中断中是否可以安全地使用互斥量。本文将深入讨......
  • 自我介绍+软工5问
    软件工程https://edu.cnblogs.com/campus/gdgy/CSGrade21-12作业要求https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13015作业目标学会创建并使用博客;学会使用Markdown语言编写博客;向大家介绍自己;掌握GitHub的基本用法自我介绍大家好,我是......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发
    https://www.cnblogs.com/wuhuacong/tag/WPF/ 在我们的SqlSugar的开发框架中,整合了Winform端、Vue3+ElementPlus的前端、以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了,本篇随笔进一步介绍前端应用的领域,研究集成WPF的应用端,循序渐进介绍基......
  • 短小精悍(2) - Rust终端检测库is-terminal和atty介绍
    title:短小精悍(2)-Rust终端检测库is-terminal和atty介绍zhihu-url:https://zhuanlan.zhihu.com/p/673841498今天给大家介绍的是Rust中非常常用的两个用于检测终端的库is-terminal和atty。这两个库都是千万级别的下载量,大多数和日志、流、交互相关的库都会依赖它们,而我们在......
  • 51 单片机【外部中断、定时器中断、回调函数】
    51单片机【外部中断、定时器中断、回调函数】​ 这里的外部中断类似监听器,时时刻刻监视某引脚的电平变化;这里的定时器中断类似于定时任务,可以定时执行某函数;这里将回调函数和中断结合起来,案例里有点设计模式的味道(忘了哪个了,也可能就是感觉,关于高层不能调用低层的解决),也有点函数......
  • 嵌入式系统中的低功耗定时器应用与优化实战
    嵌入式系统的开发在现代科技中发挥着至关重要的作用。它们被广泛应用于从智能家居到工业自动化的各种领域。在本文中,我们将聚焦于使用ARMCortex-M系列微控制器实现低功耗定时器的应用。我们将详细介绍在嵌入式系统中如何实现低功耗的定时器功能,并附上代码示例。嵌入式系统低功耗定......
  • 云打印介绍,云打印适合什么人群使用呢?
    近来一段时间,云打印的概念非常火热,很多有打印需求的小伙伴也是市场在后台咨询我们该如何使用云打印服务。但其实并不是所有人都适合云打印服务的,那么今天我们就来给大家介绍一下云打印,以及了解一下云打印适合什么人群使用。 云打印介绍,云打印是什么意思?随着互联网技术的发展......
  • RocketMQ的特性介绍和常用的业务场景
    RocketMQ(ApacheRocketMQ)是一个开源的分布式消息中间件系统,最初由阿里巴巴开发并捐赠给Apache软件基金会。它是一个可靠、可扩展、高吞吐量、低延迟的分布式消息系统,适用于大规模分布式系统中的消息通信。以下是RocketMQ的一些主要特性和常用场景:特性介绍:分布式架构:RocketMQ采用了......
  • 16 json web token的基本介绍
    jwt全拼是jsonwebtoken。就是服务端给客户端一个加密的字符串。这个字符串中包含了一些信息,比如用户信息等。浏览器每次访问服务端时候,会携带这个字符串。然后服务的获取这个字符串后,通过解密,就可以获取携带的信息,比如用户信息等。这个加密的字符串,包含3部分内容,就是头部+负载+......
  • 布隆过滤器:原理介绍与实战
    布隆过滤器用一句话来说,布隆过滤器是为了解决查询一个元素是否存在于某个集合之中。例如:50亿个用户ID,查询某ID是否在这50亿集合之中。50亿*8字节大约为50GB,内存占用极大。所以一般采用位数组,以及位数组的延伸设计:布隆过滤器。在学习布隆过滤器之前,我们需要有些基础性概念:哈......