linux电源管理(二),内核的CPUFreq(DVFS)和ARM的SCPI
更多linux系统电源管理相关的内容请看:https://blog.csdn.net/u010936265/article/details/146436725?spm=1011.2415.3001.5331
1 简介
CPUFreq子系统位于drivers/cpufreq目录下,负责进行运行过程中CPU频率和电压的动态调整,即DVFS (Dynamic Voltage Frequency Scaling,动态电源频率调整)。
《Linux设备驱动开发详解:基于最新的Linux4.0内核》19.2 CPUFreq驱动
CPU工作态电源管理在Linux内核中称为CPUFreq子系统(在一些文献中也称DVFS),它主要适用于CPU利用率在5%~100%(对单个CPU核而言)动态变化的场景,基本方法是动态变频和动态变压。
《用“芯”探核:基于龙芯的Linux内核探索解析》8.2 运行时电源管理
SoC CPUFreq驱动只是设定了CPU的频率参数,以及提供了设置频率的途径,但是它并不会管CPU自身究竟应该运行在哪种频率上。究竟频率依据的是哪种标准,进行何种变化,而这些完全由CPUFreq的策略决定。
系统的状态以及CPUFreq的策略共同决定了CPU频率跳变的目标,CPUFreq核心层并将目标频率传递给底层具体SoC的CPUFreq驱动,该驱动修改硬件,完成频率的变换。
《Linux设备驱动开发详解:基于最新的Linux4.0内核》19.2.2 CPUFreq的策略
2 cpufreq_driver
2.1 简介
每个SoC的具体CPUFreq驱动实例只需要实现电压、频率表,以及从硬件层面完成这些变化。
《Linux设备驱动开发详解:基于最新的Linux4.0内核》19.2.1 SoC的CPUFreq驱动实现
2.2 数据结构
//include/linux/cpufreq.h
struct cpufreq_driver {char name[CPUFREQ_NAME_LEN];......int (*target)(struct cpufreq_policy *policy,unsigned int target_freq,unsigned int relation); /* Deprecated */int (*target_index)(struct cpufreq_policy *policy,unsigned int index);......
};
target()和target_index()
实现最终调频的接口,内部可以自行实现或调用CLK接口。
这是最重要的一个功能,在切换频率时调用。它会将当前CPU核的主频设置成CPUFreq策略提供的目标频率。
《SoC底层软件低功耗系统设计与实现》13.1.4 主要数据结构;3.driver相关数据结构
《⽤“芯”探核:基于⻰芯的Linux内核探索解析》8.2.1 动态变频;(一) CPUFreq的机制部分
register和unregister接口
int cpufreq_register_driver(struct cpufreq_driver *driver_data);
int cpufreq_unregister_driver(struct cpufreq_driver *driver);
2.3 实例分析:phytium (ARM)平台CPU的cpufreq_driver
2.3.1 phytium平台CPU相关功能简介
以phytium平台的FT-2000/4 CPU为例。
FT-2000/4 支持处理器的多种功耗管理技术,并通过 ARM 定义的 SCPI(System Control and Power Interface)[2]接口和 PSCI(Power State Corodination Interface)[3] 供系统功耗管理软件调用。
实现 core 运行频率的动态调节。通过 SCPI 接口,可以查询 CPU 支持的频率点集合,以及实现频率的动态切换。
《FT-2000/4软件编程手册》(V1.4); 7.1 CPU 功耗管理
2.3.2 ARM的SCP,SCPI简介
A System Control Processor (SCP) is a processor-based capability that provides a flexible and
extensible platform for provision of power management functions and services.
《ARM Compute Subsystem SCP Message Interface Protocols》
1.1 The System Control Processor
System Control and Power Interface (SCPI)
The SCPI is one of the primary interfaces to the SCP in an ARM CSS-based platform. It is used
to access many of the services that are exposed to the AP. The SCP is expected to be idle and
waiting for SCPI commands for most of the time after the system boot process completes.
《ARM Compute Subsystem SCP Message Interface Protocols》
Chapter 3 CSS System Control and Power Interface (SCPI)
2.3.3 数据结构
//drivers/cpufreq/scpi-cpufreq.c
static struct cpufreq_driver scpi_cpufreq_driver = { .name = "scpi-cpufreq",.flags = CPUFREQ_STICKY | CPUFREQ_HAVE_GOVERNOR_PER_POLICY |CPUFREQ_NEED_INITIAL_FREQ_CHECK |CPUFREQ_IS_COOLING_DEV,.verify = cpufreq_generic_frequency_table_verify,.attr = cpufreq_generic_attr,.get = scpi_cpufreq_get_rate,.init = scpi_cpufreq_init,.exit = scpi_cpufreq_exit,.target_index = scpi_cpufreq_set_target,
};
2.3.4 scpi_cpufreq_init()代码大致流程
scpi_cpufreq_init();-> scpi_ops->add_opps_to_device(cpu_dev);-> scpi_dvfs_add_opps_to_device();-> scpi_dvfs_info();-> scpi_dvfs_get_info();-> scpi_send_message(CMD_GET_DVFS_INFO, ...);-> info->count = buf.opp_count;-> opp->freq = le32_to_cpu(buf.opps[i].freq);-> dev_pm_opp_add();-> dev_pm_opp_init_cpufreq_table(); //create a cpufreq table for a device
scpi_cpufreq_init()函数会使用SCPI接口获取CPU的频率和电压等信息,然后根据这些信息实现一个struct cpufreq_frequency_table。
具体信息请看SCPI命令中的Get DVFS Info命令(《ARM Compute Subsystem SCP Message Interface Protocols》3.2.9 Get DVFS Info)
2.3.5 设置频率的流程
scpi_cpufreq_set_target();-> clk_set_rate(priv->clk, rate);-> clk_core_set_rate_nolock();-> clk_change_rate();-> core->ops->set_rate();-> scpi_clk_set_rate();-> clk->scpi_ops->clk_set_val();-> scpi_clk_set_val();-> scpi_send_message(CMD_SET_CLOCK_VALUE, ...);
《ARM Compute Subsystem SCP Message Interface Protocols》3.2.15 Set Clock Value
2.4 查看系统当前使用的cpufreq_driver
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
或者
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver
3 CPUFreq的governor
3.1 简介
CPUFreq策略(Governor)的主要原则是根据当前系统负载来选择最合适的主频/电压。
《用“芯”探核:基于龙芯的Linux内核探索解析》8.2 运行时电源管理
3.2 数据结构
3.2.1 struct cpufreq_governor
//include/linux/cpufreq.h
struct cpufreq_governor {char name[CPUFREQ_NAME_LEN];int (*init)(struct cpufreq_policy *policy);void (*exit)(struct cpufreq_policy *policy);int (*start)(struct cpufreq_policy *policy);void (*stop)(struct cpufreq_policy *policy);void (*limits)(struct cpufreq_policy *policy);ssize_t (*show_setspeed) (struct cpufreq_policy *policy,char *buf);int (*store_setspeed) (struct cpufreq_policy *policy,unsigned int freq);/* For governors which change frequency dynamically by themselves */bool dynamic_switching;struct list_head governor_list;struct module *owner;
};
register和unregister函数:
int cpufreq_register_governor(struct cpufreq_governor *governor)
void cpufreq_unregister_governor(struct cpufreq_governor *governor)
3.2.2 struct dbs_governor;
//drivers/cpufreq/cpufreq_governor.h
/* Common Governor data across policies */
struct dbs_governor {struct cpufreq_governor gov;struct kobj_type kobj_type;/* * Common data for platforms that don't set* CPUFREQ_HAVE_GOVERNOR_PER_POLICY*/struct dbs_data *gdbs_data;unsigned int (*gov_dbs_update)(struct cpufreq_policy *policy);struct policy_dbs_info *(*alloc)(void);void (*free)(struct policy_dbs_info *policy_dbs);int (*init)(struct dbs_data *dbs_data);void (*exit)(struct dbs_data *dbs_data);void (*start)(struct cpufreq_policy *policy);
};
3.2.3 链表:cpufreq_governor_list
用来存放所有注册的governor节点
//drivers/cpufreq/cpufreq.c
static LIST_HEAD(cpufreq_governor_list);cpufreq_register_governor();-> list_add(&governor->governor_list, &cpufreq_governor_list);
3.3 现有的策略
3.3.1 performance
this governor causes the highest frequency, within the ``scaling_max_freq`` policy limit, to be requested for that policy.
//drivers/cpufreq/cpufreq_performance.c
static struct cpufreq_governor cpufreq_gov_performance = {.name = "performance",.owner = THIS_MODULE,.limits = cpufreq_gov_performance_limits,
};
cpufreq_gov_performance_init();-> cpufreq_register_governor(&cpufreq_gov_performance);
3.3.2 powersave
this governor causes the lowest frequency, within the ``scaling_min_freq`` policy limit, to be requested for that policy.
//drivers/cpufreq/cpufreq_powersave.c
static struct cpufreq_governor cpufreq_gov_powersave = {.name = "powersave",.limits = cpufreq_gov_powersave_limits,.owner = THIS_MODULE,
};
cpufreq_gov_powersave_init();-> cpufreq_register_governor(&cpufreq_gov_powersave);
3.3.3 userspace
This governor does not do anything by itself. Instead, it allows user space to set the CPU frequency for the policy it is attached to by writing to the ``scaling_setspeed`` attribute of that policy.
//drivers/cpufreq/cpufreq_userspace.c
static struct cpufreq_governor cpufreq_gov_userspace = {.name = "userspace",.init = cpufreq_userspace_policy_init,.exit = cpufreq_userspace_policy_exit,.start = cpufreq_userspace_policy_start,.stop = cpufreq_userspace_policy_stop,.limits = cpufreq_userspace_policy_limits,.store_setspeed = cpufreq_set,.show_setspeed = show_speed,.owner = THIS_MODULE,
};
cpufreq_gov_userspace_init();-> cpufreq_register_governor(&cpufreq_gov_userspace);
3.3.4 schedutil
This governor uses CPU utilization data available from the CPU scheduler. It generally is regarded as a part of the CPU scheduler, so it can access the scheduler's internal data structures directly.
//kernel/sched/cpufreq_schedutil.c
struct cpufreq_governor schedutil_gov = {.name = "schedutil",.owner = THIS_MODULE,.dynamic_switching = true,.init = sugov_init,.exit = sugov_exit,.start = sugov_start,.stop = sugov_stop,.limits = sugov_limits,
};
sugov_register();-> cpufreq_register_governor(&schedutil_gov);
当系统负载发生变化时,会根据负载来调整CPU频率,流程大致如下:
cpufreq_update_util();-> data->func();-> sugov_update_single();-> sugov_deferred_update();-> irq_work_queue(&sg_policy->irq_work);-> sugov_irq_work();-> sugov_work();-> __cpufreq_driver_target();-> cpufreq_driver->target();
3.3.5 ondemand
按需(Ondemand)策略:设置CPU负载的阈值T,当负载低于T时,调节⾄⼀个刚好能够 满⾜当前负载需求的最低频/最低压;当负载⾼于T时,⽴即提升到最⾼性能状态。
//drivers/cpufreq/cpufreq_ondemand.c
static struct dbs_governor od_dbs_gov = { .gov = CPUFREQ_DBS_GOVERNOR_INITIALIZER("ondemand"),.kobj_type = { .default_attrs = od_attributes },.gov_dbs_update = od_dbs_update,.alloc = od_alloc,.free = od_free,.init = od_init,.exit = od_exit,.start = od_start,
};
cpufreq_gov_dbs_init();-> cpufreq_register_governor(CPU_FREQ_GOV_ONDEMAND);
3.3.6 conservative
保守(Conservative)策略:跟Ondemand策略类似,设置CPU负载的阈值T,当 负载低于T时,调节⾄⼀个刚好能够满⾜当前负载需求的最低频/最低压;但当负载 ⾼于T时,不是⽴即设置为最⾼性能状态,⽽是逐级升⾼主频/电压。
//drivers/cpufreq/cpufreq_conservative.c
static struct dbs_governor cs_governor = {.gov = CPUFREQ_DBS_GOVERNOR_INITIALIZER("conservative"),.kobj_type = { .default_attrs = cs_attributes },.gov_dbs_update = cs_dbs_update,.alloc = cs_alloc,.free = cs_free,.init = cs_init,.exit = cs_exit,.start = cs_start,
};
cpufreq_gov_dbs_init();-> cpufreq_register_governor(CPU_FREQ_GOV_CONSERVATIVE);
参考资料
Documentation/admin-guide/pm/cpufreq.rst
《Linux设备驱动开发详解:基于最新的Linux4.0内核》 19.2.2 CPUFreq的策略
《SoC底层软件低功耗系统设计与实现》 13.1.5主要函数实现;4.ondemand governor
《⽤“芯”探核:基于⻰芯的Linux内核探索解析》 8.2 运⾏时电源管理
3.4 配置系统当前的governor
查看当前支持的governor
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
performance powersave
或者
# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors
performance powersave
设置当前的governor
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
或者
echo powersave > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
4 其他数据结构
4.1 struct cpufreq_frequency_table;
当前CPU支持的频率表。
//include/linux/cpufreq.h
struct cpufreq_frequency_table {unsigned int flags;unsigned int driver_data; /* driver specific data, not used by core */unsigned int frequency; /* kHz - doesn't need to be in ascending* order */
};
4.2 struct cpufreq_policy;
每个CPU核都有自己的控制策略(cpufreq_policy)
//include/linux/cpufreq.h
struct cpufreq_policy {/* CPUs sharing clock, require sw coordination */cpumask_var_t cpus; /* Online CPUs only */cpumask_var_t related_cpus; /* Online + Offline CPUs */......unsigned int min; /* in kHz */ unsigned int max; /* in kHz */unsigned int cur; /* in kHz, only needed if cpufreq */......struct cpufreq_governor *governor;......struct cpufreq_frequency_table *freq_table; //当前CPU支持的频率表......
};
结构体成员说明
<1> cpus和related_cpus
cpus及related_cpus表示当前policy管理的CPU,cpus代表当前处于online状态的CPU,related_cpus表示所有包含online/offline的CPU。
查看cpus和related_cpus的值
cat /sys/devices/system/cpu/cpufreq/policy0/affected_cpus
cat /sys/devices/system/cpu/cpufreq/policy0/related_cpus
<2> min/max/cur
min/max/cur表示当前policy支持的最大、最小及当前频率。
查看或者设置min/max的值
/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq
/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq
查看cur的值
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq
《SoC底层软件低功耗系统设计与实现》
13.1.4 主要数据结构;1.cpufreq_policy结构体
初始化函数:cpufreq_init_policy();
5 nofifier
5.1 简介
在频率变化的过程 中,会发送2次通知:
CPUFREQ_PRECHANGE:准备进⾏频率变更
CPUFREQ_POSTCHANGE:已经完成频率变更
数据结构:BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
发出通知的代码:
srcu_notifier_call_chain(&cpufreq_transition_notifier_list,CPUFREQ_PRECHANGE, freqs);srcu_notifier_call_chain(&cpufreq_transition_notifier_list,CPUFREQ_POSTCHANGE, freqs);
《Linux设备驱动开发详解:基于最新的Linux4.0内核》 19.2.4 CPUFreq通知
6 调试
6.1 cpufreq-stats
cpufreq-stats is a driver that provides CPU frequency statistics for each CPU.
/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l
total 0
drwxr-xr-x 2 root root 0 May 14 16:06 .
drwxr-xr-x 3 root root 0 May 14 15:58 ..
--w------- 1 root root 4096 May 14 16:06 reset
-r--r--r-- 1 root root 4096 May 14 16:06 time_in_state
-r--r--r-- 1 root root 4096 May 14 16:06 total_trans
-r--r--r-- 1 root root 4096 May 14 16:06 trans_table
Documentation/cpu-freq/cpufreq-stats.txt
注意:
当使⽤cpufreq_driver驱动是intel_pstate时,不会存在stats/⽬录
6.2 /sys/kernel/debug/tracing/events/power/
cpu_frequency_limits
cpu_frequency
6.3 cpufreq-bench
工具源码:<kernel_src>/tools/power/cpupower/bench/
cpufreq-bench工具的工作原理是模拟系统运行时候的“空闲→忙→空闲→忙”场景,从而触发系统的动态频率变化,然后在使用ondemand、conservative、interactive等策略的情况下,计算在做与performance高频模式下同样的运算完成任务的时间比例。
⼀般的⽬标是在采⽤CPUFreq动态调整频率和电压后,性能应该 为performance这个性能策略下的90%左右,这样才⽐较理想。
《Linux设备驱动开发详解:基于最新的Linux4.0内核》 19.2.3 CPUFreq的性能测试和调优
6.4 cpupower frequency-info|frequency-set
cpupower frequency-info
A small tool which prints out cpufreq information helpful to developers and interested users.
cpupower frequency-set
cpupower frequency-set allows you to modify cpufreq settings without having to type e.g. "/sys/devices/system/cpu/cpu0/cpufreq/scaling_set_speed" all the time.
6.5 cpufreq-info和cpufreq-set
cpufreq-info
A small tool which prints out cpufreq information helpful to developers and interested users.
cpufreq-set
cpufreq-set allows you to modify cpufreq settings without having to type e.g. "/sys/devices/system/cpu/cpu0/cpufreq/scaling_set_speed" all the time.
相关文章:
linux电源管理(二),内核的CPUFreq(DVFS)和ARM的SCPI
更多linux系统电源管理相关的内容请看:https://blog.csdn.net/u010936265/article/details/146436725?spm1011.2415.3001.5331 1 简介 CPUFreq子系统位于drivers/cpufreq目录下,负责进行运行过程中CPU频率和电压的动态调整,即DVFS (Dynami…...
短波红外高光谱相机:高光谱成像在塑料分选中的应用
随着塑料工业的迅猛发展,塑料包装制品需求量增长迅速,消耗量不断上升,废塑料产生量也急剧增加。由于塑料化学结构稳定,难以自然降解,不当使用和处置及累积会造成严重的环境污染和资源浪费。因此,快速、精准…...
通过OBD部署OceanBase社区版集群v4.3.5
以下内容结合OceanBase官方文档进行安装部署测试 官方文档地址:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002016072 一.环境准备 准备三台虚拟机,配置信息如下 192.168.232.8 centos7.9 4c16g 硬盘100g 192.168.232.9 …...
【Java学习笔记】注释
注释 为什么要写注释? 养成良好的编程习惯,方便后续阅读和查看,理顺思路,增加可读性 对自己的代码负责,对别人负责 说明 1. 被注释的文字,不会被 JVM(虚拟机)解释执行 2. 多行注…...
Python 调用 YOLO ONNX
Python 调用 YOLO ONNX 1 下载ONNX文件2 Python代码 1 下载ONNX文件 ONNX下载地址 2 Python代码 import cv2 from ultralytics import YOLO# 加载 YOLOv11 model YOLO(./yolo11n.pt)# 读取图片 image_path ./11.png img cv2.imread(image_path)# 推理(可以传…...
Linux 下 Module 工具的介绍与使用
参考: https://www.fasteda.cn/post/22.html https://modules.readthedocs.io/en/latest/module.html Linux 下 Module 工具的介绍与使用 一、前言 在 Linux 中,当同一款编辑器、运行库、软件存在多个版本且多个版本都需要在不同的场景或人员使用时&a…...
批量归一化(Batch Normalization)原理与PyTorch实现
批量归一化(Batch Normalization)是加速深度神经网络训练的常用技术。本文通过Fashion-MNIST数据集,演示如何从零实现批量归一化,并对比PyTorch内置API的简洁实现方式。 1. 从零实现批量归一化 1.1 批量归一化函数实现 import t…...
Flutter 文本组件深度剖析:从基础到高级应用
引言 在 Flutter 应用开发中,文本是向用户传达信息的重要媒介。Flutter 提供了丰富且强大的文本组件和相关属性,使开发者能够轻松实现多样化的文本展示效果。无论是简单的静态文本显示,还是复杂的富文本渲染,Flutter 都能满足需求…...
FABC是什么?
在销售和品牌营销领域,FABC 是一种用于构建销售话术和营销信息的框架,其全称为 Features(特点)、Advantages(优势)、Benefits(利益)、Case(案例)。该模型帮助…...
【MySQL】MVCC工作原理、事务隔离机制、undo log回滚日志、间隙锁
一、什么是MVCC? MVCC,即 Multiversion Concurrency Control(多版本并发控制),它是数据库实现并发控制的一种方式。 MVCC 的核心思想是: 为每个事务提供数据的“快照”版本,从而避免加锁&…...
Spring Boot 集成 RocketMQ 全流程指南:从依赖引入到消息收发
前言 在分布式系统中,消息中间件是解耦服务、实现异步通信的核心组件。RocketMQ 作为阿里巴巴开源的高性能分布式消息中间件,凭借其高吞吐、低延迟、高可靠等特性,成为企业级应用的首选。而 Spring Boot 通过其“约定优于配置”的设计理念&a…...
PCL 点云RANSAC提取平面(非内置函数)
文章目录 一、算法实现1.1实现步骤二、实现代码三、实现效果参考资料一、算法实现 1.1实现步骤 1、确定模型。三个点确定一个平面,方程式为 a x + b y + c z + 1 = 0 ax+by+cz+1=0...
中介者模式:理论、实践与 Spring 源码解析
摘要 本论文以中介者模式为核心,系统阐述其设计原理、应用场景及在 Spring 框架中的实现机制。通过机票预订系统、银行交易系统等典型案例,具象化展示模式如何解耦复杂对象交互;结合 Spring 5.3.29 源码,深入剖析事件驱动模型中ApplicationEventPublisher与ApplicationLis…...
2025.04.14【Table】| 生信数据表图技巧
Custom title A set of examples showing how to customize the titles of a table made with GT Custom footer How to customize the footer and the references section of a gt table 文章目录 Custom titleCustom footer 生信数据可视化:Table图表详解1. R语…...
Unified Modeling Language,统一建模语言
UML(Unified Modeling Language,统一建模语言)是一种标准化的图形化建模语言,用于可视化、规范和文档化软件系统的设计。UML 提供了一套通用的符号和规则,帮助开发者、架构师和团队成员更好地理解和沟通软件系统的结构…...
OCP证书有效期是永久,但需要更新
在数据库管理领域,OCP证书作为Oracle认证体系中的重要组成部分,一直是数据库专业人士追求的目标。许多考证者会有疑惑:OCP证书是永久有效的吗?需要更新吗? Oracle官方明确规定:OCP证书一经获得,终身有效。无…...
服务器本地搭建
socket函数 它用于创建一个新的套接字(socket)。 函数原型 #include <sys/socket.h> int socket(int domain, int type, int protocol);参数解释 domain:它指定了通信所使用的协议族,常见的取值如下: AF_INET…...
调节磁盘和CPU的矛盾——InnoDB的Buffer Pool
缓存的重要性 无论是用于存储用户数据的索引【聚簇索引、二级索引】还是各种系统数据,都是以页的形式存放在表空间中【对一个/几个实际文件的抽象,存储在磁盘上】如果需要访问某页的数据,就会把完整的页数据加载到内存中【即使只访问页中的一…...
[dp12_回文子串] 最长回文子串 | 分割回文串 IV
目录 1.回文子串 题解 2.最长回文子串 题解 3.分割回文串 IV 题解 dp[i][j] 表示 s 字符串 [i, j] 的子串,是否是回文串( 建始末表) 将两个 for 循环的结果,借助二维 dp 来存 1.回文子串 链接:647. 回文子串 给你一个字符…...
分布式应用架构的演变
整体演变过程 第一阶段:单一应用架构 单一应用架构,是把所有服务都放在一个项目中,进行打包部署到服务器上,如果流量特别大的话,就在另外的服务器上部署相同的功能模块用来分摊流量。但是这样的话,一旦有某…...
zephyr RTOS 中 bt_le_adv_start函数的功能应用
目录 概述 1 功能 1.1 功能介绍 1.2 函数原型 2 参数说明 2.1 广播参数(bt_le_adv_param) 2.2 常用广播选项(options) 2.3 广播数据(bt_data) 3 示例代码 3.1 启动可连接广播(带设备名…...
双按键控制LED(中断优先级)
1.启动时,两个LED灯熄灭,1秒钟后(定时器实现),LED自动点亮; 2.按键1按下后,通过中断int0把两个LED熄灭5s时间,int0优先级设置为最高(优先级必须设置,设置后才…...
美团即时零售大动作,将独立的闪购将会改变什么?
4月12日上午,美团核心本地商业CEO王莆中在社交媒体上发文,宣布美团将在下周正式发布即时零售品牌,标志着美团将进一步发展即时零售业务。 首先,从市场格局角度来看,美团将独立的闪购品牌推出,会进一步加剧…...
如何安装git?
以下是 Windows、macOS 和 Linux 系统安装 Git 的详细步骤: 一、Windows 系统安装 Git 下载安装包 访问 Git 官网下载页,点击下载 Windows 版安装程序(如 Git-2.45.1-64-bit.exe)。 运行安装程序 安装选项: 选择安装路…...
Ubuntu上docker、docker-compose的安装
今天来实践下Ubuntu上面安装docker跟docker-compose,为后面安装dify、fastgpt做准备。 一、安装docker sudo apt-get updatesudo apt-get install docker.io 然后系统输入 docker --version 出现下图即为docker安装成功。 二、安装docker-compose 我先看下系统…...
ubuntu如何设置静态ip
服务器有时是通过dhcp动态获取ip的,有时出于远程登录方便的考虑,会将其设置为静态ip,以下是设置静态ip的方法 在 Ubuntu 中设置静态 IP 的方法取决于你使用的网络管理工具(如 netplan、NetworkManager 或 ifconfig)。…...
js原型和原型链
js原型: 1、原型诞生的目的是什么呢? js原型的产生是为了解决在js对象实例之间共享属性和方法,并把他们很好聚集在一起(原型对象上)。每个函数都会创建一个prototype属性,这个属性指向的就是原型对象。 …...
大数据 - 2. Hadoop - HDFS
前言 HDFS:分布式文件系统 为什么海量数据需要分布式存储技术? 文件过大时,单台服务器无法承担,要靠数量来解决。数量的提升带来的是网络传输、磁盘读写、CPU、内存等各方面的提升。 众多的服务器一起工作,如何保证…...
嵌入式硬件常用总线接口知识体系总结和对比
0.前言 在嵌入式工程实现中,多多少少我们都使用过总线,各种各样的总线应用于不同场合,不同场景有不同的优势,但是我们在作为工程师过程中在如何选择项目合适的总线,根据什么来选?需要我们对项目全局和总线特征有所了解,本文目的就是对比多种总线的关键特征 我们在聊到…...
prime 1 靶场笔记(渗透测试)
环境说明: 靶机prime1和kali都使用的是NAT模式,网段在192.168.144.0/24。 Download (Mirror): https://download.vulnhub.com/prime/Prime_Series_Level-1.rar 一.信息收集 1.主机探测: 使用nmap进行全面扫描扫描,找到目标地址及…...
(二十四)安卓开发中的AppCompatActivity详解
在安卓开发中,AppCompatActivity 是一个非常核心的类,它继承自 Activity,并通过 Android Support Library(现已迁移至 AndroidX)提供了对 ActionBar 和 Material Design 的支持。它的主要作用是帮助开发者在不同版本的…...
AI大模型+全渠道整合:容联七陌智能客服赋能制造业升级
自《中国制造2025》战略提出以来,制造业的智能化发展进入快车道,但行业仍面临劳动力成本上升、供应链不透明、客户需求碎片化等挑战。企业亟需通过技术手段实现降本增效,而智能化客户服务成为关键突破口。 与此同时,客服行业正经历…...
Vue 技术解析:从核心概念到实战应用
Vue.js 是一款流行的渐进式前端框架,以其简洁的 API、灵活的组件化结构和高效的响应式数据绑定而受到开发者的广泛欢迎。本文将深入解析 Vue 技术的核心概念、原理和应用场景,帮助开发者更好地理解和使用 Vue.js。 一、Vue 的设计哲学与核心概念 &…...
中英文提示词对AI IDE编程能力影响有多大?
深度剖析 🧠:中英文提示词对AI IDE编程能力影响有多大?(附实战建议) 作者:AI助手 | 日期:2023-10-27 | 标签:AI, IDE, Prompt Engineering, LLM, 编程效率 摘要:随着 AI…...
ARM处理器程序烧写方式
一、烧写原理 无论是jtag还是串口烧写,本质都是先通过上位机(keil 或者flymcu或者芯片官方上位机等烧写bin的上位机)往mcu的ram里烧写一段代码即.FLM文件,这段代码在上位机(keil体现在配置项里,flymcu应该…...
AI 项目详细开发步骤指南
AI 项目详细开发步骤指南 一、环境搭建详解 1. JDK 17 安装与配置 Windows 系统安装步骤: 访问 Oracle 官网下载 JDK 17 安装包:https://www.oracle.com/java/technologies/downloads/#java17下载 Windows x64 Installer 版本双击安装包,…...
文本纠错WPS插件:提升文档质量的利器
文本纠错WPS插件:提升文档质量的利器 引言 在数字化办公日益普及的今天,文档的质量直接影响到我们的工作效率和形象。一个错别字或标点错误,可能就会让我们的专业形象大打折扣。今天,我要向大家介绍一款强大的WPS插件——文本纠…...
Node.js 模块包的管理和使用是
一、模块包的概念 1.模块分类: 核心模块:Node.js 内置模块(如 fs, http, path),无需安装直接引用。 本地模块:开发者自己编写的模块文件,通过相对路径引入。 第三方模块:通过 npm…...
腾讯云golang一面
go垃圾回收机制 参考自:https://zhuanlan.zhihu.com/p/334999060 go 1.3 标记清除法 缺点 go 1.5 三色标记法 屏障机制 插入屏障 但是如果栈不添加,当全部三色标记扫描之后,栈上有可能依然存在白色对象被引用的情况(如上图的对象9). 所以要对栈重新进行三色标记扫…...
【Three.js基础学习】35.Particles Cursor Animation Shader
前言 关于着色器应用和画布,实现黑白色照片动态效果 一、代码 script.js import * as THREE from three import { OrbitControls } from three/addons/controls/OrbitControls.js import particlesVertexShader from ./shaders/particles/vertex.glsl import p…...
安卓性能调优之-掉帧测试
掉帧指的是某一帧没有在规定时间内完成渲染,导致 UI 画面不流畅,产生视觉上的卡顿、跳帧现象。 Android目标帧率: 一般情况下,Android设备的屏幕刷新率是60Hz,即每秒需要渲染60帧(Frame Per Second, FPS&a…...
六、分布式嵌入
六、分布式嵌入 文章目录 六、分布式嵌入前言一、先要配置torch.distributed环境二、Distributed Embeddings2.1 EmbeddingBagCollectionSharder2.2 ShardedEmbeddingBagCollection 三、Planner总结 前言 我们已经使用了TorchRec的主模块:EmbeddedBagCollection。我…...
13-scala模式匹配
模式匹配是检查某个值(value)是否匹配某一个模式的机制,一个成功的匹配同时会将匹配值解构为其组成部分。它是Java中的switch语句的升级版,同样可以用于替代一系列的 if/else 语句。 语法 一个模式匹配语句包括一个待匹配的值&a…...
Multisim使用说明详尽版--(2025最新版)
一、Multisim14前言 1.1、主流电路仿真软件 1. Multisim:NI开发的SPICE标准仿真工具,支持模拟/数字电路混合仿真,内置丰富的元件库和虚拟仪器(示波器、频谱仪等),适合教学和竞赛设计。官网:艾…...
试一下阿里云新出的mcp服务
前言 MCP这段时间的发展可谓是如火如荼,各种教程也是层出不穷,基本的教程都是如何集成各类型的mcp(比如高德地图)到开发工具(比如cursor),效果很好,但是有个问题就是,配置教程较为繁琐。 阿里云悄然上线的mcp 今天早上…...
正弦波有效值和平均值(学习笔记)
一个周期的正弦波在坐标轴上围的面积有多大? 一般正弦波以 y Asin(wx)表示,其中A为振幅,W为角速度。周期T 2π/w; 确定积分区间是x 0,到x 2π。 计算绝对值积分: 变量代还:wx θ,dx dθ…...
科研软件分享
这个帖子不定期更新,分享博主自己使用的很好用的科研软件 1 connectedpaper Connected Papers | Find and explore academic papers 2 Semantic Scholar...
Python(12)深入解析Python参数传递:从底层机制到高级应用实践
目录 一、参数传递的编程哲学1.1 参数传递的本质1.2 参数传递类型矩阵 二、参数传递核心规则2.1 位置参数与关键字参数2.2 可变参数处理 三、参数传递高级特性3.1 类型约束与提示3.2 参数内存优化 四、参数传递工程实践4.1 防御性参数校验4.2 参数依赖注入 五、参数传递性能优化…...
MVCC是什么?MVCC的作用是什么?MVCC实现方式有哪些?
MVCC(多版本并发控制)详解 一、MVCC是什么? MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库管理系统中的一种并发控制机制,它通过维护数据的多个版本来实现非阻塞读和高并发…...
007.Gitlab CICD缓存与附件
文章目录 缓存与产物缓存与产物概述 同分支不同job数据共享默认数据共享不同 Job 数据共享 不同分支相同job数据共享跨分支同job数据共享 不同分支不同job数据共享跨分支跨job数据共享 将文件/夹保存为附件产物介绍创建产物跨job共享产物 缓存与产物 缓存与产物概述 缓存是一…...