FreeRTOS 低功耗 Tickless 模式深度解析

ops/2024/11/17 15:13:45/

目录

一、引言

二、Tickless 模式的工作原理

1.传统的定时器中断(Tick)模式

2.Tickless 模式的引入

3.具体实现机制

三、Tickless 模式的优势

1.降低功耗

2.提高响应速度

3.灵活性

四、配置和使用 Tickless 模式

1.软件配置

2.任务编程注意事项

五、代码实现

1.定义任务函数

2.实现低功耗相关的函数 

3.主函数 

六、总结


一、引言

        在嵌入式系统中,功耗管理是一个至关重要的问题,尤其是对于电池供电的设备或对功耗敏感的应用场景。FreeRTOS 作为一款流行的实时操作系统,提供了低功耗 Tickless 模式,以帮助开发者降低系统的功耗。本文将深入探讨 FreeRTOS 的低功耗 Tickless 模式,包括其工作原理、优势、配置方法以及实际应用中的注意事项。

二、Tickless 模式的工作原理

1.传统的定时器中断(Tick)模式

  • 在传统的 FreeRTOS 运行模式下,系统会定期产生定时器中断(Tick),通常这个时间间隔是固定的,比如 1ms 或 10ms。每个 Tick 中断会触发任务调度器进行任务切换和时间管理。
  • 这种模式的问题在于,即使系统处于空闲状态,定时器中断仍然会不断发生,消耗一定的 CPU 资源和电力。

2.Tickless 模式的引入

  • Tickless 模式也称为低功耗模式或动态定时器模式。在这种模式下,系统的定时器只有在需要的时候才会产生中断。
  • 当系统没有任务需要执行时,定时器会停止,进入低功耗状态。当有任务需要执行或者某个事件发生时,定时器会被重新启动,产生中断以触发任务调度。

3.具体实现机制

  • FreeRTOS 通过监测任务的状态和等待时间来决定是否进入 Tickless 模式。如果所有任务都处于阻塞状态,等待某个事件发生,并且等待时间超过当前定时器的下一个 Tick 时间,系统就会进入 Tickless 模式,停止定时器。
  • 当某个事件发生,如中断触发或者等待的时间到期,系统会重新启动定时器,产生中断,唤醒任务调度器进行任务切换。

三、Tickless 模式的优势

1.降低功耗

由于在系统空闲时定时器停止,减少了不必要的中断产生,从而降低了 CPU 的活动频率,节省了电力消耗。这对于电池供电的设备来说,可以显著延长电池的使用寿命。

2.提高响应速度

在 Tickless 模式下,当事件发生时,系统可以更快地响应,因为不需要等待下一个固定的 Tick 时间。这对于实时性要求较高的应用场景非常重要。

3.灵活性

Tickless 模式可以根据系统的实际负载情况动态调整定时器的中断频率,适应不同的应用场景。在负载较轻时,系统可以进入低功耗状态更长时间;在负载较重时,定时器中断频率会相应增加,以保证任务的及时调度。

四、配置和使用 Tickless 模式

1.软件配置

  • 在 FreeRTOS 中,启用 Tickless 模式需要进行一些配置。首先,在 FreeRTOSConfig.h 文件中,将宏定义configUSE_TICKLESS_IDLE设置为 1,以启用 Tickless 模式。
  • 然后,根据硬件平台的特性,实现特定的函数来控制定时器的停止和启动。这些函数通常包括portSUPPRESS_TICKS_AND_SLEEP()portRESTORE_TICKS()

2.任务编程注意事项

  • 在使用 Tickless 模式时,任务的等待时间应该尽可能准确地设置,以避免不必要的定时器中断。如果任务的等待时间设置过长,可能会导致系统响应延迟增加;如果设置过短,可能会频繁地产生定时器中断,降低低功耗效果。
  • 另外,在中断处理程序中,应该尽量快速地处理中断,避免长时间占用 CPU,以免影响 Tickless 模式的效果。

五、代码实现

1.定义任务函数

#include "FreeRTOS.h"
#include "task.h"
#include "portmacro.h"void task1(void *pvParameters)
{while (1){// 任务 1 的代码vTaskDelay(1000 / portTICK_PERIOD_MS);// 模拟一些操作,然后再次进入阻塞状态等待下一次唤醒}
}void task2(void *pvParameters)
{while (1){// 任务 2 的代码vTaskDelay(2000 / portTICK_PERIOD_MS);// 模拟一些操作,然后再次进入阻塞状态等待下一次唤醒}
}

2.实现低功耗相关的函数 

3.主函数 

int main(void)
{// 创建任务xTaskCreate(task1, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);xTaskCreate(task2, "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);// 设置低功耗相关的函数指针portSET_INTERRUPT_MASK_FROM_ISR();vTaskSuspendAll();portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime);(void)xTaskResumeAll();portCLEAR_INTERRUPT_MASK_FROM_ISR();// 启动调度器vTaskStartScheduler();return 0;
}

解析: 

  1. 任务函数

    • task1task2是两个任务函数,它们在循环中使用vTaskDelay函数进入阻塞状态,等待指定的时间后再次被唤醒执行。这里的时间是相对于系统的 tick(时间片)而言的。
  2. 低功耗相关函数

    • vPortSuppressTicksAndSleep函数是在系统进入低功耗模式时被调用的函数。在这个函数中,根据具体的硬件平台实现低功耗模式的进入操作,例如关闭不必要的外设、降低 CPU 时钟等,以减少功耗。
    • vPortRestoreTicks函数是在系统退出低功耗模式时被调用的函数。在这个函数中,实现低功耗模式的退出和定时器的恢复操作,以便系统能够正常运行。
  3. 主函数

    • 首先创建了两个任务task1task2
    • 然后设置低功耗相关的函数指针。在实际应用中,需要根据具体的硬件平台进行实现,以确保系统能够正确地进入和退出低功耗模式。
    • 最后启动调度器,开始执行任务。

六、总结

        FreeRTOS 的低功耗 Tickless 模式为嵌入式系统提供了一种有效的功耗管理方法。通过合理地配置和使用 Tickless 模式,可以显著降低系统的功耗,提高响应速度,延长电池寿命。在实际应用中,开发者需要根据硬件平台的特性和应用场景的需求,进行适当的配置和编程,以充分发挥 Tickless 模式的优势。希望本文对读者理解和使用 FreeRTOS 的 Tickless 模式有所帮助。


http://www.ppmy.cn/ops/134457.html

相关文章

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并 上一篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的链接名: MY_ODBC_MYSQL 以…

前端面试场景题目(一)

如何在浏览器中执行100万个任务,并保证页面不卡顿? 使用Web Workers:将任务分配给多个Web Workers,这些Workers在后台线程中运行,不会干扰页面的主线程,从而避免页面卡顿。分批处理任务:将100万个任务分成…

request爬虫库的小坑

今天在做爬虫的时候,想要请求一个json数据, 地址为:https://weibo.com/ajax/profile/info?uidxxxxxxx ID就自己去找一个哈。。。。本来这个应该是一个json数据,但是我的pycharm却返回了一个html,我百思不得其解&…

Flink整合Hive、Mysql、Hbase、Kafka

注意:Flink整合Hive后,可以用Hive的库和表,以及Hive中的函数方法,但是Hive不能使用Flink sql 里面的表,因为Hive不能进行流处理 这里Flink整合Hive,是将Flink的元数据保存到Hive中,并使用hive,…

说说软件工程中的“协程”

在软件工程中,协程(coroutine)是一种程序运行的方式,可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释: 一、协程的基本概念 定义:协程是一组序列化的子过程,用户能像指挥家…

数据结构C语言描述3(图文结合)--双链表、循环链表、约瑟夫环问题

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

Qt对话框与界面设计——常见的对话框

目录 QMessageBox - 提供不同类型的消息对话框 QFileDialog - 文件选择对话框 QColorDialog - 颜色选择对话框 QFontDialog - 字体选择对话框 QInputDialog - 输入对话框 QPrintDialog - 打印机选择对话框 QProgressDialog - 进度对话框 QMessageBox - 异常类型提示 QF…

IPv6路由基础

前言 IETF组织针对IPv6网络制定了路由协议OSPFv3 OSPFv3 ff02::5是为OSPFv3路由协议预留的IPv6组播地址 OSPFv3中的路由条目下一跳地址时链路本地地址. 运行OSPFv3的路由器使用物理接口的链路本地的单播地址为源地址来发送OSPF报文.相同链路上的路由器互相学习与之相连的其他…