Linux电源管理(三),CPUIdle 和 ARM的PSCI
更多linux系统电源管理相关的内容请看:Linux电源管理、功耗管理 和 发热管理 (CPUFreq、CPUIdle、RPM、thermal、睡眠 和 唤醒)-CSDN博客
1 简介
Linux下的空闲进程cpuidle在内核中是一个子系统。cpuidle子系统所需要做的事情就是在CPU进入idle状态后,根据一系列的决策依据判断该CPU进入什么样的C-State。
《深入Linux内核架构与底层原理》(第2版),6.4 C-State
CPU空闲态电源管理在Linux内核中称为CPUIdle⼦系统,它主要适 ⽤于CPU利⽤率在5%以下(对单个CPU核⽽⾔)动态变化的场景。
《⽤“芯”探核:基于⻰芯的Linux内核探索解析》 8.2 运⾏时电源管理
本文主要基于linux-5.4.18版本的内核代码进行分析。
2 CPUIdle子系统的整体架构
《Linux设备驱动开发详解:基于最新的Linux4.0内核》19.3 CPUIdle驱动;图19.4
3 cpuidle_state
3.1 简介
之所以C-State要定义很多种不同的暂停状态,是因为暂停的时间不同,省电的程度也不同,省电程度越深,代表恢复延迟(exit latency)的时间越长,即从暂停状态恢复到正常执行状态所需要的时间延迟不相同。
《深入Linux内核架构与底层原理》(第2版),6.4 C-State
3.2 数据结构
3.2.1 struct cpuidle_state;
//include/linux/cpuidle.h
struct cpuidle_state {char name[CPUIDLE_NAME_LEN];char desc[CPUIDLE_DESC_LEN];unsigned int flags;unsigned int exit_latency; /* in US */int power_usage; /* in mW */unsigned int target_residency; /* in US */bool disabled; /* disabled on all CPUs */int (*enter) (struct cpuidle_device *dev,struct cpuidle_driver *drv,int index);int (*enter_dead) (struct cpuidle_device *dev, int index);/* * CPUs execute ->enter_s2idle with the local tick or entire timekeeping* suspended, so it must not re-enable interrupts at any point (even* temporarily) or attempt to change states of clock event devices.*/void (*enter_s2idle) (struct cpuidle_device *dev,struct cpuidle_driver *drv,int index);
};
3.2.2 struct cpuidle_state_usage;
//include/linux/cpuidle.h
struct cpuidle_state_usage {unsigned long long disable;unsigned long long usage;unsigned long long time; /* in US */unsigned long long above; /* Number of times it's been too deep */unsigned long long below; /* Number of times it's been too shallow */
#ifdef CONFIG_SUSPENDunsigned long long s2idle_usage;unsigned long long s2idle_time; /* in US */
#endif
};
3.2.3 查看CPU每个核的cpuidle_state信息
# ls /sys/devices/system/cpu/cpu0/cpuidle/
state0 state1 state2 state3
#
# ls /sys/devices/system/cpu/cpu0/cpuidle/state0/ -l
总用量 0
-r--r--r-- 1 root root 4096 4月 16 22:08 above //cpuidle_state_usage->above
-r--r--r-- 1 root root 4096 4月 16 22:08 below //cpuidle_state_usage->below
-r--r--r-- 1 root root 4096 4月 16 16:44 default_status
-r--r--r-- 1 root root 4096 4月 16 16:44 desc //cpuidle_state->desc
-rw-r--r-- 1 root root 4096 4月 16 22:08 disable //cpuidle_state_usage->disable
-r--r--r-- 1 root root 4096 4月 16 22:08 latency //cpuidle_state->exit_latency
-r--r--r-- 1 root root 4096 4月 16 16:39 name //cpuidle_state->name
-r--r--r-- 1 root root 4096 4月 16 22:08 power //cpuidle_state->power_usage
-r--r--r-- 1 root root 4096 4月 16 22:08 rejected
-r--r--r-- 1 root root 4096 4月 16 22:08 residency //cpuidle_state->target_residency
-r--r--r-- 1 root root 4096 4月 16 22:08 time //cpuidle_state_usage->time
-r--r--r-- 1 root root 4096 4月 16 22:08 usage //cpuidle_state_usage->usage
3.3 支持ACPI的intel CPU的cpuidle_state
对于Intel系列笔记本计算机⽽⾔,⽀持ACPI,⼀般有4个不同的C状态 (其中C0为操作状态,C1是Halt状态,C2是Stop-Clock状态,C3是Sleep状态)
《Linux设备驱动开发详解:基于最新的Linux4.0内核》 19.3 CPUIdle驱动
Processor power states include are designated C0, C1, C2, C3, . . . Cn.
The C0 power state is an active power state where the CPU executes instructions. The C1 through Cn power states are
processor sleeping states where the processor consumes less power and dissipates less heat than leaving the processor in the C0 state. While in a sleeping state, the processor does not execute any instructions. Each processor sleeping state has a latency associated with entering and exiting that corresponds to the power savings. In general, the longer the entry/exit latency, the greater the power savings when in the state.
《Advanced Configuration and Power Interface (ACPI) Specification》8.1 Processor Power States
3.4 支持PSCI的ARM CPU的cpuidle_state (Power States)
3.4.1 简介
⽬前ARM SoC⼤多⽀持⼏个不同的Idle级别,CPUIdle驱动⼦系统存在的⽬的 就是对这些Idle状态进⾏管理,并根据系统的运⾏情况进⼊不同的Idle级别。
《Linux设备驱动开发详解:基于最新的Linux4.0内核》 19.3 CPUIdle驱动
Multiprocessor systems can have several different power domains to power different elements of the
system. Each power domain might contain a combination of one or more processing elements (such as
cores, coprocessors, or GPUs), memories (caches, DRAMs), and fabric (for example inter-cluster and
intra-cluster coherency fabric). PSCA [1] provides detailed descriptions of how power domains can be
constructed in systems that use Arm components.
Each component in a power domain has a set of power states that affect the components in the
domain. Although physically the power domains are not necessarily built in a hierarchical fashion, from
a software control point of view, they are arranged in a logical hierarchy. The hierarchy arises out of
ordering dependencies that are required when placing the power domains into different power states.
For example, consider a power domain that encompasses a shared cache, and power domains for the
cores that use it. In such a system, the core power domains must be powered down before the shared
cache domain, to guarantee correct operation.
《Arm Power State Coordination Interface》4.2 Power state system topologies and coordination
3.4.2 控制接口:CPU_SUSPEND
cpuidle驱动中通过下面的函数控制一个支持PSCI的CPU进入某种idle state
//drivers/firmware/psci/psci.c
static int psci_cpu_suspend(u32 state, unsigned long entry_point)
{int err;u32 fn;fn = psci_function_id[PSCI_FN_CPU_SUSPEND];err = invoke_psci_fn(fn, state, entry_point, 0);return psci_to_linux_errno(err);
}
psci_cpu_suspend()函数被调用的流程请看下面的“4.2.3” 小节
PSCI手册上的相关信息:
The CPU_SUSPEND API is used to move a topology node into a low-power state.
This is the only format that is supported by versions of PSCI prior to 1.0. When this format is in use,
bit[1] of the flags field returned by PSCI_FEATURES with a CPU_SUSPEND function ID is set to 0.
In this format, the power_state parameter is broken into the following fields:
PowerLevel:
• Level 0: for cores
• Level 1: for clusters
• Level 2: for system
《Arm Power State Coordination Interface》5.4 CPU_SUSPEND
上面提到的“power_state parameter”可以通过设备树中的“arm,psci-suspend-param”属性来指定,例如:
idle-states {entry-method = "psci";CPU_SLEEP: cpu-sleep {compatible = "arm,idle-state";local-timer-stop;arm,psci-suspend-param = <0x0010000>;entry-latency-us = <700>;exit-latency-us = <250>;min-residency-us = <1000>;}; CLUSTER_SLEEP: cluster-sleep {compatible = "arm,idle-state";local-timer-stop;arm,psci-suspend-param = <0x1010000>;entry-latency-us = <1000>;exit-latency-us = <700>;min-residency-us = <2700>;wakeup-latency-us = <1500>;}; };cpu0: cpu@0 {......enable-method = "psci";cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP>;......};
cpuidle驱动中获取设备树中“power_state parameter”值的流程请看下面的“4.2.2”小节
更多设备树中PSCI相关的设置请看Documentation/devicetree/bindings/arm/idle-states.txt
4 struct cpuidle_driver 和 struct cpuidle_device
4.1 简介
CPUIdle驱动必须针对每个CPU注册相应的cpuidle_device。
struct cpuidle_driver结构体关键成员是1个cpuidle_state表,其实该表就是用于存储各种不同Idle级别的信息
《Linux设备驱动开发详解:基于最新的Linux4.0内核》19.3 CPUIdle驱动
4.2 psci_idle_driver驱动分析
4.2.1 数据结构
//drivers/cpuidle/cpuidle-psci.c
static struct cpuidle_driver psci_idle_driver __initdata = {.name = "psci_idle",.owner = THIS_MODULE,/** PSCI idle states relies on architectural WFI to* be represented as state index 0.*/.states[0] = {.enter = psci_enter_idle_state,.exit_latency = 1,.target_residency = 1,.power_usage = UINT_MAX,.name = "WFI",.desc = "ARM WFI",}
};
4.2.2 初始化大致流程
psci_idle_init(); //device_initcall(psci_idle_init);-> psci_idle_init_cpu(cpu); -> drv = kmemdup(&psci_idle_driver, sizeof(*drv), GFP_KERNEL);-> dt_init_idle_driver(drv, psci_idle_state_match, 1);-> idle_state = &drv->states[state_idx++];-> init_state_node(idle_state, match_id, state_node); //从设备树中读取state的值,并设置cpuidle_state的成员-> idle_state->enter = match_id->data; //psci_enter_idle_state();-> idle_state->enter_s2idle = match_id->data;-> of_property_read_u32(state_node, "wakeup-latency-us", &idle_state->exit_latency);-> idle_state->exit_latency = entry_latency + exit_latency;-> of_property_read_u32(state_node, "min-residency-us", &idle_state->target_residency);-> psci_cpu_init_idle();-> psci_dt_cpu_init_idle();-> of_parse_phandle(cpu_node, "cpu-idle-states", i);-> psci_dt_parse_state_node();-> of_property_read_u32(np, "arm,psci-suspend-param", state);-> cpuidle_register(drv, NULL);-> cpuidle_register_driver();-> cpuidle_register_device();
4.2.3 进入某个idle state的大致流程
do_idle(); //kernel/sched/idle.c-> cpuidle_idle_call();-> cpuidle_select(); //choose an idle state-> cpuidle_curr_governor->select(drv, dev, stop_tick);-> call_cpuidle(); -> cpuidle_enter(); //drivers/cpuidle/cpuidle.c-> cpuidle_enter_state();-> trace_cpu_idle_rcuidle();-> entered_state = target_state->enter(dev, drv, index);-> trace_cpu_idle_rcuidle();-> cpuidle_reflect();-> cpuidle_curr_governor->reflect(dev, index);
psci_idle_driver中的target_state->enter()是psci_enter_idle_state()
psci_enter_idle_state();-> psci_cpu_suspend_enter();-> cpu_suspend();-> __cpu_suspend_enter();-> psci_suspend_finisher();-> psci_ops.cpu_suspend();-> psci_cpu_suspend(); //drivers/firmware/psci/psci.c-> fn = psci_function_id[PSCI_FN_CPU_SUSPEND];-> invoke_psci_fn(fn, state, entry_point, 0);
4.3 查看系统当前使用的cpuidle_driver
# cat /sys/devices/system/cpu/cpuidle/current_driver
intel_idle
5 governor
5.1 简介
与CPUFreq类似,在CPUIdle子系统中也有对应的governor来抉择何时进入何种Idle级别的策略。
5.2 数据结构
//include/linux/cpuidle.h
struct cpuidle_governor {char name[CPUIDLE_NAME_LEN];struct list_head governor_list;unsigned int rating;int (*enable) (struct cpuidle_driver *drv,struct cpuidle_device *dev);void (*disable) (struct cpuidle_driver *drv,struct cpuidle_device *dev);int (*select) (struct cpuidle_driver *drv, //决策要进入的下一个Statestruct cpuidle_device *dev,bool *stop_tick);void (*reflect) (struct cpuidle_device *dev, int index); //从State退出的时候调用的回调函数
};
register接口
int cpuidle_register_governor(struct cpuidle_governor *gov);
5.3 现有的governor
5.3.1 ladder 和 menu
LADDER在进入和退出Idle级别的时候是步进的,它以过去的Idle时间作为参考,而MENU总是根据预期的空闲时间直接进入目标Idle级别。前者适用于没有采用动态时间节拍的系统(即没有选择NO_HZ的系统),不依赖于NO_HZ配置选项,而后者依赖于内核的NO_HZ选项。
下图演示了LADDER步进从C0进入C3,而MENU则可能直接从C0跳入C3。
《Linux设备驱动开发详解:基于最新的Linux4.0内核》 19.3 CPUIdle驱动
数据结构
//drivers/cpuidle/governors/ladder.c
static struct cpuidle_governor ladder_governor = { .name = "ladder",.rating = 10, .enable = ladder_enable_device,.select = ladder_select_state,.reflect = ladder_reflect,
};
//drivers/cpuidle/governors/menu.c
static struct cpuidle_governor menu_governor = { .name = "menu",.rating = 20, .enable = menu_enable_device,.select = menu_select,.reflect = menu_reflect,
};
5.3.2 teo
The Timer Events Oriented (TEO) Governor
========================================
The timer events oriented (TEO) governor is an alternative ``CPUIdle`` governor
for tickless systems. It follows the same basic strategy as the ``menu`` `one
<menu-gov_>`_: it always tries to find the deepest idle state suitable for the
given conditions. However, it applies a different approach to that problem.
Documentation/admin-guide/pm/cpuidle.rst
数据结构
//drivers/cpuidle/governors/teo.c
static struct cpuidle_governor teo_governor = { .name = "teo",.rating = 19, .enable = teo_enable_device,.select = teo_select,.reflect = teo_reflect,
};
5.3.3 haltpoll (虚拟机)
Guest halt polling
==================
The cpuidle_haltpoll driver, with the haltpoll governor, allows
the guest vcpus to poll for a specified amount of time before
halting.
This provides the following benefits to host side polling:
1) The POLL flag is set while polling is performed, which allows
a remote vCPU to avoid sending an IPI (and the associated
cost of handling the IPI) when performing a wakeup.
2) The VM-exit cost can be avoided.
Documentation/virtual/guest-halt-polling.txt
数据结构
//drivers/cpuidle/governors/haltpoll.c
static struct cpuidle_governor haltpoll_governor = { .name = "haltpoll",.rating = 9,.enable = haltpoll_enable_device,.select = haltpoll_select,.reflect = haltpoll_reflect,
};
5.4 查看 和 设置系统当前使用的governor
查看当前系统支持的governor
# cat /sys/devices/system/cpu/cpuidle/available_governors
ladder menu teo
设置当前系统使用的governor
echo menu > /sys/devices/system/cpu/cpuidle/current_governor
6 调试
6.1 /sys/devices/system/cpu/cpuidle/
6.2 /sys/kernel/debug/tracing/events/power/cpu_idle/
6.3 cpupower idle-info|idle-set
相关文章:
Linux电源管理(三),CPUIdle 和 ARM的PSCI
更多linux系统电源管理相关的内容请看:Linux电源管理、功耗管理 和 发热管理 (CPUFreq、CPUIdle、RPM、thermal、睡眠 和 唤醒)-CSDN博客 1 简介 Linux下的空闲进程cpuidle在内核中是一个子系统。cpuidle子系统所需要做的事情就是在CPU进入idle状态后,…...
【测试工具】JMeter使用小记
JMeter 使用小记 下载与安装 jdk 下载地址:https://www.oracle.com/java/technologies/downloads/#jdk18-windowsJMeter 下载地址:https://jmeter.apache.org/download_jmeter.cgi 教程参考:JMeter下载及安装详细教程-CSDN博客 设置中文界…...
Obsidian的简单使用
一、安装并配置仓耳今楷字体 优化阅读体验,个人实测觉得正文用 仓耳今楷04-W03最合适(前面的数字代表字体,数字越大,越偏向于楷体,而01就很像黑体。后面的数字代表粗细,正常粗细是W03,最粗是W0…...
docker的基础知识
Docker https://www.yuque.com/leifengyang/sutong 下载镜像 检索: docker search下载: docker pull列表: docker images删除 docker rmi启动容器 运行: docker run查看: docker ps停止: docker stop启动: …...
PcVue助力立讯:精密制造的智能化管控实践!
PcVue助力立讯: 精密制造的智能化管控实践! 客户介绍 立讯精密(Luxshare ICT,股票代码:002475)成立于2004年5月24日,专注于为消费电子产品、汽车领域产品以及企业通讯产品提供从核心零部件、…...
深度学习-157-Dify工具之创建知识库
文章目录 1 硅基流动1.1 模型广场1.1.1 对话模型(免费)1.1.2 嵌入模型(免费)1.1.3 重排序模型(免费)1.2 模型调用1.2.1 文本对话1.2.2 文本嵌入2 构建知识库2.1 准备文档2.2 点击创建知识库2.3 设置嵌入参数2.4 召回测试3 创建聊天助手3.1 仅使用大模型3.2 结合知识库的大模型3…...
Oracle--安装Oracle Database23ai Free
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 官方文档: Get Started with Oracle Database 23ai | Oracle 一、安装的环境要求 本文同步使用Oracle Linux9的虚拟机进行操作 1、Orac…...
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(三)
本篇博客给大家带来的是集合类在多线程下的使用和死锁的知识点还包括常见的面试题. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&…...
【verilog】多个 if 控制同一个变量(后面会覆盖前面)非阻塞赋值真的并行吗?
非阻塞赋值 (<) 是“并行”的,但是代码顺序会影响结果?”这正是 Verilog 的硬件描述本质 vs 行为语义之间的微妙之处。 💡1. 非阻塞赋值真的并行吗? 是的!非阻塞赋值 < 从行为上是并行的,也就是说&a…...
C++事件驱动编程从入门到实战:深入理解与高效应用
C事件驱动编程从入门到实战:深入理解与高效应用 在现代软件开发中,事件驱动编程(Event-Driven Programming)作为一种流行的编程范式,被广泛应用于图形用户界面(GUI)、网络通信、游戏开发等众多…...
问题 | MATLAB比Python更有优势的特定领域
以下是关于MATLAB在特定领域相较于Python的优势的详细分析,结合其核心功能、行业应用及技术特性展开论述: 一、科学研究与工程计算 1. 数值计算的高效性 MATLAB的核心设计围绕矩阵运算展开,其底层对线性代数和数值计算进行了深度优化。例如…...
黑马商城项目(三)微服务
一、单体架构 测试高并发软件 二、微服务 三、SpringCloud 四、微服务拆分 黑马商城模块: 服务拆分原则: 拆分服务: 独立project: maven聚合: 拆分案例: 远程调用: package com.hmall.cart.…...
Qt界面卡住变慢的解决方法
本质原因: 当Qt界面出现卡顿或无响应时,通常是因为主线程(GUI线程)被耗时操作阻塞。 完全忘了。。。 Qt Creater解决方法 1. 定位耗时操作 目标:找到阻塞主线程的代码段。 方法: 使用QElapsedTimer测量代码执行时间…...
Flutter的原理及美团的实践(下)
Flutter的原理及性能实践 Flutter和原生性能对比 虽然使用原生实现(左)和Flutter实现(右)的全品类页面在实际使用过程中几乎分辨不出来: 但是我们还需要在性能方面有一个比较明确的数据对比。 我们最关心的两个页面…...
时序预测 | Matlab实现基于VMD-WOA-ELM和VMD-ELM变分模态分解结合鲸鱼算法优化极限学习机时间序列预测
时序预测 | Matlab实现基于VMD-WOA-ELM和VMD-ELM变分模态分解结合鲸鱼算法优化极限学习机时间序列预测 目录 时序预测 | Matlab实现基于VMD-WOA-ELM和VMD-ELM变分模态分解结合鲸鱼算法优化极限学习机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab…...
【云安全】云原生- K8S IngressNightmare CVE-2025-1974(漏洞复现完整教程)
漏洞原理 CVE-2025-1974: The IngressNightmare in Kubernetes | Wiz Blog 分两方面: a、配置注入过程 构造一个恶意的Ingress资源,其中注入ssl_engine指令指向恶意共享库向准入控制器验证端点(AdmissionWebhook)发送Admissio…...
Tomcat与Servlet(2)
上篇文章: Tomcat与Servlethttps://blog.csdn.net/sniper_fandc/article/details/147278469?fromshareblogdetail&sharetypeblogdetail&sharerId147278469&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上篇文章介绍了To…...
在高数据速度下确保信号完整性的 10 个关键策略
随着越来越多的传感器连接到系统,需要快速、可靠和安全地传输更多数据,对带宽和设计复杂性的需求也在增加。优先考虑的是确保从 A 发送到 B 的信号不会失真。 确保信号完整性 对于设计依赖于持续准确数据流的数据密集型应用程序的工程师来说,…...
2025华中杯数学建模B题完整分析论文(共42页)(含模型、数据、可运行代码)
2025华中杯大学生数学建模B题完整分析论文 目录 一、问题重述 二、问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1解析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.1.4问题1求解结果(仅供参考&am…...
UE5 自带的视频播放器
文章目录 文件夹准备添加一个文件媒体源方法1方法2 添加一个视频播放器播放视频直接播放使用网格体播放使用UI播放 播放视频的音乐媒体播放器常用的节点设置循环是用绝对路径播放视频,视频无需导入注册播放完成事件 文件夹准备 视频必须被放在Content/Moveis文件下…...
是德科技E5080B网络分析仪深度评测:5G/车载雷达测试实战指南
是德科技E5080B网络分析仪(ENA系列)是一款高性能射频测试仪器,广泛应用于通信、航空航天、半导体等领域,以下是其核心功能详解: 一、核心测试功能 多参数网络分析 S参数测量:支持全双端口S参数测试…...
javaSE————网络编程套接字
网络编程套接字~~~~~ 好久没更新啦,蓝桥杯爆掉了,从今天开始爆更嗷; 1,网络编程基础 为啥要有网络编程呢,我们进行网络通信就是为了获取丰富的网络资源,说实话真的很神奇,想想我们躺在床上&a…...
力扣349 == 两个数组交集的两种解法
目录 解法一:利用 Set 特性高效去重 解法二:双重遍历与 Set 去重 方法对比与总结 关键点总结 题目描述 给定两个整数数组 nums1 和 nums2,要求返回它们的交集。输出结果中的每个元素必须是唯一的,且顺序不限。 示例 输入&…...
笔试专题(十)
文章目录 对称之美(双指针)题解代码 连续子数组最大和(线性dp)题解代码 最长回文子序列(区间dp)题解代码 对称之美(双指针) 题目链接 题解 1. 双指针 2. 用left标记左边的字符串…...
YOLOv12即插即用---RFAConv
1.模块介绍 接受域注意卷积(RFAConv):更聪明地感知空间特征 在传统卷积神经网络中,卷积核参数的共享机制虽有效提升了模型的泛化能力与计算效率,但却忽略了不同空间位置特征在感知范围(即接受域)内的重要性差异。为此,我们提出了一种更具感知能力的模块 —— 接受域注…...
使用datax通过HbaseShell封装writer和reader同步hbase数据到hbase_踩坑_细节总结---大数据之DataX工作笔记008
最近在做大数据相关功能,有个需求,使用datax同步hbase到hbase中,其中还是有很多细节值得记录: 首先来看一下datax的源码中,如果你使用phoenix创建的表,那么 你就需要使用对应的hbase带有sql字样的,reader和writer. 然后如果你使用datax-web来进行测试的,那么,他默认使用的是h…...
Python解决“小D的abc字符变换”问题
小D的“abc”变换问题 问题描述测试样例解题思路代码 问题描述 小D拿到了一个仅由 “abc” 三种字母组成的字符串。她每次操作会对所有字符同时进行以下变换: 将 ‘a’ 变成 ‘bc’ 将 ‘b’ 变成 ‘ca’ 将 ‘c’ 变成 ‘ab’ 小D将重复该操作 k 次。你的任务是输…...
C++学习:六个月从基础到就业——面向对象编程:重载运算符(下)
C学习:六个月从基础到就业——面向对象编程:重载运算符(下) 本文是我C学习之旅系列的第十三篇技术文章,是面向对象编程中运算符重载主题的下篇。本篇文章将继续深入探讨高级运算符重载技术、特殊运算符、常见应用场景和…...
电压模式控制学习
电压模式控制 在开关电源中,大的可分为三大控制模式,分别是电压模式控制,电流模式控制,迟滞模式控制。今天简要介绍下电压模式控制的优缺点。 原理 架构图如下 如图所示,电压模式控制可以分为三部分:误…...
vue3 Ts axios 封装
vue3 Ts axios 封装 axios的封装 import axios, { AxiosError, AxiosInstance, InternalAxiosRequestConfig, AxiosResponse, AxiosRequestConfig, AxiosHeaders } from axios import qs from qs import { config } from ./config import { ElMessage } from element-plus// …...
GPT,Bert类模型对比
以下是对 BERT-base、RoBERTa-base、DeBERTa-base 和 DistilBERT-base 四个模型在参数量、训练数据、GPU 内存占用、性能表现以及优缺点方面的对比: 模型参数量与训练数据 模型参数量训练数据量BERT-base110MBookCorpus(8亿词) 英文维基百科…...
3.Rust + Axum 提取器模式深度剖析
摘要 深入解读 Rust Axum 提取器模式,涵盖内置提取器及自定义实现。 一、引言 在 Rust 的 Web 开发领域,Axum 作为一款轻量级且高效的 Web 框架,为开发者提供了强大的功能。其中,提取器(Extractor)模式…...
Dify vs n8n vs RAGFlow:2025年AI应用与自动化工作流平台的终极对决
我将为大家整理一份关于 Dify、n8n 和 Ragflow 的最新研究分析,涵盖以下六个方面:功能对比、应用场景、架构设计、集成能力、和使用门槛。我会尽可能引用其官方文档、GitHub 仓库以及社区讨论等权威信息来源。 我整理好后会第一时间通知你查看。 1.Dify、n8n 和 RAGFlow 最新…...
ffmpeg无损转格式的命令行
将ffmpeg.exe拖入命令行窗口 c:\users\zhangsan>D:\ffmpeg-2025-03-11\bin\ffmpeg.exe -i happy.mp4 -c:v copy -c:a copy 格式转换后.mkv -c:v copy 仅做拷贝视频,不重新编码 -c:a copy 仅做拷贝音频 ,不重新编码...
Flutter 常用命令
1、创建项目 flutter create <项目名称> 示例: flutter create my_app 1.1 参数说明 --org:设置包名(默认 com.example) flutter create --org com.yourcompany my_app -a/-i:指定语言(Kotlin…...
【零基础】基于DeepSeek-R1与Qwen2.5Max的行业洞察自动化平台
自动生成行业报告,通过调用两个不同的大模型(DeepSeek 和 Qwen),完成从行业趋势分析到结构化报告生成的全过程。 完整代码:https://mp.weixin.qq.com/s/6pHi_aIDBcJKw1U61n1uUg 🧠 1. 整体目的与功能 该脚本实现了一个名为 ReportGenerator 的类,用于: 调用 DeepSe…...
UE5 关卡序列
文章目录 介绍创建一个关卡序列编辑动画添加一个物体编辑动画时间轴显示秒而不是帧时间轴跳转到一个确定的时间时间轴的显示范围更改关键帧的动画插值方式操作多个关键帧 播放动画 介绍 类似于Unity的Animation动画,可以用来录制场景中物体的动画 创建一个关卡序列…...
1.凸包、极点、极边基础概念
目录 1.凸包 2.调色问题 3.极性(Extrem) 4.凸组合(Convex Combination) 5.问题转化(Strategy)编辑 6.In-Triangle test 7.To-Left-test 8.极边(Extream Edges) 1.凸包 凸包就是上面蓝色皮筋围出来的范围 这些钉子可以转换到坐标轴中࿰…...
MahApps.Metro:专为 WPF 应用程序设计的 UI 框架
推荐一个WPF 应用程序设计的 UI 框架,方便我们快速构建美观、流畅的应用程序。 01 项目简介 MahApps.Metro 是一个开源的 UI 框架,它可以让开发者快速构建现代化、美观的 WPF 应用程序。 提供了一套完整的 UI 组件和主题,支持流畅的动画效…...
【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码
【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战! 前言:当Java遇上大模型 在AI浪潮席卷全球的今天,Java开发者如何快速拥抱大语言模型?LangChain4j作为专为Java打造的AI开发框架,…...
乐言科技:云原生加速电商行业赋能,云消息队列助力降本 37%
深耕 AI SaaS,助力数万电商客户数智化转型 上海乐言科技股份有限公司(以下简称“乐言科技”,官网:https://www.leyantech.com/)自 2016 年成立以来,专注于利用自然语言处理和深度学习等核心 AI 技术&#…...
vscode构建简单编译和调试环境
一、设置环境变量 将bin目录路径(如D:\DevTools\mingw64\bin)加入系统环境变量PATH34 二、VS Code插件配置 核心插件安装 C/C(微软官方扩展,提供语法高亮、智能提示)Code Runner࿰…...
STM32控制DRV8825驱动42BYGH34步进电机
最近想玩一下人工智能,然后买了个步进电机想玩一下,刚到了一脸懵逼,发现驱动器20多块,有点超预算,然后整了个驱动板,方便自己画线路板,经过各种搜索,终于转起来了,记录一…...
系统清理专家,一键释放磁盘空间!
打工人们你们好!这里是摸鱼 特供版~ 今天给大家带来一款超实用的系统清理工具——Glary Disk Cleaner,帮助你快速清理系统中的垃圾文件,释放磁盘空间,提升系统运行速度! 推荐指数:★★★★★ 软件简介 G…...
识别法院PDF文件特定字段并插入数据库【正则表达式+本地化部署】
pdf解析法院协助单特定字段,开源项目,结合若依项目进行开发,不连互联网,本地开发部署,前端使用vue3技术,后端用若依分离版spring botot技术,实现将pdf法院协助执行通知书中的特定字段如:时间、文…...
探索智能体开发新范式:Cangjie Magic深度解析与实践指南
引言:智能体开发的新纪元 2025年3月,仓颉社区开源了基于仓颉编程语言原生构建的LLM Agent开发平台——Cangjie Magic,为智能体开发领域带来了革命性的变革。作为一名长期关注AI技术发展的开发者,我有幸在第一时间体验了这一创新平…...
计算机网络 - UDP协议
通过一些问题来讨论 UDP 协议 什么是 UDP?举几个应用了 UDP 协议的例子UDP 与 TCP 有啥区别?(PS:介绍三四个就可以了,不用说太多)具体 UDP 是不可靠的,那你觉得如何实现一个可靠的 UDP &#x…...
阿里云ECS访问不了
使用xshell连接阿里云ECS,下载nginx,然后启动 sudo systemctl start nginx 查看状态是 sudo systemctl status nginx 输入公网ip访问实例访问不到,出现 可以查看阿里云实例中的安全组,是否对外开放了80端口和443端口 添加入方向…...
Starrocks添删改查数据(二)
先安装好Starrocks,参考:Starrocks入门(二)_backend node not found. check if any backend node -CSDN博客 1、建立库 建库成功。 2、建立表 参考:表概览 | StarRocks 执行如下SQL: CREATE TABLE user_…...
RT-Thread学习笔记(一)
RT-Thread学习笔记 AIotMMUCPU架构RT-Thread版本工程创建时钟配置FinSH内核RT-Thread内核启动流程 RT-Thread是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统 全称Real Time Thread AIot AIot: Artificial Intelligence of Things…...