当前位置: 首页 > article >正文

Linux网络驱动开发:PHY状态机与链路检测机制详解(附实战代码分析)

Linux网络驱动开发PHY状态机与链路检测机制详解附实战代码分析在嵌入式Linux网络驱动开发中PHY芯片的管理是连接物理层与数据链路层的核心桥梁。对于许多中高级工程师而言理解内核如何感知并响应网线插拔、协商速率变化等物理事件是调试网络异常、优化驱动性能乃至定制化网络功能的关键。这背后一个精巧的状态机State Machine和一套可靠的链路检测Link Detection机制在默默工作。它们将硬件寄存器中冰冷的比特位变化转化为上层网络子系统能够理解的“链路通断”事件驱动着整个网络栈的运转。本文将深入Linux内核网络子系统的腹地拆解phy_state_machine与phy_check_link_status这两个核心机制。我们不会停留在概念描述而是结合r8169、stmmac等真实网卡驱动的代码片段剖析状态流转的每一个环节并探讨驱动开发者如何通过回调函数Callback将PHY状态无缝同步到MAC层和网络设备。无论你是在调试一块定制板卡上诡异的“网络时断时续”问题还是需要为特殊应用定制链路状态通知逻辑理解这套底层机制都将为你提供清晰的路径和强大的工具。1. PHY设备初始化与状态机引擎的启动PHY驱动在内核中的生命起点始于MDIOManagement Data Input/Output总线的扫描。当网络驱动调用devm_mdiobus_register注册一个MDIO总线后内核便会遍历总线上的每个地址尝试识别并创建PHY设备。这个过程的核心函数是phy_device_create它不仅是PHY设备的“出生证明”签发者更是其一生行为模式——状态机——的设定者。1.1 PHY设备的诞生phy_device_create这个函数负责分配并初始化一个struct phy_device结构体。这个结构体是内核中PHY设备的抽象包含了PHY的所有运行时状态、配置和能力信息。struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id, bool is_c45, struct phy_c45_device_ids *c45_ids) { struct phy_device *dev; // ... 内存分配和基础字段初始化 ... dev-speed SPEED_UNKNOWN; dev-duplex DUPLEX_UNKNOWN; dev-link 0; // 初始链路状态为断开 dev-state PHY_DOWN; // 初始状态为PHY_DOWN mutex_init(dev-lock); INIT_DELAYED_WORK(dev-state_queue, phy_state_machine); // 关键 // ... 后续的驱动模块请求和设备注册 ... return dev; }代码中最为关键的一行是INIT_DELAYED_WORK(dev-state_queue, phy_state_machine)。这行代码为每个PHY设备创建了一个延迟工作队列delayed workqueue并将其处理函数指向phy_state_machine。这意味着每个PHY设备都拥有一个独立、可调度的“心脏”它将按照预设的节奏PHY_STATE_TIME通常为1秒跳动驱动PHY状态根据硬件实际情况进行变迁。提示INIT_DELAYED_WORK是内核工作队列机制的一部分。它允许将一个函数这里是状态机推迟执行并且可以周期性地调度。这对于轮询PHY状态这种不需要实时响应的任务非常合适避免了忙等待消耗CPU。1.2 状态枚举PHY的生命周期阶段在深入状态机之前需要理解PHY可能处于的几种核心状态。这些状态定义在include/linux/phy.h中构成了状态机流转的节点状态枚举含义描述PHY_DOWN初始状态或PHY被显式关闭如ifconfig eth0 down。此时PHY硬件通常处于低功耗模式。PHY_READYPHY已准备好但尚未启动。是PHY_UP和PHY_HALTED之间的过渡状态。PHY_UPPHY已启动链路管理层开始工作。这是自动协商Auto-Negotiation的触发点。PHY_NOLINKPHY已启动但未检测到有效的物理链路网线未连接或对端设备无响应。PHY_RUNNING理想工作状态。PHY已启动并且检测到有效的物理链路速率、双工模式等参数已协商确定。PHY_HALTEDPHY因错误或命令而停止。需要软件干预才能恢复。这些状态清晰地勾勒出了一块PHY芯片从初始化到正常工作再到异常处理的生命周期。2. 状态机核心phy_state_machine深度剖析phy_state_machine函数是PHY管理的“大脑”。它是一个由工作队列驱动的事件循环不断评估PHY的当前状态并执行该状态下应有的操作同时判断是否需要迁移到下一个状态。2.1 状态机的主循环逻辑让我们聚焦于状态机函数的主体框架为简洁起见省略部分错误处理和日志代码void phy_state_machine(struct work_struct *work) { struct phy_device *phydev /* 从work获取phy设备指针 */; bool needs_aneg false, do_suspend false; enum phy_state old_state phydev-state; mutex_lock(phydev-lock); // 保护状态变更的锁 switch (phydev-state) { case PHY_DOWN: case PHY_READY: // 在这两个状态状态机主要等待外部指令如phy_start不主动做链路检测。 break; case PHY_UP: needs_aneg true; // 标记需要启动自动协商 break; case PHY_NOLINK: case PHY_RUNNING: // 在NOLINK和RUNNING状态核心任务是检查链路状态 err phy_check_link_status(phydev); break; case PHY_HALTED: if (phydev-link) { phydev-link 0; phy_link_down(phydev, true); // 强制通告链路断开 } do_suspend true; // 标记需要挂起PHY break; } mutex_unlock(phydev-lock); // 根据switch中设置的标志执行异步操作 if (needs_aneg) err phy_start_aneg(phydev); // 启动自动协商流程 else if (do_suspend) phy_suspend(phydev); // 挂起PHY以节省功耗 // 处理错误和状态变更通知 if (err 0) phy_error(phydev); if (old_state ! phydev-state) { phydev_dbg(phydev, PHY state change %s - %s\n, phy_state_to_str(old_state), phy_state_to_str(phydev-state)); // 通知驱动层状态已变如果驱动注册了回调 if (phydev-drv phydev-drv-link_change_notify) phydev-drv-link_change_notify(phydev); } // 决定是否再次调度本状态机轮询模式 mutex_lock(phydev-lock); if (phy_polling_mode(phydev) phy_is_started(phydev)) phy_queue_state_machine(phydev, PHY_STATE_TIME); // 1秒后再次运行 mutex_unlock(phydev-lock); }这个状态机的设计体现了清晰的分层思想状态判断与标志设置在锁保护下根据当前状态决定要执行什么操作用布尔变量needs_aneg、do_suspend标记或者调用什么检查函数phy_check_link_status。异步操作执行在锁外执行可能耗时的操作如启动自动协商或挂起PHY避免长时间持有锁影响系统响应。后处理与调度处理错误记录状态变更日志并最终决定是否在1秒后再次唤醒自己形成轮询循环。2.2 关键状态流转场景理解几个典型的状态流转路径能帮你更好地调试问题从PHY_UP到PHY_NOLINK或PHY_RUNNING当PHY被启动例如网络接口up状态从PHY_READY进入PHY_UP。下一轮状态机执行时PHY_UP分支会设置needs_anegtrue随后调用phy_start_aneg。自动协商完成后硬件会或不会建立链路。状态机在后续轮询中进入PHY_NOLINK或PHY_RUNNING分支开始调用phy_check_link_status来获取真实的链路状态。PHY_RUNNING与PHY_NOLINK之间的震荡这是调试中最常见的情况。当网线接触不良、对端设备重启或存在电气干扰时PHY的链路状态可能频繁变化。状态机每次运行约1秒一次都会调用phy_check_link_status。如果该函数检测到链路从通变断会将状态从PHY_RUNNING改为PHY_NOLINK并触发phy_link_down回调。反之亦然。观察内核日志dmesg中频繁出现的“PHY state change”信息是定位此类物理层问题的第一线索。进入PHY_HALTED当PHY驱动遇到不可恢复的错误如多次读写寄存器失败或用户空间通过ethtool命令强制关闭PHY时状态会迁至PHY_HALTED。在此状态状态机会清理链路状态如果之前是通的并尝试将PHY置于低功耗模式。要恢复通常需要重启网络接口或重新加载驱动。3. 链路检测的基石phy_check_link_status实现解析如果说状态机是决策者那么phy_check_link_status就是前线侦察兵。它的职责非常单纯读取PHY硬件寄存器判断物理链路是否建立并更新phy_device中的link状态。3.1 函数执行流程static int phy_check_link_status(struct phy_device *phydev) { int err; // 断言调用此函数时必须已持有phydev-lock WARN_ON(!mutex_is_locked(phydev-lock)); // 特殊情况如果回环测试启用则保持原有链路状态因为某些PHY在回环模式下会错误报告链路断开。 if (phydev-loopback_enabled) return 0; // 核心步骤读取PHY状态寄存器 err phy_read_status(phydev); if (err) // 读取出错返回错误码状态机上层会处理 return err; // 根据读取到的phydev-link值更新PHY状态机的状态 if (phydev-link phydev-state ! PHY_RUNNING) { phydev-state PHY_RUNNING; phy_link_up(phydev); // 触发“链路通”回调 } else if (!phydev-link phydev-state ! PHY_NOLINK) { phydev-state PHY_NOLINK; phy_link_down(phydev, true); // 触发“链路断”回调 } return 0; }phy_read_status是一个由具体PHY驱动实现的虚函数它通过MDIO总线读取PHY芯片的特定状态寄存器通常是标准MII的BMCR/BMSR或厂商扩展寄存器并将解析出的速度、双工、暂停能力以及最重要的链路状态填充到phydev结构体中。注意phy_read_status的调用频率就是状态机的调度频率默认1秒。对于某些对链路反应速度要求极高的场景开发者可能会考虑缩短PHY_STATE_TIME但这会增加系统负载。更优的方案通常是利用PHY的中断功能如果支持在链路变化时立即通知CPU而不是依赖轮询。3.2 状态同步与回调触发phy_link_up和phy_link_down是两个内部函数它们是连接PHY状态变化与上层网络子系统主要是MAC驱动和网络设备层的桥梁。static void phy_link_up(struct phy_device *phydev) { phydev-phy_link_change(phydev, true, true); phy_led_trigger_change_speed(phydev); // 可选更新链路LED触发器的显示 } static void phy_link_down(struct phy_device *phydev, bool do_carrier) { phydev-phy_link_change(phydev, false, do_carrier); phy_led_trigger_change_speed(phydev); }它们都调用了phydev-phy_link_change这个函数指针。这个指针在PHY与MAC驱动“绑定”时被设置是驱动开发者需要关注的核心回调机制。4. 实战将PHY状态传递给MAC驱动的两种模式PHY状态检测出来了如何让MAC驱动和网络设备知道呢Linux内核提供了两种主流模式对应不同的网络驱动架构。4.1 传统直接回调模式以r8169驱动为例这是较早期、也更直接的方式。MAC驱动直接获取PHY设备并通过phy_connect_direct函数建立关联。关联建立过程MAC驱动如r8169通过mdiobus_get_phy找到对应的phy_device。调用phy_connect_direct传递一个自定义的回调函数指针如r8169_phylink_handler。在phy_attach_direct内部phydev-phy_link_change被设置为一个通用的phy_link_change函数。在phy_prepare_link中驱动传入的回调函数被赋值给phydev-adjust_link。链路事件传递链phy_check_link_status() 检测到链路变化 - phy_link_up() / phy_link_down() - phydev-phy_link_change() (即 phy_link_change()) - netif_carrier_on() / netif_carrier_off() // 更新网络设备载波状态 - phydev-adjust_link() (即驱动注册的 r8169_phylink_handler())让我们看看Realtekr8169驱动的处理函数static void r8169_phylink_handler(struct net_device *ndev) { struct rtl8169_private *tp netdev_priv(ndev); // 检查网络设备的载波状态这个状态已被phy_link_change更新 if (netif_carrier_ok(ndev)) { // 链路通执行MAC层恢复或配置操作 rtl_link_chg_patch(tp); // 可能是一些厂商特定的硬件配置 pm_request_resume(tp-pci_dev-dev); // 请求恢复PCI设备电源管理 } else { // 链路断让MAC层进入空闲状态 pm_runtime_idle(tp-pci_dev-dev); } // 限速打印PHY状态信息到内核日志 if (net_ratelimit()) phy_print_status(tp-phydev); }在这个模式中驱动注册的回调函数adjust_link直接负责响应链路变化并执行MAC层所需的任何操作如重新配置DMA、调整电源状态等。逻辑直接但MAC驱动需要处理较多PHY相关的细节。4.2 现代phylink抽象框架模式以stmmac驱动为例为了解耦MAC驱动与PHY管理的复杂细节并更好地支持各种复杂的网络接口模式如SGMII、USXGMII等内核引入了phylink抽象层。在这种模式下MAC驱动不再直接操作PHY而是与一个phylink实例交互。框架初始化流程MAC驱动如stmmac首先创建一个phylink实例通过phylink_create函数并传入一个包含MAC能力操作集的结构体phylink_mac_ops。static const struct phylink_mac_ops stmmac_phylink_mac_ops { .validate stmmac_validate, // 验证PHY/MAC支持的模式是否兼容 .mac_pcs_get_state stmmac_mac_pcs_get_state, // 获取MAC PCS侧状态 .mac_config stmmac_mac_config, // 配置MAC参数速度、双工等 .mac_link_down stmmac_mac_link_down, // MAC侧链路断开处理 .mac_link_up stmmac_mac_link_up, // MAC侧链路建立处理 };驱动通过phylink_connect_phy或phylink_of_phy_connect将phylink实例与具体的PHY设备连接起来。在这个过程中PHY的phy_link_change回调被设置为phylink_phy_change。phylink模式下的事件传递phy_check_link_status() 检测到链路变化 - phy_link_up() / phy_link_down() - phydev-phy_link_change() (即 phylink_phy_change()) - 更新 pl-phy_state 中的速度、双工、链路状态等信息 - phylink_run_resolve(pl) // 触发phylink的解析工作 - queue_work 调度 pl-resolve 工作 (即 phylink_resolve())phylink_resolve是这个模式的核心。它作为一个工作队列任务运行其职责是综合PHY侧的状态pl-phy_state和MAC侧可能的状态对于自协商模式计算出最终的链路状态然后调用MAC驱动注册的mac_link_down或mac_link_up操作。static void phylink_resolve(struct work_struct *w) { struct phylink *pl container_of(w, struct phylink, resolve); struct phylink_link_state link_state; // ... 加锁和状态判断 ... // 根据不同的协商模式计算最终的link_state switch (pl-cur_link_an_mode) { case MLO_AN_PHY: // PHY负责自协商 link_state pl-phy_state; // 直接使用PHY状态 phylink_mac_config_up(pl, link_state); break; case MLO_AN_INBAND: // 基于SerDes的带内协商 phylink_mac_pcs_get_state(pl, link_state); // 先获取MAC PCS状态 // 再与PHY状态进行“与”操作两者都通才算通 if (pl-phydev) link_state.link pl-phy_state.link; // ... 更新配置 ... break; // ... 其他模式 ... } // 判断链路状态是否发生变化 if (link_changed) { if (!link_state.link) phylink_mac_link_down(pl); // 调用驱动实现的mac_link_down else phylink_mac_link_up(pl, link_state); // 调用驱动实现的mac_link_up } // ... 解锁 ... }对比与选择特性传统直接回调模式phylink抽象框架模式复杂度相对简单直接驱动需要自己处理部分PHY逻辑。更复杂但将PHY管理、状态解析等通用逻辑抽象化。适用场景相对简单的、独立的网络控制器驱动。支持复杂网络模式如SFP、25G/40G/100G、需要MAC与PHY/PCS协同工作的现代驱动。代码复用低每个驱动重复实现状态同步逻辑。高通用逻辑在phylink核心中实现驱动只需实现MAC相关的几个回调。推荐度对于新驱动除非有特殊原因否则建议使用phylink。当前内核的推荐做法特别是对于支持多种接口模式的IP核如STMMAC、DWMAC。在实际项目中如果你在维护一个老旧的驱动可能会遇到传统模式。而开发新的驱动或者为复杂SoC集成网络功能时深入理解并应用phylink框架将是更高效、更未来的选择。理解这两种模式能让你在面对不同代码库时快速定位链路状态传递的路径无论是调试link不起来的硬件还是为特定应用定制链路事件响应逻辑都能做到心中有数。

相关文章:

Linux网络驱动开发:PHY状态机与链路检测机制详解(附实战代码分析)

Linux网络驱动开发:PHY状态机与链路检测机制详解(附实战代码分析) 在嵌入式Linux网络驱动开发中,PHY芯片的管理是连接物理层与数据链路层的核心桥梁。对于许多中高级工程师而言,理解内核如何感知并响应网线插拔、协商速…...

ollama部署本地大模型|embeddinggemma-300m在金融研报相似度分析应用

ollama部署本地大模型|embeddinggemma-300m在金融研报相似度分析应用 金融分析师每天需要阅读大量研报,如何快速找到相似内容、发现关联信息?本文将手把手教你用ollama部署embeddinggemma-300m模型,构建金融研报智能分析系统。 1.…...

ESP32-P4 VDMA多块传输与低功耗中断驱动详解

ESP32-P4 VDMA 控制器深度解析:多块传输机制、低功耗设计与中断驱动配置实践1. VDMA 多块传输终止判定机制详解VDMA(Video Direct Memory Access)控制器在 ESP32-P4 中承担着高吞吐、低延迟的数据搬运任务,其核心能力之一在于对多…...

线程池核心参数?如何设置?

这句先记住。线程池核心参数决定了:线程池最多开多少线程?任务怎么排队?线程空闲多久回收?线程怎么创建?满了之后怎么办?一、线程池 7 个核心参数Java 里最常见的是 ThreadPoolExecutor:ThreadP…...

YOLOv6 安装及使用详细教程

前言 YOLOv6 是美团研发的轻量级目标检测算法,兼顾检测精度与推理速度,适配工业落地与学术入门场景。该算法针对工程化部署深度优化,环境配置简单、运行流程清晰,是零基础用户入门目标检测的优选方案。本文将手把手带你完成 YOLO…...

Windows安装OpenClaw龙虾(新手入门必备)

目录 一、准备工作(必做) 二、方案A:原生PowerShell一键安装(新手首选) 1. 打开管理员PowerShell 2. 解锁脚本执行权限(必做) 3. 一键安装OpenClaw 4. 验证安装 5. 初始化配置&#xff0…...

基于终端 ANSI 转义序列的“等离子体流体动画”

目录 创意项目:终端等离子体场 (Terminal Plasma) 代码设计的“极限”考量 挑战扩展方向 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 挑战开发极限,不仅是代码量的缩减,更是对算法、位…...

JVM面试题100道(含答案解析)

在Java后端开发面试中,JVM(Java Virtual Machine) 几乎是必问的核心知识点。 很多互联网公司(如大厂或中大型技术团队)在技术面试中都会重点考察 JVM内存模型、垃圾回收机制、类加载机制以及JVM调优能力。 本文整理了一…...

【杂谈】结构体的内存对齐与位段

目录 一、结构体内存对齐问题(节省时间) 1.什么是内存对齐 2.需要使用内存对齐的原因 3.内存对齐的规则 4.举例 5.小结 二、结构体实现位段操作(节省空间) 1.位域简介与使用原因 2.位域的定义与使用时的注意事项 3.举例 …...

前端开发 - this 指向问题(直接调用函数、对象方法、类方法)

一、直接调用函数 1、基本介绍非严格模式:this 为 window严格模式,this 为 undefined2、演示 function fn() {console.log(this); } fn();# 非严格模式下运行,输出结果Window {window: Window, self: Window, document: document, name: , lo…...

2026精选课题-基于springboot大学生社团管理系统的设计与实现

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/学生代理交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

智能电网无线通信中仅存在式被动侦察的基准数据集

大家读完觉得有帮助记得关注和点赞!!!摘要在智能电网通信中对仅存在式被动侦察进行基准测试具有挑战性,因为攻击者只接收信号,但附近的观察者仍然可以通过额外的阴影和多径效应改变传播,从而重塑信道相干性…...

Web安全实战:绕过__wakeup漏洞攻防解析

1. 从一道CTF题说起:为什么我的反序列化总被“叫醒”? 大家好,我是老张,一个在Web安全领域摸爬滚打了十来年的老兵。今天想和大家聊聊一个在PHP安全里既经典又有点“狡猾”的漏洞——__wakeup魔术方法的绕过。这事儿说起来&#x…...

Vue3+WebRtcServer实现海康监控rtsp流视频的跨域播放解决方案

1. 为什么你的海康监控视频在Vue3里播不出来? 最近好几个做安防项目的朋友都跟我吐槽同一个问题:他们在Vue3项目里想直接播放海康威视摄像头的RTSP视频流,结果要么黑屏,要么疯狂报跨域错误。浏览器控制台里一片红,全是…...

深入解析tile_images与tile_images_offset:图像拼接的灵活应用

1. 从“拼图游戏”到工业视觉:为什么你需要了解图像拼接 如果你玩过拼图游戏,或者用手机App把几张照片拼成一张长图,那你对“图像拼接”这个概念一定不陌生。在工业视觉和图像处理领域,这种需求同样普遍,甚至更为关键。…...

Ubuntu22.04下BBR与CUBIC拥塞控制算法的性能对比测试

1. 为什么我们要关心拥塞控制算法? 如果你用过家里的宽带,或者在公司里传过大文件,肯定遇到过这种情况:明明网速标称很高,但下载东西就是时快时慢,看视频也总在缓冲。很多时候,这口“锅”可能不…...

手把手教你玩转Nunchaku FLUX.1:从安装到出图,新手完整指南

手把手教你玩转Nunchaku FLUX.1:从安装到出图,新手完整指南 想试试用AI生成图片,但看到复杂的界面和参数就头疼?别担心,今天我来带你从零开始,一步步玩转Nunchaku FLUX.1 CustomV3这个强大的文生图工具。你…...

R提供了一些函数用于判断逻辑表达式的结果

下面内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文5241字)。 3章4节:R的逻辑运算和矩阵运算_逻辑判断矩阵在r语言中的应用-CSDN博客 逻辑运算和矩阵运算是R语言中两个重要的功能模块,前者用于逻辑判断和条件筛选&am…...

Linux下hadoop2.9.2单节点伪分布搭建完全教程

配置静态 IP 在实际应用中,由于我们使用的是 DHCP(Dynamic Host Configuration Protocol: 动态主机配置协议)服务器来分配的地址,那么每次重启DHCP 服务器 ip 地址有 可能是会变动的。 而我们用Linux 来搭建集群学习Ha…...

OpenClaw 技能插件开发实战:适配职业教育的 AI 实训案例

一、前言随着人工智能技术在职业教育领域的深度渗透,传统AI实训模式逐渐暴露出诸多痛点:实训内容脱离企业真实应用场景、学生上手门槛高、实训平台功能固化难以拓展、缺乏可落地的实战化开发任务,难以满足职教领域“岗课赛证”融合的人才培养…...

【Docker】Linux系统上卸载旧Docker、卸载Podman并重新安装Docker及配置国内镜像源

一、卸载 Podman 可以使用如下命令卸载 Podman dnf remove -y podman buildah 二、卸载旧版本 Docker 若系统中已存在旧版 Docker,请按以下步骤彻底卸载: 1.停止Docker服务 sudo systemctl stop docker 2. 卸载 Docker 相关软件包 sudo yum remov…...

halcon5_1

图像采集助手-Image Aequisition 1.配置相机IP 和巨型帧等 2.通过海康MVS软件 找到 对应halcon 版本 下载MVS https://www.hikrobotics.com/cn/machinevision/service/download/?module0 3. 找到对应halcon版本的 海康相机三方配置文件 4.找到Halocn文件目录 粘贴上图文…...

Vue3+Vue-Router项目在Edge浏览器无法最小化问题

补充: 不同环境的情况不一样,可参考:https://github.com/vuejs/router/issues/2644 ---------------------------------------------------------------------------- 已有大佬排查并解决了该问题: https://blog.csdn.net/u01…...

C/C++数据结构与算法(第二弹)

目录 栈和队列 1.栈 1.1栈的概念以及结构 1.2栈的实现 2.队列 2.1队列的概念以及结构 2.2队列的实现 3.栈和队列OJ题 1. 括号匹配问题。OJ链接 2. 用队列实现栈。OJ链接 3. 用栈实现队列。OJ链接 4. 设计循环队列。OJ链接 二叉树 1.树概念以及结构 1.1树的概念 …...

(75页PPT)TPM自主保养概论(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/92608801 资料解读:《(75页PPT)TPM自主保养概论》 详细资料请看本解读文章的最后内容。 本文旨在系统性…...

数据治理(一)

数据治理的介绍及作用 数据治理:是运用专业方法和技术手段理清企业的数据资产并开展治理工作,是围绕将数据作为企业资产而开展的一系列的具体化工作。 作用:保证数据的可信可靠可用,满足业务对数据质量和数据安全的系列举措。 框…...

[Redis小技巧10]深入 Redis Stream:从原理到生产级实践

一、Stream 是什么?为什么需要它? Redis Stream 是 Redis 5.0 引入的一种持久化、可追加、支持消费者组的消息队列数据结构。它解决了传统 LIST(缺乏消息确认)和 PUB/SUB(非持久化、无重试机制)在构建可靠消…...

基于A* 算法的无人机三维路径规划:MATLAB实现之旅

基于A* 算法的无人机三维路径规划算法,MATLAB编程实现。在无人机应用日益广泛的今天,高效的路径规划算法至关重要。A 算法凭借其在寻找最优路径方面的出色表现,成为众多路径规划场景中的热门选择。本文就来聊聊基于A 算法的无人机三维路径规划…...

PID 和 LQR 主动悬架模型对比:探索汽车平顺性的优化之路

【PID和LQR主动悬架模型对比】分别建立了PID控制和LQR控制的的主动悬架模型,比较两种控制器的控制效果。 以悬架主动力为控制目标,输入为B级随机路面,输出为车身垂向加速度、俯仰角加速度、悬架动挠度等平顺性评价指标,可做汽车平…...

探索一维光子晶体态密度案例:从理论到代码实现

一维光子晶体态密度案例在光子学领域,一维光子晶体态密度是一个极为有趣且重要的研究方向。它不仅有助于我们深入理解光子在周期性结构中的行为,还为诸如滤波器、波导等光学器件的设计提供了理论基础。 一维光子晶体理论基础 一维光子晶体,简…...