news 2026/8/6 8:08:39

RTOS-F429-HAL-TICKLESS低功耗(2026/8/5)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RTOS-F429-HAL-TICKLESS低功耗(2026/8/5)

目录

一:STM32低功耗模式

1:1.2V 域 vs VDD 域 vs 调压器

2:三种低功耗模式本质

3:一张图解释停机和待机

4:正点例程采用睡眠模式

二:实验分析

1:正点实验内容

2:用到的几个宏

三:实验改动

rtos\22\ 改动清单

freertos_demo.c

FreeRTOSConfig.h

main.c

钩子函数:

运行逻辑总结


一:STM32低功耗模式

模式名称进入唤醒对 1.2V 域时钟的影响对 VDD 域时钟的影响调压器
睡眠(立即休眠或退出是休眠)WFI任意中断CPU CLK 关闭对其它时钟或模拟时钟源无影响开启
WFE唤醒事件
停止PDDS 和 LPDS 位 +SLEEPDEEP 位+WFI 或 WFE任意 EXTI 线(在 EXTI 寄存器中配置,内部线和外部线)所有 1.2 V 域时钟都关闭HSI 和 HSE 振荡器关闭开启或处于低功耗模式
待机PDDS 位 +SLEEPDEEP 位+WFI 或 WFEWKUP 引脚上升沿、RTC 闹钟(闹钟 A 或闹钟 B)、RTC 唤醒事件、RTC 入侵事件、RTC 时间戳事件、NRST 引脚外部复位、IWDG 复位所有 1.2 V 域时钟都关闭HSI 和 HSE 振荡器关闭关闭

1:1.2V 域 vs VDD 域 vs 调压器

芯片供电秘密

F429 外接 3.3V(VDD),但 Cortex-M4 核心实际跑在1.2V。芯片内部有个调压器,把 3.3V → 1.2V:

外部 3.3V (VDD) │ ├──────────────────────────→ 直接给 GPIO、USART、SPI、RTC 备份域 │ ↑ 这部分就是 VDD 域 │ └──→ 调压器 → 1.2V ──→ CPU、NVIC、SRAM、Flash、DMA、大部分外设 ↑ 这部分就是 1.2V 域

2:三种低功耗模式本质

睡眠停止待机
CPU 钟
1.2V 域(外设、SRAM)开着全关全关
VDD 域(GPIO、RTC)开着开着开着
调压器开着开着/半开
唤醒后原地继续程序从头跑(但 SRAM 还在)程序从头跑,SRAM 全丢

3:一张图解释停机和待机

睡眠模式:CPU 打盹,店还开着 拉下卷帘门(WFI)→ CPU 不干活了 但店里的灯(外设时钟)、收银机(SRAM)全开着 有人敲门(任意中断)→ 门一拉就起来 → 瞬间恢复 ​ 停止模式:打烊但不锁门 灯关了(1.2V 域时钟全关,包括外设、CPU) 收银机还通着电(调压器还在,SRAM 保持) 只有应急灯亮着(VDD 域——GPIO 能检测电平变化) 外部中断、RTC 闹钟 → 重新开灯 → 程序接着跑 ​ 待机模式:彻底断电只留一把钥匙 整店断电(调压器关了 → 1.2V 域没了 → SRAM 全丢) 唯一的唤醒方式:WKUP 引脚、RTC 闹钟、复位 醒了 = 重新开店(程序从 main 重新开始!跟复位一样)

低功耗 Tickless 就是用停止/待机模式:FreeRTOS 没有任务要跑的时候,不跑 SysTick 空转,直接把芯片塞进低功耗模式,RTC 闹钟到了再叫醒。

4:正点例程采用睡眠模式

睡眠模式:CPU 停了但外设和 SysTick 还活着——一个定时器中断立马能叫醒,程序原地继续,什么状态都不丢。实验做起来简单,改个配置就行。

停止/待机模式:醒了程序要从头跑或者重新初始化所有外设——FreeRTOS 状态全丢,恢复起来复杂度高一截。教学中一般不碰这两个。


正点的 Tickless 实验就是开了configUSE_TICKLESS_IDLE,Idle 任务在没有 Run 的时候不空转 SysTick,而是调WFI让 CPU 睡觉。SysTick 到点或者外部中断来了自动醒。代码很简单——改几个宏,配一个恢复函数。

二:实验分析

1:正点实验内容

代码完全复用二值信号量实验,只是多开了configUSE_TICKLESS_IDLE = 1和两个钩子:

// 进 WFI 前关掉不用 GPIO 的时钟,省电 void PRE_SLEEP_PROCESSING(void) { __HAL_RCC_GPIOA_CLK_DISABLE(); // 全关 __HAL_RCC_GPIOB_CLK_DISABLE(); ... } ​ // WFI 醒来重新打开 void POST_SLEEP_PROCESSING(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 全开 ... }

运行时流程

task1 扫键(10ms 醒一次) task2 死等信号量(永远睡着) 没有任务要跑时 → Idle 跑 → 算下次谁要醒 → WFI 睡觉 → 省电 ​ ↓ 到点了或中断来了 ​ POST_SLEEP_PROCESSING → 恢复 GPIO 时钟 → 调度器继续跑

2:用到的几个宏

作用不改行不行
configUSE_TICKLESS_IDLE = 1总开关必须改
configEXPECTED_IDLE_TIME_BEFORE_SLEEP空闲时间 < 这个值就不进 WFI(防止刚睡就被叫醒,进出开销比省的电还大)✅ 默认 2 tick,不改也行
configPRE_SLEEP_PROCESSING进 WFI 前要执行的操作✅ 默认空,我们没在宏里写,直接用弱函数PRE_SLEEP_PROCESSING()替代了
configPOST_SLEEP_PROCESSING出 WFI 后要执行的操作✅ 同上

正点 PPT 把四个宏全介绍了是讲原理——告诉你 Tickless 有这些可配置的点。实际动手时configUSE_TICKLESS_IDLE = 1一开,另外三个要么有默认值、要么我们已经用弱函数实现了,不需要额外改。

三:实验改动

rtos\22\ 改动清单

freertos_demo.c
行号内容
54-82PRE_SLEEP_PROCESSING+POST_SLEEP_PROCESSING— 睡前关 7 个 GPIO 时钟,醒后开回来
102-137二值信号量 + 两个任务(复用 rtos\11\ 逻辑)
FreeRTOSConfig.h
行号内容
46configUSE_TICKLESS_IDLE0→1
main.c
行号内容
26printf 标题 →"FreeRTOS Tickless Test!"

Tickless 没有用户 API——只改一个宏 + 两个钩子,业务代码完全不变。可以编译烧录了。

钩子函数:
void PRE_SLEEP_PROCESSING(void) // 钩子1:睡前被 FreeRTOS 调用 → 关 GPIO 时钟 { __HAL_RCC_GPIOA_CLK_DISABLE(); ... } ​ void POST_SLEEP_PROCESSING(void) // 钩子2:醒后被 FreeRTOS 调用 → 开回 GPIO 时钟 { __HAL_RCC_GPIOA_CLK_ENABLE(); ... }

钩子 = FreeRTOS 在 Idle 任务里 WFI 的前后给你留的空位。你不写这两个函数 → WFI 照常工作,但 GPIO 时钟还开着 → 省电效果打折扣。你写了 → 睡前关掉、醒后开回 → 省更多电。

运行逻辑总结
正常运行时: task1:每 10ms 醒一次扫按键 task2:死等信号量,阻塞 ​ 没有任务跑的时候: CPU 不是傻等 SysTick → 是进 Idle 任务 → 调 PRE_SLEEP → WFI 睡觉 → 等中断叫醒

你什么键都不按的时候,系统大部分时间在 WFI 里睡觉,电流比普通 RTOS 低很多。正点的实验逻辑就是这么简单——用之前的二值信号量实验直接套上 Tickless 的开关。

实验现象就是原例程输出给你对比的:

二值信号量创建成功!! 信号量释放成功!! 获取信号量成功 ← 按 KEY0 触发一次 信号量释放成功!! 获取信号量成功 ← 按 KEY1 触发一次

功能一模一样,只是不按键的时候 CPU 在睡觉省电。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 8:05:59

Spark大数据处理入门:从核心概念到实战调优全解析

1. 先搞清楚 Spark 到底是什么&#xff0c;以及它到底能帮你解决什么问题如果你刚接触大数据处理&#xff0c;听到“Spark”这个词&#xff0c;可能会有点懵。它不是一个具体的软件&#xff0c;而是一个统一的计算引擎。简单来说&#xff0c;它最核心的价值是&#xff1a;让你能…

作者头像 李华
网站建设 2026/8/6 8:01:39

解决Python pip安装错误:externally-managed-environment的四种方案

1. 问题引入&#xff1a;当“pip install”不再是万能钥匙 最近在给一台新装的Ubuntu 23.10或者最新的Fedora 39系统配置Python环境时&#xff0c;你是不是也遇到了这个让人有点懵的报错&#xff1f;满心欢喜地打开终端&#xff0c;敲下熟悉的 pip install requests &#xf…

作者头像 李华
网站建设 2026/8/6 8:01:24

Insta360 Ace Pro运动相机MP4文件损坏恢复全攻略:从诊断到修复

1. 从一次数据危机说起&#xff1a;为什么运动相机的恢复如此重要那天在滑雪场&#xff0c;我正准备导出Ace Pro里一整天的跟拍素材&#xff0c;连接电脑后&#xff0c;系统提示“设备需要修复”。我心里咯噔一下&#xff0c;尝试了几次&#xff0c;存储卡里的MP4文件要么无法读…

作者头像 李华
网站建设 2026/8/6 8:00:07

Gitee Pages静态站点部署全攻略:从原理到实战避坑指南

1. 项目概述&#xff1a;为什么选择Gitee Pages部署静态站点&#xff1f; 如果你是一名前端开发者、技术博主&#xff0c;或者只是想找个地方放一下自己的个人简历、项目展示页面&#xff0c;那么“部署一个静态站点”这个需求你一定不陌生。静态站点&#xff0c;说白了就是一堆…

作者头像 李华
网站建设 2026/8/6 7:55:00

TensorRT模型精度调试实战:polygraphy工具链详解

1. 从一次模型推理的“诡异”精度损失说起最近在把一个训练好的PyTorch模型部署到NVIDIA GPU上做推理加速&#xff0c;用上了TensorRT。流程走得很顺&#xff0c;模型转换、构建引擎、执行推理&#xff0c;一气呵成。然而&#xff0c;当我兴冲冲地对比原始PyTorch模型和TensorR…

作者头像 李华