RTT电源管理

嵌入式系统低功耗管理的目的在于满足用户对性能需求的前提下,尽可能降低系统能耗以延长设备待机时间。
高性能与有限的电池能量在嵌入式系统中矛盾最为突出,硬件低功耗设计与软件低功耗管理的联合应用成为解决矛盾的有效手段。

现在的各种MCU都或多或少在低功耗方面提供了管理接口。
比如对主控时钟频率的调整、工作电压的改变、总线频率的调整甚至关闭、外围设备工作时钟的关闭等。
有了硬件上的支持,合理的软件设计就成为节能的关键,一般可以把低功耗管理分为三个类别:

  • 处理器电源管理主要实现方式:对CPU频率的动态管理,以及系统空闲时对工作模式的调整。
  • 设备电源管理主要实现方式:关闭个别闲置设备。
  • 系统平台电源管理主要实现方式:针对特定系统平台的非常见设备具体定制。

随着物联网(IoT)的兴起,产品对功耗的需求越来越强烈。
作为数据采集的传感器节点通常需要在电池供电时长期工作,而作为联网的SOC也需要有快速的响应功能和较低的功耗。

在产品开发的起始阶段,首先考虑是尽快完成产品的功能开发。
在产品功能逐步完善之后,就需要加入电源管理(Power Management,简称PM)功能。
为了适应IoT这种需求,RTT提供了电源管理组件。
电源管理组件的理念是尽量透明,使得产品加入低功耗功能更加轻松。

PM组件介绍

PM组件采用分层设计思想,分离架构和芯片相关的部分,提取公共部分作为核心。
在对上层提供通用的接口同时,也让底层驱动对组件的适配变得更加简单。

在这里插入图片描述

主要特点

RTT PM组件主要特点如下所示:

  • 基于模式来管理功耗,空闲时动态调整工作模式,支持多个等级的休眠。
  • 对应用透明,组件在底层自动完成电源管理。
  • 支持运行模式下动态变频,根据模式自动更新设备的频率配置,确保在不同的运行模式都可以正常工作。
  • 支持设备电源管理,根据模式自动管理设备的挂起和恢复,确保在不同的休眠模式下可以正确的挂起和恢复。
  • 支持可选的休眠时间补偿,让依赖OT Tick的应用可以透明使用。

工作原理

低功耗的本质是在系统空闲时CPU停止工作,中断或事件唤醒后继续工作。
在RTOS中,通常包含一个IDLE任务,该任务的优先级最低且已知保持就绪状态,当高优先级任务未就绪时,OS执行IDLE任务。
一般地,未进行低功耗处理时,CPU在IDLE任务中循环执行空指令。

RTT的电源管理组件在IDLE任务中,通常对CPU、时钟和设备进行管理,从而有效降低系统的功耗。

在这里插入图片描述
在上图所示,当高优先级任务运行结束或被挂起时,系统将进入IDLE任务中。
在IDLE任务执行后,它将判断系统是否可以进入到休眠状态(以节省功耗)。
如果可以进入休眠,将根据芯片情况关闭部分硬件模块,OS Tick也非常有可能进入暂停状态。此时电源管理框架会根据系统定时器情况,计算出下一个超时时间点,并设置低功耗定时器,让设备能够在这个时间点唤醒,并进行后续的工作。
当系统被(低功耗定时器中断或其它唤醒中断源)唤醒后,系统也需要知道睡眠时间长度是多少,并对OS Tick进行补偿,让系统的OS Tick值调整为一个正确的值。

设计架构

在RTT PM组件中,外设或应用通过投票机制对所需的功耗模式进行投票,当系统空闲时,根据投票数决策出合适的功耗模式,调用抽象接口,控制芯片进入低功耗状态,从而降低系统功耗。

当未进行任何投票时,会以默认模式进入(通常为空闲模式)。
与应用不同,某些外设可能在进入低功耗状态时执行特定操作,退出低功耗时采取恢复措施,此时可以通过注册PM设备来实现。
通过注册PM设备,在进入低功耗状态之前,会触发注册设备的suspend回调,开发者可在回调里执行自己的操作;类似地,从低功耗状态退出时,也会触发resume回调。

在这里插入图片描述

低功耗状态和模式

RTT PM组件将系统划分为两种状态:运行状态(RUN)和休眠状态(SLEEP)。
运行状态控制CPU的频率,适用于变频场景;休眠状态根据SOC特性实现休眠CPU,以降低功耗。两种状态分别使用不同的API接口,独立控制。

休眠状态
休眠状态也就是通常意义上的低功耗状态,通过关闭外设、执行SOC电源管理接口,降低系统功耗。
休眠状态又分为六个模式,呈现为金字塔的形式。随着模式增加,功耗逐级递减的特点。

  • NONE:系统处于活跃状态,未采取任何的降低功耗状态。
  • IDLE:空闲模式,模式在系统空闲时停止CPU和部分时钟,任意事件或中断均可以唤醒。
    -

运行状态通常用于改变CPU的运行频率,独立于休眠模式。
当前运行状态划分了四个等级:高速、正常、中速、低速。
在这里插入图片描述

模式的请求和释放

在PM组件里,上层应用可以通过请求和释放休眠模式主动参与功耗管理。

应用可以根据场景请求不同的休眠模式,并在处理完毕后释放,只要有任意一个应用或设备请求高等级的功耗模式,就不会切换到比它更低的模式。因此,休眠模式的请求和释放的操作通常成对出现,可用于对某个阶段进行保护,如外设的 DMA 传输过程。

对模式变化敏感的设备

在PM组件里,切换到新的运行模式可能会导致CPU频率发生变化,如果外设和CPU共用一部分时钟,那外设的时钟就会受到影响。
在进入新的休眠模式时,大部分时钟源会被停止,如果外设不支持休眠的冻结功能,那么从休眠唤醒的时候,外设的时钟就需要重新配置外设。

所以 PM 组件里支持了 PM 模式敏感的 PM 设备。使得设备在切换到新的运行模式或者新的休眠模式都能正常的工作。该功能需要底层驱动实现相关的接口并注册为对模式变化敏感的设备。

在这里插入图片描述

  1. 首先应用设置进出休眠状态的回调函数:rt_pm_notify_set(callback)
  2. 调用rt_pm_request(sleep_mode):请求休眠模式,触发休眠操作
  3. PM组件在系统空闲时检查休眠模式计数,根据投票数给出推荐的模式:pm_select_sleep_mode()
  4. 接着PM组件调用notify通知应用,告知即将进入休眠模式:notify_enter(sleep_mode)
  5. 然后对注册的PM设备进行挂起操作,
  6. 返回OK后执行SOC实现的休眠模式
  7. 系统进入休眠状态(如果使能时间补偿,休眠之前会先启动低功耗定时器)
  8. 此时CPU停止工作,等待事件或者中断唤醒。
  9. 系统被唤醒后,由于全局中断为关闭状态,系统继续从该处执行。
  10. 获取睡眠时间补偿系统的心跳。
  11. 依次唤醒设备,通知应用从休眠模式退出。
  12. 如此一个周期执行完毕,退出,等待系统下次空闲。
  13. List item

请求休眠模式

void rt_pm_request(uint8_t sleep_mode)
enum
{/* sleep modes */PM_SLEEP_MODE_NONE = 0,    /* 活跃状态 */PM_SLEEP_MODE_IDLE,        /* 空闲模式(默认) */PM_SLEEP_MODE_LIGHT,       /* 轻度睡眠模式 */PM_SLEEP_MODE_DEEP,        /* 深度睡眠模式 */PM_SLEEP_MODE_STANDBY,     /* 待机模式 */PM_SLEEP_MODE_SHUTDOWN,    /* 关断模式 */PM_SLEEP_MODE_MAX,
};
void rt_pm_request(rt_uint8_t mode)
{rt_base_t level;struct rt_pm *pm;if (_pm_init_flag == 0)return;if (mode > (PM_SLEEP_MODE_MAX - 1))return;pm = &_pm;if (pm->modes[mode] < 255)pm->modes[mode] ++;rt_hw_interrupt_enable(level);
}

调用该函数会将对应的模式计数加1,并锁住该模式。

设置进入/退出休眠模式的回调通知

void rt_pm_notify_set(void (*notify)(uint8_t event, uint8_t mode, void *data), void *data);
/* 请求进入深度睡眠模式 */
rt_pm_request(PM_SLEEP_MODE_DEEP);

如果程序的其它地方请求了更高的功耗模式,如Light Mode 或者 Idle Mode,则需要释放相应的模式后,深度睡眠模式才能被进入。

保护某个阶段或过程

特殊情况下,某个阶段不允许系统进入更低的功耗模式,此时可以通过rt_pm_request和rt_pm_release对该过程进行保护。
如I2C读取数据期间,不允许进入深度睡眠模式(可能会导致外设停止工作)。

/* 请求轻度睡眠模式(I2C外设该模式下正常工作) */
rt_pm_request(PM_SLEEP_MODE_LIGHT);/* 读取数据过程 *//* 释放该模式 */
rt_pm_release(PM_SLEEP_MODE_LIGHT);

移植说明

低功耗管理是一项十分细致的任务,开发者在移植时,不仅需要充分了解芯片本身的功耗管理,还需要熟悉板卡的外围电路,进入低功耗状态时逐一处理,避免出现外围电路漏电拉升整体功耗的情况。

RTT PM组件对各部分进行抽象,提供不同的ops接口供开发者适配。

struct rt_pm_ops
{void (*sleep)(struct rt_pm *pm, uint8_t mode);void (*run)(struct rt_pm *pm, uint8_t mode);void (*timer_start)(struct rt_pm *pm, rt_uint32_t timeout)	
};void (*timer_stop)(struct rt_pm *pm);rt_tick_t (*timer_get_tick)(struct rt_pm *pm);

在某些休眠模式下(Light Sleep或Deep Sleep),内核心跳定时器可能会被停止,此时需要对启动一个定时器对休眠的事件进行计量,唤醒后对心跳补偿。时间补偿的定时器必须在该模式下仍能够正常工作,并唤醒系统,否则没有意义!

  • timer_start:启动低功耗定时器,入参为最近的下次任务就绪时间
  • timer_get_tick:获取系统被唤醒的睡眠时间
  • timer_stop:用于系统唤醒后,停止低功耗定时器

休眠模式的时间补偿需要在初始化阶段通过设置timer_mask的对应模式的bit控制开启。例如需要开启Deep Sleep模式下的时间补偿,在实现timer相关的ops接口后,初始化时设置相应的bit:

rt_uint8_t timer_mask = 0;timer_mask = 1UL << PM_SLEEP_MODE_DEEP;rt_system_pm_init(&_ops, timer_mask, RT_NULL);

MSH命令

请求休眠模式

msh />pm_request 0
msh />

释放休眠模式

msh />pm_release 0
msh />

设置运行模式

msh />pm_run 2
msh />

查看模式状态

可以使用pm_dump命令查看PM组件的模式状态
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3015890.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

使用Simulink Test进行单元测试

本文摘要&#xff1a;主要介绍如何利用Simulink Test工具箱&#xff0c;对模型进行单元测试。内容包括&#xff0c;如何创建Test Harness模型&#xff0c;如何自动生成excel格式的测试用例模板来创建测试用例&#xff0c;如何手动填写excel格式的测试用例模板来手动创建测试用例…

山东省文史书画研究会成立20周年系列活动徽标征集胜选名单公布

2024年5月1日&#xff0c;山东省文史书画研究会成立20周年系列活动徽标征集落下帷幕。征稿启事下发后&#xff0c;得到社会各界人士的广泛关注与参与&#xff0c;共收到设计方案608件。经过初评&#xff0c;选出5幅作品进入复评&#xff0c;并经过网络投票和专家投票相结合的方…

暴雨发布大模型专用分布式全闪存储

近日&#xff0c;暴雨信息发布为大模型专门优化的分布式全闪存储AVERSE系列。该系列依托暴雨信息自研分布式文件系统&#xff0c;搭载新一代数据加速引擎Xdata&#xff0c;通过盘控协同、GPU直访存储、全局一致性缓存等技术为AI大模型数据归集、训练、数据归档与管理等阶段提供…

06-07 - 变量的高级主题

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 变量值的替换2. 变量的模式替换3. 规则中的模式替换4. 变量值的嵌套使用5. 命令行变量6. 环境变量7. 目标变量&#xff08;局部变量&#xff09;8. 模式变量9. 工程 1. 变量值的替换 使用指定字符&#xff08;串&#xff09;替…

vue-img-cutter 图片裁剪详解

前言&#xff1a;vue-img-cutter 文档&#xff0c;本文档主要讲解插件在 vue3 中使用。 一&#xff1a;安装依赖 npm install vue-img-cutter # or yarn add vue-img-cutter # or pnpm add vue-img-cutter 二&#xff1a;构建 components/ImgCutter.vue 组件 <script se…

激光雕刻优化:利用RLE压缩技术提高雕刻效率与节省能源成本

什么是 RLE &#xff1f;RLE 在激光雕刻应用实现代码&#xff1a;总结 什么是 RLE &#xff1f; RLE 是 Run-Length Encoding&#xff08;游程长度编码&#xff09;的缩写。这是一种数据压缩技术&#xff0c;它通过减少连续重复的数据来减小文件的大小。RLE 在图像处理、无损…

linux学习:音视频编程+alsa声音架构

目录 概念 采样 量化 编码 音频文件wav 格式 标准音频接口 ALSA 录制音频 步骤 api 获取pcm设备句柄 设置 PCM 设备参数 代码 播放音频 步骤 代码 概念 信号都是模拟信号&#xff0c;不管是声音还是光线&#xff0c;这些模拟信号需要被 A/D 转换器转换成数字信…

小程序预览或上传代码时,遇到app.json未找到某个wxml文件的解决方法

uniapp小程序&#xff0c;点击预览或者是上传代码&#xff0c;遇到app.json无法找到某个wxml文件的解决方法&#xff1a;清缓存 问题&#xff1a; message&#xff1a;Error: app.json: 未找到 ["subPackages"][3]["pages"][3] 对应的 subPackages4/pages/…

PXE 批量安装部署

目录 一、PEX批量部署优点 二、PXE&#xff1a;预启动执行环境 三、搭建PXE远程服务器 要想全自动安装 接下来请看步骤&#xff1a; 一、PEX批量部署优点 规模化&#xff1a;同时装配多台服务器自动化&#xff1a;安装系统 配置各种服务远程实现&#xff1a;不需要光盘&…

语音识别--光谱门控降噪

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计7267字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

FSC森林认证是什么?

FSC森林认证&#xff0c;又称木材认证&#xff0c;是一种运用市场机制来促进森林可持续经营&#xff0c;实现生态、社会和经济目标的工具。FSC森林认证包括森林经营认证&#xff08;Forest Management, FM&#xff09;和产销监管链认证&#xff08;Chain of Custody, COC&#…

使用IIS部署Vue项目

前提 使用IIS部署Vue项目&#xff0c;后端必须跨域&#xff0c;不要在Vue中用proxy跨域&#xff0c;那个只在dev环境中有用&#xff01; IIS安装&#xff0c;不用全部打勾&#xff0c;有些他默认就是方块 ■ 选择性安装的&#xff0c;就维持原样就可以。 添加网站配置 右键…

Ecovadis认证是什么?

Ecovadis认证是一种企业社会责任&#xff08;CSR&#xff09;评估和评级的认证&#xff0c;旨在衡量企业在环境、劳工和人权、道德以及可持续采购四个方面的可持续发展表现。该认证已成为全球范围内许多公司和组织的评估标准之一&#xff0c;有助于提高企业的会声誉和可持续发展…

Redis系列之key过期策略介绍

为什么要有过期策略&#xff1f; Redis是一个内存型的数据库&#xff0c;数据是放在内存里的&#xff0c;但是内存也是有大小的&#xff0c;所以&#xff0c;需要配置redis占用的最大内存&#xff0c;主要通过maxmemory配置 maxmomory <bytes> # redis占用的最大内存官…

Pycharm无法链接服务器环境(host is unresponsived)

困扰了很久的一个问题&#xff0c;一开始是在服务器ubuntu20.04上安装pycharm community&#xff0c;直接运行服务器上的pycharm community就识别不了anaconda中的环境 后来改用pycharm professional也无法远程连接上服务器的环境&#xff0c;识别不了服务器上的环境&#xff…

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后&#xff0c;Nessus会自动打开浏览器&#xff0c;进入到初始化选择安装界面&#xff0c;这里我们要选择 Managed Scanner 点击继续&#xff0c;下一步选择Tenable.sc 点击继续&#xff0c;设置用户名和密码 等…

2024DCIC海上风电出力预测Top方案 + 光伏发电出力高分方案学习记录

海上风电出力预测 赛题数据 海上风电出力预测的用电数据分为训练组和测试组两大类&#xff0c;主要包括风电场基本信息、气象变量数据和实际功率数据三个部分。风电场基本信息主要是各风电场的装机容量等信息&#xff1b;气象变量数据是从2022年1月到2024年1月份&#xff0c;…

翻译《The Old New Thing》- Rendering menu glyphs is slightly trickier

Rendering menu glyphs is slightly trickier - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050802-13/?p34743 Raymond Chen 2005年08月02日 上次&#xff0c;我们看到了如何绘制有主题和无主题的单选按钮&#xff0c;我提到菜单位图更…

cmake进阶:目录属性说明一

一. 简介 接下来简单学习一下 cmake 中的属性相关的概念。 属性大概可以分为多种&#xff1a;全局属性、目录属性&#xff08;源码属性&#xff09;、目标属性以及其它一些分类。 二. cmake进阶&#xff1a;目录属性 cmake中的属性可以 在如下网址查询到&#xff1a; http…