功耗相关总结

2024-05-24 02:12
文章标签 总结 相关 功耗

本文主要是介绍功耗相关总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 功耗相关的使用场景
  • MCU中低功耗的应用
  • RTOS中低功耗应用

功耗相关的使用场景

目前越来越多的嵌入式设备采用电池进行供电,而不是跟台式电脑一样,可以一直连接着电源。在电池供电的场景下,对功耗的要求很高,工程师们尽量希望自己的设备充完一次点后可以使用更久。

本文从两个角度去看待如何实现低功耗。一种方法是MCU厂商提供的低功耗模式,在工程端,我们一般按照MCU厂商提供的方法使得MCU进入低功耗模式。另外一种方法是RTOS中的低功耗实现方法,因为RTOS是采用轮转调度的,可以在此基础上做相关处理,可以使设备使用的功耗更低。

MCU中低功耗的应用

以Cortex-M3内核为例,

通过查找CM3内核指南,可以看到这种内核提供了两种低功耗策略,如下图所示:
在这里插入图片描述

其实也很好理解,

  • 睡眠模式(Sleep Mode):
    在睡眠模式下,CPU停止执行指令,但所有的时钟信号(包括系统时钟和外设时钟)仍然保持活动状态。这意味着外设(如定时器、通信接口等)仍然可以工作,并且可以通过外设事件(如定时器溢出、串口数据到达等)来唤醒CPU。

  • 深度睡眠模式(Deep Sleep Mode):
    深度睡眠模式比睡眠模式更进一步降低功耗。在这个模式下,除了CPU停止执行指令外,大部分或全部的系统时钟和外设时钟也会被禁用。这意味着大多数外设也会停止工作。只有少数特定的唤醒源(如外部中断或者某些具有独立时钟的外设)才能唤醒处理器。

写一个表格对比一下:

特性睡眠模式深度睡眠模式
CPU停止执行指令停止执行指令
系统时钟保持活动大多数情况下禁用
外设时钟保持活动大多数情况下禁用
外设功能保持工作大多数情况下停止
唤醒事件外设事件限定的唤醒源
功耗更低

这是ARM内核层面提供的低功耗模式,但是在实际上厂商还可以客制化,这里举个例子,以STM32F1系列为例:
从STM32F1的参考手册可以见到:
在这里插入图片描述

其有三种模式,为啥三种呢,因为他扩展了CM3内核的深度睡眠模式,外加一个SRAM作为后备存储区,该区电力供应在进入深度睡眠模式的时候,可以选择被切断与保留,如果保留了,则可以当前的处理器状态备份到这个SRAM。(备份原理参考:https://blog.csdn.net/weixin_47702410/article/details/119751040)

总结一下,STM32F1的这三种模式与Cortex-M3内核的两种模式的关联如下:

  • 睡眠模式直接对应于Cortex-M3的睡眠模式。
  • 停止模式和待机模式可以看作是在Cortex-M3的深度睡眠模式的基础上,由STM32F1系列微控制器特有的扩展,它们提供了更深层次的功耗管理。

STM32F1的具体的休眠含义可以查找STM32F1的参考手册,如下:
在这里插入图片描述

RTOS中低功耗应用

RTOS在一般的应用中,处理器大量的时间都在处理空闲任务,此时可以考虑让处理器在空闲任务的时候进入低功耗模式。当需要处理应用层代码的时候就将处理器从低功耗模式唤醒。

因此关键在于如何确定CPU此时是空闲的,我们在空闲的时候开启低功耗而需要处理任务的时候,退出低功耗便可。

以FreeRTOS为例,一般会在空闲任务都会进入到钩子函数,则可钩子函数中执行低功耗相关处理。而FreeRTOS的系统时钟是由滴答定时器中断来提供的。

为此,FreeRTOS特地提供了一个解决方法–Tickless模式,当处理器进入空闲任务以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时候处理器才会被低功耗模式中唤醒。

关于这方面的具体实现,可以在源码中查看如下宏的实现:

#define configUSE_TICKLESS_IDLE 1 //启用低功耗tickless模式

参考:https://blog.csdn.net/qq_26226375/article/details/125043059

总体来说,RTOS实现低功耗可运用如下的原理(滴答定时器作了处理,不然会一直唤醒内核),红色部分是任务处理时长,灰色部分是低功耗休眠时长,绿色部分是进入低功耗的处理时长:

在这里插入图片描述

这篇关于功耗相关总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997080

相关文章

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO