FreeRTOS——低功耗管理

news2024/11/25 7:16:52

目录

一、概念及其应用

1.1应用

 1.2STM32电源管理系统

2.3STM32低功耗模式

2.3.1睡眠模式

2.3.2停止模式

2.3.3待机模式

三、Tickless低功耗模式

3.1低功耗模式配置

3.2低功耗模式应用

3.3低功耗电路分析

3.4低功耗处理相关接口

四、实现原理

 4.1任务等待删除的检查

4.2空闲任务

4.3Tickless流程

4.4休眠处理

4.4.1计算SysTick装载值

4.4.2进入低功耗模式

4.4.3恢复systick


一、概念及其应用

1.1应用

可穿戴的、电池供电、待机时间长的产品:

还有%80的物联网产品

 

 1.2STM32电源管理系统

主要分为:备份域(VBAT备用电池供电)、调压器供电电路(内部1.2V提供供电)、ADC电源电路(模数分离保证ADC测量精度)

 实际上,低功耗就是做减法,做关断

2.3STM32低功耗模式

包括睡眠模式、停机模式、待机模式

2.3.1睡眠模式

  • 仅关闭内核时钟,内核停止运行,但片上外设包括CortexM4核心外设仍正常运行

  • WFI、WFE两种方式进入,即由等待中断唤醒和等待事件唤醒

一般情况下不用睡眠模式,因为它实现不了大面积的低功耗

2.3.2停止模式

  • 进一步关闭所有外设的时钟,但不关闭1.2V区域的部分电源,

  • 还保留了内核寄存器、内存的信息,所以从停止模式(任意一个外部中断EXTI)唤醒,重启时钟后还可以从上次停止处继续执行代码。

  • 停止模式中可选择电压调节器为开模式或低功耗模式,可选择内部FLASH工作在正常模式或掉电模式

2.3.3待机模式

  • 关闭所有时钟,同时关闭1.2V区域的所有电源,唤醒后,只能对芯片复位,从头开始执行程序

  • 四种唤醒方式,WKUP引脚上升沿,RTC闹钟事件,NRST引脚的复位、IWDG独立看门狗的复位

三、Tickless低功耗模式

 通过空闲任务实现,核心是处理tickless函数

3.1低功耗模式配置

  • configUSE_TICKLESS_IDLE 设置为1采用低功耗tickless模式,为0不采用

  • configEXPECTED_IDLE_TIME_BEFORE_SLEEP默认设置为2,表示休眠时间必须>2个tick值(不然也没意义)

  • configPRE_SLEEP_PROCESSIN()和configPOST_SLEEP_PROCESSIN()是rtos给用户提供的接口,分别是进入、退出低功耗模式要处理的事情

  • 函数vPortSuppressTicksAndSleep是实际的低功耗执行代码

3.2低功耗模式应用

必须要掌握的硬件知识包括四部分:主控芯片、电源管理、外设模块、外部接口

  • 主控芯片早期以MSP430为主,静态电流165uA,现在以STM8/32 L为主 静态电流87uA

  • 电源管理包括LDO超低静态电流、输出可关断,DC/DC 主要性能指标是高转换效率

  • 外设模块以无线通信技术包括GPRS/GPS/WIFI/Zigbee/LoRa/NB-IOT,须具备休眠模式,休眠电流、待机电流小,中断可唤醒

  • 外部接口分为输入和输出,输入方面如CAN、RS485、232、LCD屏等需要间隙供电,输出方面利用MOS管脉冲控制

3.3低功耗电路分析

可通过搜芯片手册—www.alldatasheet.com 寻找器件特性 如静态电流quiescent current

3.4低功耗处理相关接口

除了停止模式和待机模式,PWR电源控制和GPIO端口还分别提供了相关接口用于低功耗处理

四、实现原理

 4.1任务等待删除的检查

  • 实际接口static void prvCheckTaskWaitingTermination

  • 循环判断等待被删除的任务数量标记是否大于0(此标记在任务删除的接口中会操作这个数)

    • 挂起调度器

    • 读取删除任务自身列表里任务状态是否为空

    • 开启调度器

    • 进入临界段

    • 获取任务控制块

    • 从任务列表项移除任务

    • 任务总计数-1

    • 等待删除计数-1

    • 退出临界段

    • 释放任务控制块

4.2空闲任务

main.c中 osKernelStart—>vTaskStartScheduler中自动创建空闲任务

  • 实际接口static portTASK_FUNCTION(prvIdleTask,pvParameters)

  • 先进行任务等待删除的检查

  • 判断是否为抢占式调度

    • 如果不是,代表为时间片调度,则触发上下文切换,因为空闲任务本身优先级是最低的

    • 如果是抢占式调度,则查看是否有和空闲任务优先级相同的其他任务处于就绪态,如果有就进行上下文切换(要是高于空闲任务的优先级,自然由调度器去调度处理)

  • 接着就是钩子函数的处理,这个由用户自己填充代码

  • 最后就是tickless处理,放在下文阐述

4.3Tickless流程

  • 获取系统的最小时间片 xExpectedIdleTime = prvGetExpectedIdleTime()

  • 判断是否大于休眠空闲处理的最小间隔 2Tick

    • 是的话,挂起调度器

    • 再次获取系统的最小时间片(相当于更新一下时间,防止由于其他任务调度了,时间产生了误差)

    • 再次判断是否大于休眠空闲处理的最小间隔 2Tick

    • 进行休眠处理,传入系统的最小时间片portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime )

    • 恢复调度器

prvGetExpectedIdleTime()——获取系统最小时间片

如果有比空闲任务优先级高或者相同优先级的任务处于就绪态,直接返回0

否则返回值=系统解锁时间-系统tick计数值(其实就是当前系统的最小时间片

4.4休眠处理

4.4.1计算SysTick装载值

_weak void vPortSuppressTicksAndSleep(系统最小时间片)

  • 系统最小时间片溢出检查 最大只能是systick的最大装载值

  • 关闭systick定时器

  • systick重载值=当前systick计数值+单次系统tick值*(系统最小时间片-1)

  • 判断装载值是否大于补偿周期 之后减去补偿时间

  • 最终得到systick重载值

  • 关闭中断——关闭所有中断 (和进入临界段不一样)

这里的关闭的中断稍微特殊一点,不会进行中断处理但是会唤醒CPU  

4.4.2进入低功耗模式

  • 判断是否有其他任务进入了就绪态

    • 是的话,终止休眠状态,当前systick计数值放到systick装载寄存器中,启动systick,重新赋值装载寄存器值为一个系统的tick周期,开启中断

    • 否则装载休眠systick装载值,清除systick当前计数值,启动systick定时器,进入休眠前的工作,然后休眠

    • 退出休眠,停止systick定时器,使能中断

4.4.3恢复systick

  • 判断是否为systick唤醒的

    • 是的话,systick恢复值=单个tick周期-(休眠装载值-当前tick计数值)如果恢复值很小或者很大就赋值为1个tick周期

      • 把systick恢复值赋值给systick装载值

      • 休眠周期的补偿值,单位为tick,也就是1ms

    • 不是的话,休眠运行装载值=休眠装载值-当前systick计数值

      • 休眠运行周期,单位为tick

      • 装载恢复systick装载值

  • 清除systick计数值

  • 进入临界段

  • 使能systick

  • 补偿系统的tick周期值,也就是说运行了多少时间,因为调度器恢复的时候,会根据tick值进行遍历,保证实时性

  • 恢复systick周期为1个tick

 

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

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

相关文章

【STM32】MPU6050初始化常用寄存器说明及示例代码

一、MPU6050常用配置寄存器 1、电源管理寄存器1( PWR_MGMT_1 ) 此寄存器允许用户配置电源模式和时钟源。 DEVICE_RESET :用于控制复位的比特位。设置为1时复位 MPU6050,内部寄存器恢复为默认值,复位结束…

2024年亚太地区数学建模大赛A题-复杂场景下水下图像增强技术的研究

复杂场景下水下图像增强技术的研究 对于海洋勘探来说,清晰、高质量的水下图像是深海地形测量和海底资源调查的关键。然而,在复杂的水下环境中,由于光在水中传播过程中的吸收、散射等现象,导致图像质量下降,导致模糊、…

自动驾驶3D目标检测综述(三)

前两篇综述阅读理解放在这啦,有需要自行前往观看: 第一篇:自动驾驶3D目标检测综述(一)_3d 目标检测-CSDN博客 第二篇:自动驾驶3D目标检测综述(二)_子流行稀疏卷积 gpu实现-CSDN博客…

【Linux | 计网】TCP协议详解:从定义到连接管理机制

目录 1.TCP协议的定义: 2.TCP 协议段格式 3.TCP两种通信方式 4.确认应答(ACK)机制 解决“后发先至”问题 5.超时重传机制 那么, 超时的时间如何确定? 6.连接管理机制: 6.1.三次握手: 为什么需要3次握手,一次两次不行吗…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时,他们会看到 PDF 的初始视图。默认情况下,打开 PDF 时不会显示书签面板或缩略图面板。在本文中,我们将演示如何设置文档属性,以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

2024年12月Gesp七级备考知识点拾遗第一期(图的定义及遍历)

目录 总序言 知识点拾遗​编辑 度数 环 二叉树 图的遍历 深度优先 广度优先 连通与强连通 有什么不同 构成分别至少需要几条边(易错题)? 无向连通图 有向强连通图 完全图 什么是完全图 无向完全图最少边数 有向完全图最少边…

Doris 的Explain 和 Profile

什么是 explain? 执行计划是对一条 SQL 具体的执行方式和执行过程的描述。例如,对于一个涉及两表连接的 SQL,执行计划会展示这两张表的访问方式信息、连接方式信息,以及各个操作之间的顺序。 在 Doris 系统中提供了 Explain 工具…

QT QVBoxLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizonta…

对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris()函数查找学习举例

对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris()函数查找学习举例 对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris函数查找学习举例 对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris()函数查找学习举例一、鸢尾花数据位置二、鸢尾花…

动态反馈控制器(DFC)和 服务率控制器(SRC);服务率和到达率简单理解

目录 服务率和到达率简单理解 服务率 到达率 排队论中的应用 论文解析:队列等待成本动态感知控制模型 动态反馈和队列等待成本意识: 服务速率调整算法: 动态反馈控制器(DFC)和 服务率控制器(SRC) SRC公式4的原理 算力资源分配系统中的调整消耗 举例说明 服务…

微信小程序上传微信官方审核流程(1)

1,打开微信开发者工具 2,微信开发者工具右上角有一个上传按钮,点击上传按钮 3,点击完上传按钮会弹出一个上传成功的提示,点击提示框中的确定按钮 4,点击完确定按钮后会显示填写版本好和项目备注 5&#x…

优先算法 —— 双指针系列 - 复写零

目录 1. 复写零 2. 算法原理 一般情况下 改为就地操作:从左到右(错误) 从右到左 总结一下解决方法: 如何找到最后一个复写的数 特殊情况 完整步骤: 3. 代码 1. 复写零 题目链接:1089. 复写零 - 力…

Spring源码学习(一):Spring初始化入口

写在前面 ​   作为一个刚步入职场的小白,对Spring(SpringBoot)的了解只停留在会用,并未对其内部的原理有过学习。在公司导师的指导下,开始进一步学习Spring的源码,毕竟Spring源码是Spring全家桶的基础&…

IntelliJ+SpringBoot项目实战(十三)--在SpringBoot中整合Mybatis-plus

mybatis-plus是基于mybatis基础上的增强的持久层框架&#xff0c;也是目前Java项目开发的主流框架。本文介绍在SpringBoot中集成mybtais-plus的方法以及使用mybatis-plus开发增删改查模块。 一、引入mybatis-plus 在openjweb-core工程中引入mybatis-plus依赖: <dependency&…

Vector底层实现详解

一、vector的介绍 vector是表示可变大小数组的序列容器 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且…

【2024 Optimal Control 16-745】【Lecture4】equality-constraints.ipynb功能分析

代码实现了一个二次优化问题的可视化解法&#xff0c;包括目标函数、约束以及优化路径。提供了两种优化方法&#xff1a;牛顿法和高斯-牛顿法&#xff0c;用于对比效果。利用了自动微分工具 ForwardDiff 来计算约束曲率。 环境初始化并导入依赖库 # 激活当前文件夹下的项目环境…

【国产MCU】-GD32F470-串行外设接口(SPI)

串行外设接口(SPI) 文章目录 串行外设接口(SPI)1、SPI介绍1.1 SPI特性1.2 SPI信号1.3 SPI 时序和数据帧格式1.4 NSS 功能1.5 SPI运行模式2、SPI控制器寄存器列表3、SPI控制器驱动API介绍4、SPI应用4.1 SPI初始化流程4.2 数据发送与接收串行外设接口(Serial Peripheral Int…

Docker安装ubuntu1604

首先pull镜像 sudo docker run -d -P m.daocloud.io/docker.io/library/ubuntu:16.04国内使用小技巧&#xff1a; https://github.com/DaoCloud/public-image-mirror pull完成之后查看 sudo docker images 运行docker sudo docker run -d -v /mnt/e:/mnt/e m.daocloud.io/…

2024 年:Kubernetes 包管理的新前沿

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…

飞凌嵌入式T113-i开发板RISC-V核的实时应用方案

随着市场对嵌入式设备的功能需求越来越高&#xff0c;集成了嵌入式处理器和实时处理器的主控方案日益增多&#xff0c;以便更好地平衡性能与效率——实时核负责高实时性任务&#xff0c;A核处理复杂任务&#xff0c;两核间需实时交换数据。然而在数据传输方面&#xff0c;传统串…