嵌入式Linux显示驱动开发:DRM框架核心原理与实战指南
1. 从一个让人抓狂的显示问题说起如果你在嵌入式Linux或者Android底层摸爬滚打过一段时间大概率遇到过这样的场景屏幕点不亮、花屏、分辨率不对、旋转方向反了、多屏异显怎么配都不对。你翻遍设备树、改遍了U-Boot的启动参数甚至怀疑是硬件焊接问题最后发现根子出在一个叫DRM的东西上。DRM全称Direct Rendering Manager直译过来就是“直接渲染管理器”。这个名字听起来像是跟游戏渲染相关的东西但实际上它是Linux内核中负责管理显示控制器和GPU的核心子系统。你可以把它理解成显示世界的“总调度中心”——所有跟屏幕输出相关的资源分配、模式设置、画面合成最终都要经过它。为什么显示驱动绕不开DRM因为在现代Linux内核里DRM已经不是一个可选项而是显示驱动必须接入的框架。你写一个显示控制器驱动如果不按照DRM的框架来注册CRTC、Encoder、Connector、Plane这些组件内核根本不认你的驱动屏幕就是黑的。这跟以前老式的Framebuffer框架完全不同——FBDEV时代你只要分配一块显存、填好参数就能出图简单粗暴但功能有限。DRM则是一套完整的、面向现代显示硬件的抽象体系支持多图层合成、原子提交、动态分辨率切换、多屏管理等等。这篇文章适合谁看如果你是驱动开发工程师、BSP工程师、Android系统开发人员或者是对Linux显示子系统好奇的嵌入式爱好者那接下来的内容应该能帮你把DRM这套东西理清楚。我会从实际开发中遇到的问题出发把DRM的核心概念、组件模型、工作流程、以及显示驱动为什么必须接入它讲透同时给出可以直接参考的实操方法和踩坑经验。2. DRM到底解决了什么问题2.1 从Framebuffer到DRM的演进逻辑要理解DRM为什么重要得先知道它替代了什么。早期的Linux显示方案是Framebuffer也就是/dev/fb0那套东西。它的模型极其简单内核给你一块内存你往里写像素数据显示控制器自动扫描这块内存输出到屏幕。对于单屏、固定分辨率、不需要硬件加速的场景这套方案够用而且轻量。但问题很快就来了。现代SoC的显示控制器越来越复杂通常包含多个图层Layer/Plane、多个显示管道Pipe、支持色彩空间转换、缩放、旋转、Alpha混合等硬件能力。Framebuffer的抽象太薄了根本描述不了这些硬件特性。更麻烦的是当多个进程或者多个应用同时想往屏幕上画东西时Framebuffer没有资源管理和同步机制很容易出现撕裂、竞争和冲突。DRM的出现就是为了解决这些问题。它引入了一套完整的对象模型来描述显示硬件同时提供了统一的内存管理和命令提交接口。GPU厂商比如Intel、AMD、ARM的Mali、Qualcomm的Adreno也通过DRM提供渲染接口这就是为什么你会看到drm/i915、drm/msm、drm/rockchip这些驱动目录。2.2 DRM的核心组件模型DRM把显示硬件抽象成几个关键对象理解这几个对象是理解整个框架的基础CRTCCathode Ray Tube Controller这个名字来自老式显示器时代现在代表一个显示管道。一个CRTC对应一路独立的扫描输出它负责从显存里读取像素数据按照时序要求输出到Encoder。你可以把它理解成“一个屏幕对应一个CRTC”但实际上一个CRTC也可以驱动多个Connector克隆模式。Encoder负责把CRTC输出的像素信号转换成特定接口格式比如HDMI、MIPI DSI、DisplayPort、LVDS等。Encoder是CRTC和Connector之间的桥梁。Connector代表物理输出接口比如HDMI接口、DSI排线接口。它负责检测显示器的连接状态热插拔、读取EDID信息、协商显示模式。Plane图层代表一个可以独立显示的图像层。现代显示控制器通常支持多个Plane叠加比如一个背景层、一个视频层、一个UI层。Plane负责从Framebuffer里取数据经过缩放、旋转、色彩转换后送给CRTC合成。Framebuffer一块内存缓冲区存放实际的像素数据。在DRM里Framebuffer通过GEMGraphics Execution Manager或者DMA-BUF来管理内存。这几个对象之间的关系可以这样理解Framebuffer提供像素数据Plane负责取数据和做硬件处理CRTC负责合成和时序输出Encoder负责信号转换Connector负责物理连接和显示器交互。整个链路缺一不可。2.3 为什么显示驱动必须接入DRM现在回到核心问题为什么显示驱动绕不开DRM第一个原因是内核架构的强制要求。在现在的Linux内核里DRM子系统是显示驱动的标准框架。你写一个显示控制器驱动必须实现DRM规定的接口注册CRTC、Plane、Encoder、Connector等对象。内核的显示核心drm_crtc_helper、drm_atomic_helper等会通过这些接口来管理你的硬件。如果你不接入DRM你的驱动就没法跟内核的显示框架对接用户空间就没法通过标准接口比如libdrm、Wayland compositor、X Server来控制显示。第二个原因是用户空间的依赖。现代Linux桌面环境GNOME、KDE、Wayland合成器Weston、Sway、Android的SurfaceFlinger全都依赖DRM接口来管理显示。它们通过DRM的ioctl来设置显示模式、提交画面、管理多屏。如果你的驱动不提供DRM接口这些用户空间程序就没法正常工作。第三个原因是硬件能力的暴露。现代显示控制器有很多高级特性比如多图层叠加、硬件光标、色彩管理、自适应同步等。这些特性只有通过DRM的Plane、Property等机制才能暴露给用户空间。用Framebuffer的话这些硬件能力全部浪费了。第四个原因是内存管理的统一。DRM的GEM和DMA-BUF机制提供了跨设备、跨进程的缓冲区共享能力。比如GPU渲染完的画面可以直接送给显示控制器显示不需要CPU拷贝。这种零拷贝的流水线在现代图形系统中是必须的而Framebuffer做不到这一点。3. DRM驱动开发的核心实操要点3.1 驱动初始化的关键步骤写一个DRM显示驱动初始化流程大致分为这几个阶段首先是硬件资源映射。你需要从设备树里获取寄存器基地址、时钟、电源域、中断号等资源用devm_ioremap_resource映射寄存器空间用devm_clk_get获取时钟用devm_regulator_get获取电源。这些是基础中的基础但很容易出错——比如时钟没使能就去读寄存器直接导致内核崩溃。然后是DRM设备创建。调用drm_dev_alloc分配一个drm_device结构设置driver_features比如DRIVER_MODESET、DRIVER_ATOMIC、DRIVER_GEM然后调用drm_dev_register注册到内核。这一步完成后/dev/dri/card0设备节点就会出现。接下来是模式配置初始化。这是最核心的部分你需要实现drm_mode_config_funcs里的关键回调static const struct drm_mode_config_funcs my_display_mode_config_funcs { .fb_create my_display_fb_create, .atomic_check drm_atomic_helper_check, .atomic_commit drm_atomic_helper_commit, };其中atomic_check和atomic_commit通常直接用DRM提供的helper函数除非你有特殊的硬件限制需要自定义检查逻辑。再往后是创建显示对象。你需要初始化CRTC、Plane、Encoder、Connector并把它们通过drm_connector_attach_encoder、drm_encoder_init等函数关联起来。每个对象都需要实现对应的funcs结构体比如CRTC的atomic_enable、atomic_disable、atomic_flush等回调。最后是注册中断处理和启用显示。显示控制器的中断通常包括VSYNC、FIFO underflow、热插拔等需要在中断处理函数里调用drm_crtc_handle_vblank等函数通知DRM核心。3.2 设备树配置的常见陷阱设备树是DRM驱动获取硬件描述的主要途径配置错误是导致显示问题的常见原因。以下是一个典型的显示控制器设备树节点display-subsystem { compatible rockchip,display-subsystem; ports vopb_out, vopl_out; status okay; }; vopb: vopff930000 { compatible rockchip,rk3399-vop-big; reg 0x0 0xff930000 0x0 0x1fff; interrupts GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH; clocks cru ACLK_VOP0, cru DCLK_VOP0; clock-names aclk_vop, dclk_vop; resets cru SRST_VOP0_A; reset-names axi; power-domains power RK3399_PD_VOPB; status okay; vopb_out: port { #address-cells 1; #size-cells 0; vopb_out_edp: endpoint0 { reg 0; remote-endpoint edp_in_vopb; }; vopb_out_hdmi: endpoint1 { reg 1; remote-endpoint hdmi_in_vopb; }; }; };这里有几个容易踩的坑clock-names的顺序必须和驱动里devm_clk_get的name参数一致否则拿到的时钟句柄是错的remote-endpoint必须成对出现否则DRM在绑定Encoder和Connector时会失败power-domains如果没配运行时可能因为电源域没打开而访问寄存器失败。3.3 Atomic模式提交的工作流程现代DRM驱动基本都采用Atomic模式它把一次显示更新抽象成一个原子事务。整个流程是这样的用户空间通过drmModeAtomicAlloc创建一个原子请求然后用drmModeAtomicAddProperty添加要修改的属性比如CRTC的ACTIVE、MODE_IDPlane的FB_ID、CRTC_ID、SRC_X/Y/W/H等最后调用drmModeAtomicCommit提交。内核侧收到提交请求后先调用atomic_check回调做合法性检查——比如检查Plane是否支持请求的缩放比例、CRTC的时钟是否能满足请求的分辨率、多个Plane之间是否有资源冲突。检查通过后再调用atomic_commit执行实际的硬件配置。在atomic_commit里DRM核心会调用各个对象的atomic_flush、atomic_enable、atomic_disable回调。你的驱动需要在这些回调里完成寄存器的读写。这里有个关键点寄存器配置必须在VSYNC中断或者安全窗口内完成否则会出现画面撕裂或者闪烁。实操心得在调试Atomic提交时可以打开内核的drm.debug参数比如drm.debug0x1e这样能看到每次提交的详细属性变化和检查结果对定位问题非常有帮助。4. 多屏管理与CRTC分配的实际操作4.1 多屏场景下的CRTC资源分配多屏显示是DRM的一个重要应用场景也是容易出问题的地方。假设你的SoC有两个VOPVideo Output Processor也就是两个CRTC一个接HDMI一个接MIPI DSI。系统启动后DRM核心会枚举所有的CRTC、Encoder、Connector然后根据设备树的连接关系建立可能的显示管道。当用户空间想要在HDMI上显示时它需要找到一个可用的CRTC把它和HDMI对应的Encoder、Connector绑定起来。这个过程在Atomic模式下是通过设置CRTC_ID属性完成的。如果两个屏幕都想用同一个CRTC就会冲突——这时候atomic_check会返回-EINVAL提交失败。实际开发中CRTC的分配策略通常由用户空间的显示管理器决定。比如Weston会根据输出热插拔事件动态分配CRTCAndroid的SurfaceFlinger也有自己的分配逻辑。作为驱动开发者你需要确保的是每个CRTC能独立工作Encoder和Connector的绑定关系正确热插拔事件能正常上报。4.2 热插拔检测的实现细节HDMI的热插拔检测HPD是显示驱动必须处理的中断。当HDMI线插入或拔出时显示器的HPD引脚电平会变化触发SoC的中断。你的驱动需要在中断处理函数里读取HPD状态然后调用drm_helper_hpd_irq_event通知DRM核心。DRM核心收到通知后会更新Connector的status属性并发送uevent到用户空间。用户空间的显示管理器收到事件后会重新读取EDID、协商显示模式、重新配置显示管道。这里有个常见的坑HPD中断的消抖。HDMI插拔时电平会有抖动如果每次抖动都触发一次完整的显示重配置会导致屏幕反复闪烁。通常的做法是在中断处理里加一个延时工作队列延时50到100毫秒后再读取HPD状态确认稳定后再上报。4.3 分辨率切换与模式协商当显示器连接后DRM会通过DDC通道读取EDID数据解析出显示器支持的所有分辨率模式。这些模式会通过Connector的modes属性暴露给用户空间。用户空间选择一个模式后通过Atomic提交设置CRTC的MODE_ID属性。驱动侧需要在CRTC的atomic_enable或者atomic_mode_set回调里根据选定的模式计算时序参数——包括像素时钟、水平同步、垂直同步、前后沿等。这些参数直接写入显示控制器的时序寄存器。如果时序计算错误屏幕会显示异常或者完全黑屏。注意事项不同显示接口的时序要求不同。比如MIPI DSI需要额外配置lane数量、速率、时序参数HDMI需要配置TMDS时钟、色彩深度、音频采样率等。这些参数通常由Encoder驱动负责但CRTC驱动需要确保像素时钟匹配。5. 常见问题排查与调试技巧5.1 屏幕点不亮的排查思路屏幕点不亮是最常见也最让人头疼的问题。排查时建议按照从底层到上层的顺序逐步确认排查层级检查内容常用方法硬件层供电、时钟、复位、背光万用表、示波器测量寄存器层显示控制器寄存器配置devmem读取寄存器值DRM对象层CRTC/Encoder/Connector状态cat /sys/kernel/debug/dri/0/state用户空间层模式设置是否成功modetest工具测试先从硬件层确认供电和时钟正常然后检查显示控制器的寄存器是否被正确配置。如果寄存器配置没问题再看DRM对象的状态——/sys/kernel/debug/dri/0/state会显示当前所有CRTC、Plane、Connector的状态包括是否使能、当前模式、绑定的Framebuffer等。如果DRM状态显示正常但屏幕还是不亮问题可能在背光或者面板初始化序列。MIPI DSI面板通常需要发送初始化命令序列这些命令在面板的spec里有详细说明需要正确配置到驱动里。5.2 画面撕裂与VSYNC同步问题画面撕裂通常是因为Framebuffer的更新和显示控制器的扫描不同步。解决方法是启用VSYNC同步在VSYNC中断到来时再提交新的Framebuffer确保扫描完一帧后再切换缓冲区。在Atomic模式下可以通过设置CRTC的OUT_FENCE_PTR属性来实现同步。用户空间提交时创建一个out fence驱动在VSYNC中断里signal这个fence用户空间等待fence后再提交下一帧。这样就实现了双缓冲或者三缓冲的同步机制。另一个常见问题是FIFO underflow——显示控制器的FIFO缓冲区空了导致画面闪烁或者颜色异常。这通常是因为像素时钟太快或者内存带宽不够。解决方法包括降低分辨率、减少Plane数量、提高内存频率等。5.3 调试工具与技巧汇总DRM子系统提供了丰富的调试接口熟练使用这些工具能大幅提升排查效率/sys/kernel/debug/dri/0/state查看当前显示状态包括所有对象的状态和属性值/sys/kernel/debug/dri/0/framebuffer查看当前注册的Framebuffer信息modetestlibdrm提供的测试工具可以用来枚举显示资源、设置模式、测试显示输出drm_info更现代的DRM信息查看工具输出格式更友好内核参数drm.debug0x1e打开DRM核心的详细调试日志实操心得在调试多屏问题时先用modetest -M -c枚举所有Connector确认每个Connector的状态和可用模式。然后用modetest -M -s connector_idcrtc_id: 测试单个屏幕的输出。这样可以快速定位是哪个环节出了问题。6. 从驱动开发到系统集成的经验分享6.1 Android显示子系统与DRM的关系Android的显示子系统虽然对上层应用提供了SurfaceFlinger这套抽象但底层依然是基于DRM的。SurfaceFlinger通过HWCHardware Composer与DRM驱动交互HWC负责把多个Surface合成后提交给DRM显示。在Android中DRM驱动需要额外支持一些特性比如fence同步、HDR元数据传递、可变刷新率等。Android的HWC HAL实现通常会直接调用libdrm的接口来操作DRM设备。如果你在移植Android到新的硬件平台显示部分的调试往往是最耗时的环节之一。6.2 性能优化中的关键考量显示驱动的性能优化主要围绕几个方面减少内存带宽占用、降低延迟、提高合成效率。减少内存带宽的一个有效方法是使用AFBCARM Frame Buffer Compression或者类似的硬件压缩格式。如果显示控制器和GPU都支持AFBC可以在Framebuffer创建时指定压缩格式这样内存带宽能降低30%到50%。降低延迟的关键是减少缓冲队列深度。双缓冲的延迟比三缓冲低但更容易出现卡顿。在实际产品中需要根据场景权衡——比如VR场景要求极低延迟通常用双缓冲加预测视频播放场景可以用三缓冲来保证流畅。提高合成效率的方法是尽量使用硬件Plane而不是GPU合成。每个Plane的叠加都是硬件完成的不消耗GPU算力。但如果Plane数量不够或者格式不支持就只能回退到GPU合成这时候功耗和延迟都会增加。6.3 跨平台移植的注意事项不同SoC的显示控制器差异很大移植DRM驱动时需要注意这些方面寄存器接口完全不同但DRM框架提供的helper函数可以复用大部分逻辑。重点是实现好CRTC的atomic_flush和Plane的atomic_update回调把硬件寄存器的配置逻辑封装在里面。时钟和电源管理策略不同。有些SoC的显示控制器有独立的电源域有些则和GPU共享。移植时需要仔细阅读SoC的电源管理文档确保在正确的时机使能和关闭时钟。中断处理方式不同。VSYNC中断、FIFO underflow中断、HPD中断的处理逻辑需要根据硬件手册来实现。特别是VSYNC中断它是Atomic提交完成的通知机制必须正确处理。面板和桥接芯片的初始化序列不同。MIPI DSI面板、LVDS桥接芯片、HDMI电平转换芯片等都需要正确的初始化配置。这些配置通常来自硬件原理图和芯片数据手册需要仔细核对。我在实际项目中遇到过最棘手的一个问题是SoC的显示控制器在特定分辨率下会出现偶发的FIFO underflow导致屏幕随机闪烁。排查了很久才发现是内存带宽在特定负载下不够用。最终的解决方案是在设备树里提高了显示控制器的内存优先级同时优化了Plane的格式选择问题才彻底解决。这种问题没有捷径只能靠对硬件和DRM框架的深入理解加上耐心的调试。最后分享一个实用技巧在调试显示问题时养成先看/sys/kernel/debug/dri/0/state的习惯。这个文件会告诉你当前所有显示对象的状态包括哪些CRTC是激活的、每个Plane绑定了哪个Framebuffer、Connector的连接状态和当前模式。很多问题看一眼这个状态就能定位方向比盲目翻代码高效得多。

相关新闻

游戏引擎基础架构实战:内存管理、数据结构与模块化设计

游戏引擎基础架构实战:内存管理、数据结构与模块化设计

1. 从一次崩溃日志说起:为什么基础架构决定了引擎的生死 很多人第一次接触游戏引擎,注意力都放在渲染效果、物理模拟、粒子特效这些“看得见”的东西上。我当年也是这么想的——直到我参与的一个小项目在运行了四十分钟后毫无征兆地闪退,日志…

2026/10/12 10:04:00 阅读更多 →
JavaWeb学生成绩管理系统:MySQL+Servlet+JDBC池可运行源码

JavaWeb学生成绩管理系统:MySQL+Servlet+JDBC池可运行源码

简介:本资源是一套完整的JavaWeb学生成绩管理系统实战项目,面向Java初学者与Web开发入门者,聚焦教育管理场景下的CRUD业务实现与MVC架构实践。压缩包含353个文件,总大小8.98MB,涵盖53个Java源码(含StudentS…

2026/10/9 14:33:35 阅读更多 →
Matlab实现风电功率预测误差时空相关性建模与场景生成分析

Matlab实现风电功率预测误差时空相关性建模与场景生成分析

以前我在做风功率预测项目的时候,最头疼的其实不是预测算法本身,而是预测做完之后没法交代“你这个预测到底准在哪”。RMSE、MAE、MAPE这些指标我当然会给,但调度那边追问的是另一句:那你告诉我明天这个风电场群的出力&#xff0c…

2026/10/11 5:48:43 阅读更多 →

最新新闻

flex+bison实现小型编译器:词法分析、语法分析与语义检查全流程

flex+bison实现小型编译器:词法分析、语法分析与语义检查全流程

简介:这是一套面向计算机专业本科生的编译原理课程设计完整资料,覆盖词法分析、LL(1)预测分析、LR(0)/SLR(1)语法分析、四元式生成与汇编代码生成,并附带小型编译器实现及课程设计报告,可满足从实验到报告提交的全流程需求。压缩包…

2026/10/12 10:03:54 阅读更多 →
知识蒸馏+增量学习:目标检测模型如何越训越强不忘旧类

知识蒸馏+增量学习:目标检测模型如何越训越强不忘旧类

简介:本资源为基于知识蒸馏的目标检测模型增量深度学习方法的Python源码,面向人工智能、计算机视觉方向的高校学生、教师及企业研发人员,尤其适合正在做毕设、课程设计或算法进阶的学习者,用于解决目标检测模型在增量学习中易遗忘…

2026/10/12 10:03:54 阅读更多 →
AI Agent记忆管理实战:四层架构与可验证落地指南

AI Agent记忆管理实战:四层架构与可验证落地指南

1. 为什么“记忆”是AI Agent最常被忽略的致命短板 我第一次在某跨平台系统里跑通一个带多轮对话的Agent时,兴奋地给团队演示“它能记住用户刚说过的偏好”。结果第三轮对话刚过,它就把用户明确说过的“不要推荐咖啡因饮料”忘得一干二净,转头…

2026/10/12 10:03:54 阅读更多 →
AI Agent工程实践指南:从决策判断到故障防御

AI Agent工程实践指南:从决策判断到故障防御

1. 这不是又一本“AI科普书”,而是一份给动手者的Agent开发手记你点开这个标题,大概率不是想听“AI Agent是什么”这种教科书定义——毕竟搜索引擎里铺天盖地的“概念图解”“三层架构图”“RAGLLMAgent”已经够多。真正卡住你的,是那几个深夜…

2026/10/12 10:03:54 阅读更多 →
GEO优化全指南:从大模型内容偏好到AI引用实战

GEO优化全指南:从大模型内容偏好到AI引用实战

1. GEO 不是 SEO 的换皮:AI 回答正在重写流量分配规则 过去一年里,我发现一个特别明显的趋势:身边越来越多的人问"为什么我在百度上排名第一,用户却说搜不到我"。不是搜不到,而是用户不再逐条点蓝色链接了。…

2026/10/12 10:03:54 阅读更多 →
基于模型压缩的识别算法Python源码:蒸馏与剪枝实战

基于模型压缩的识别算法Python源码:蒸馏与剪枝实战

简介:这份资源是面向高校毕业设计与深度学习入门者的模型压缩识别算法Python源码包,聚焦知识蒸馏与剪枝两类主流压缩技术,帮助读者在有限算力下完成识别模型的轻量化改造与对比实验。包内共185个文件,以79个py源码为核心&#xff…

2026/10/12 10:02:52 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →