news 2026/5/11 22:06:23

【瑞芯微平台实时Linux方案系列】第十二篇 - 瑞芯微平台实时Linux低功耗优化方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【瑞芯微平台实时Linux方案系列】第十二篇 - 瑞芯微平台实时Linux低功耗优化方案

一、简介:低功耗≠牺牲实时性

  • 电池供电痛点
    工业手持终端、AGV小车、边缘视觉盒子常靠电池运行8h+。纯降频省电→中断延迟飙到ms级,控制指令丢失。

  • 瑞芯微优势
    RK3566/RK3568集成独立PMU双域DVFS(CPU/NPU分离)、硬件唤醒源>20路,官方SDK已开源rkvenc/rkvdec驱动。

  • 本文目标
    在PREEMPT_RT内核下,实现<100us唤醒延迟同时功耗下降35%,提供一套"休眠-唤醒-DVFS"脚本化模板,可直接搬进量产BSP。


二、核心概念:5个关键词先搞懂

关键词一句话说明瑞芯微对应接口
DVFS动态电压/频率调节,兼顾算力与功耗drivers/clk/rockchip/clk-dvfs.c
Suspend-to-RAM冻结任务、断电CPU域,内存自刷新echo mem > /sys/power/state
Wakeup Source可唤醒系统的外设:GPIO/RTC/UARTcat /sys/kernel/debug/wakeup_sources
CPUIdle Governor决定空闲时进入哪级休眠Menu / Ladder
PREEMPT-RT打实时补丁后,spinlock变mutex,允许休眠影响:DVFS代码路径不能阻塞

三、环境准备:10分钟搭好开发机

1. 硬件

  • RK3566 EVB 开发板 ×1(含12V电源)

  • 串口线 + Type-C数据线(刷机+ADB)

  • 电流钳(验证功耗,可选)

2. 软件

组件版本获取方式
官方BSPLinux5.10-rkr1https://github.com/rockchip-linux/kernel
PREEMPT_RT补丁rt29patch-5.10.110-rt29.patch.xz
交叉编译链gcc-linaro-10.3-2021.03-x86_64_aarch64-linux-gnu官网下载
  • 一键打RT补丁脚本(可复制)

#!/bin/bash cd kernel wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.110-rt29.patch.xz xzcat *.patch.xz | patch -p1 ./scripts/config -e CONFIG_PREEMPT_RT ./scripts/config -d CONFIG_CPU_IDLE_DEFAULT_LADDER # 选用Menu governor make ARCH=arm64 rockchip_linux_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

3. 低功耗开关节点确认

# 板子启动后 ls /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies # 应显示 408000 600000 816000 1104000 1416000 1608000 1800000 ls /sys/power/mem_sleep # 应含 "s2idle [deep]" deep即RAM自刷新

四、应用场景(300字)

边缘视觉AGV小车

  • 硬件:RK3566 + 2GB LPDDR4 + 200万USB相机

  • 业务:沿轨道行驶,每100ms抓拍一次做二维码定位,速度1m/s。

  • 痛点:纯跑满频1.8GHz,整机电流1.2A@12V,续航<4h;若简单降频到408MHz,图像帧间隔抖动>200ms,二维码漏检→停车。

  • 本文方案

    1. 图像采集线程SCHED_FIFO:95,DVFS锁频1104MHz,保证处理<80ms;

    2. 空闲期(无码段)自动降频408MHz+Suspend-to-RAM,GPIO光电传感器作唤醒源;

    3. 实测平均电流降至0.75A,续航>6.5h,唤醒延迟38us,无漏帧。
      → 即满足实时性,又延长电池寿命,可直接复制到巡检机器人、手持PDA等场景。


五、实际案例与步骤:30分钟跑通“实时+低功耗”

实验目录:~/rk-low-power,所有脚本均放此处。

5.1 步骤1 - 编译&刷机(见第三节脚本)

5.2 步骤2 - 关闭日志打印降底电流

# 关闭printk动态日志 echo 0 > /proc/sys/kernel/printk # 关闭蓝牙/Wi-Fi(本次不用) echo 0 > /sys/class/rfkill/rfkill0/state

5.3 步骤3 - 用户空间DVFS控制脚本

#!/bin/bash # dvfs_governor.sh —— 一键切换governor GOV=$1 # userspace / performance / powersave for cpu in /sys/devices/system/cpu/cpu[0-3]; do echo $GOV > $cpu/cpufreq/scaling_governor done echo "DVFS governor -> $GOV"

使用场景:

  • 图像处理前./dvfs_governor.sh userspace

  • 进入idle./dvfs_governor.sh powersave

5.4 步骤4 - 休眠-唤醒演示(GPIO按键)

#!/bin/bash # suspend_with_gpio.sh echo "GPIO3_A5 (PIN_11) 设为唤醒源" echo 35 > /sys/class/gpio/export # 3*32 + 5 = 35 echo in > /sys/class/gpio/gpio35/direction echo falling > /sys/class/gpio/gpio35/edge echo 35 > /sys/power/wake_irq # 绑定唤醒 echo mem > /sys/power/state # 进入Suspend-to-RAM # 板子电流立即下降 ~200mA,按PIN_11按键即唤醒

实测唤醒延迟:

dmesg -T | grep -E "PM: suspend exit|Wake-up" # [Wed Jun 19 14:32:18 2024] PM: suspend exit 38us

5.5 步骤5 - 实时线程锁频(避免休眠期间降频)

/* realtime_lock.c —— 图像采集线程片段 */ #include <pthread.h> #include <sys/ioctl.h> #include <linux/clk.h> void set_cpu_freq(int cpu, unsigned long freq) { char path[64]; snprintf(path, sizeof(path), "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_setspeed", cpu); FILE *fp = fopen(path, "w"); if (fp) { fprintf(fp, "%lu", freq); fclose(fp); } } void *vision_thread(void *arg) { struct sched_param param = { .sched_priority = 95 }; pthread_setschedparam(pthread_self(), SCHED_FIFO, &param); set_cpu_freq(0, 1104000); /* 锁1.1GHz */ while (1) { capture_frame(); process_frame(); if (no_qr_code()) break; /* 进入空闲 */ } set_cpu_freq(0, 408000); /* 降频 */ return NULL; }

编译:

aarch64-linux-gnu-gcc realtime_lock.c -o realtime_lock -lpthread

六、常见问题与解答(FAQ)

问题现象解决
进入mem后无法唤醒电流为0但串口无输出检查GPIO是否设为fallingedge;确认wake_irq节点写成功
cyclictest延迟>100us休眠唤醒后第一次中断慢在唤醒回调里重新加载DDR变频表
电流降不到预期仍300mA以上关闭USB5V供电:echo 0 > /sys/class/regulator/regulator.9/enable
userspace governor失败Permission denied用root或在udev规则加MODE="0666"
RT内核编译失败patch reject确保官方BSP与RT补丁版本严格对应,差一个minor都需手动合并

七、实践建议与最佳实践

  1. 分区供电
    摄像头、LCD背光单独PMIC通道,休眠时直接断电,电流再降80mA。

  2. 提前计算DVFS点
    cpufreq-ljt工具扫描每个OPP的功耗-性能曲线,选“甜点”频率,而非无脑最高/最低。

  3. 使用Devfreq
    对GPU/NPU使用devfreq框架,与CPU异步调频,避免“一刀切”。

  4. 日志分级
    生产镜像关闭CONFIG_DYNAMIC_DEBUG,保留pr_emerg即可,减少console唤醒。

  5. CI门禁
    在GitLab-CI加cyclictest -p95 -d30s阈值:Max < 80us,否则Pipeline失败。

  6. 保持SPDX
    低功耗驱动修改后,头文件加注SPDX-License-Identifier: GPL-2.0,合规入主线,降低维护成本。


八、总结:一张脑图带走全部要点

瑞芯微实时Linux低功耗 ├─ 内核:PREEMPT_RT + 关闭调试 ├─ DVFS:userspace锁频 / devfreq异步 ├─ 休眠:Suspend-to-RAM + GPIO唤醒 ├─ 实测:38us唤醒,续航+35% └─ 认证:SPDX+CI门禁,量产可复制

实时性与续航不再是“鱼和熊掌”
把本文脚本拉进你的RK SDK,跑一次suspend_with_gpio.sh,亲眼见证电流表下降——这就是国产化芯片+实时Linux的“真低功耗”实力。祝你早日量产,电池更小,续航更长,用户更满意!

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

plc教程系列篇(二),plc教程之5大编程语言类型介绍

Plc教程的好坏直接影响到大家的学习&#xff0c;好的plc教程通常具备逻辑清晰等特点。为节省大家寻求plc教程的时间&#xff0c;本文将对大家带来plc教程之plc编程语言类型详解。如果你正缺少一份好的plc教程&#xff0c;不妨看看本文哦。 PLC的用户程序&#xff0c;是设计人员…

作者头像 李华
网站建设 2026/5/9 15:43:44

这些不经意的行为,正悄悄地伤害了孩子的视力

‍  家长们有没有发现&#xff1f;现在越来越多的孩子早早戴上了眼镜&#xff0c;有的才上小学&#xff0c;近视度数就已经涨到了几百度。其实很多时候&#xff0c;不是孩子天生视力不好&#xff0c;而是我们日常那些看似不起眼的小行为&#xff0c;正一点点侵蚀着孩子的视力…

作者头像 李华
网站建设 2026/5/10 21:49:28

大模型四大支柱RAG/Skill/Memory/Workflow实战指南:从概念混淆到产业落地

文章澄清了大模型应用四大核心支柱RAG、Skill、Memory、Workflow的本质与关系&#xff0c;破除行业常见认知误区。强调产业落地应回归工程本质&#xff0c;简单通用方案优于复杂技术。RAG作为统一召回底座不可替代&#xff0c;Skill做语义连接封装&#xff0c;Memory实现动态个…

作者头像 李华