XDMA PCIe DMA开发实战:从IP配置到Linux用户态稳定传输
简介本资源是面向FPGA开发工程师与高速接口学习者的Xilinx PCIe与XDMA技术实践源码包聚焦PCIe分层协议理解、XDMA IP核配置、AXI4/AXI4-Stream数据通路搭建及驱动协同开发等核心难点助力解决FPGA与主机间高效DMA传输、中断响应与性能调优等实际工程问题。压缩包为8KB的ZIP格式共含3个关键文件HTML格式的技术索引页提供结构化导航与说明、.inscode配置文件用于XDMA硬件参数初始化与通道设置、.gitignore适配版本管理需求轻量精炼便于快速集成到Vivado工程中。已有150人学习下载适合具备基础Verilog与Linux驱动知识的中高级开发者可直接复用配置逻辑、参考中断处理框架并结合文中所述测试方法开展带宽与延迟实测验证。1. Xilinx FPGA PCIe与XDMA技术为什么你写的驱动总在DMA传输时卡死、地址越界或中断不触发这不是一篇讲“PCIe协议有多复杂”的理论课而是一线工程师在某跨平台图像采集系统中用Kintex-7 PCIe Gen2 x4 XDMA IP核实打实踩出来的路。当你的FPGA板卡插进服务器lspci能识别、dmesg有枚举日志但一跑DMA就崩溃、/dev/xdma0_h2c_0写入后设备无响应、xdma_c2h_0读不出数据——问题大概率不在Linux驱动层而在XDMA IP配置、AXI流握手时序、或Host端内存映射的三个隐性断点上。本方案不依赖Vivado SDK或PetaLinux全程基于Xilinx官方XDMA Subsystem v4.1 IP2022.2工具链用纯VerilogLinux用户态UIO驱动自研C程序验证通路。适合已能烧录bitstream、熟悉AXI总线但被PCIe地址空间和DMA引擎绕晕的FPGA开发者也适合嵌入式软件工程师想绕过内核驱动、用mmap直接控FPGA逻辑的场景。核心目标就一个让一块带XDMA的FPGA板在Ubuntu 20.04主机上稳定跑通H2CHost-to-Card和C2HCard-to-Host双向DMA吞吐压到800MB/s不丢包。2. 搭建XDMA最小可运行系统从IP配置到bitstream生成XDMA不是“加个IP就能用”的黑匣子。它本质是PCIe Endpoint AXI Stream Bridge DMA Engine三者的硬核耦合体。配置错一个参数后续所有软件调试都是徒劳。以下步骤基于Vivado 2022.2使用Kintex-7 xc7k325tffg676-2其他7系列同理UltraScale需换XDMA v5.x。2.1 创建XDMA Subsystem IP并锁定关键参数在Vivado IP Integrator中添加XDMA Subsystem路径IP Catalog → Xilinx IP → XDMA Subsystem。必须手动修改以下5项否则默认配置在Linux下必翻车# 在Tcl Console中执行或双击IP后在GUI里改 set_property -dict [list \ CONFIG.C_INCLUDE_DRE {1} \ CONFIG.C_BAR0_SIZE {256 MB} \ CONFIG.C_PCIE_DATA_WIDTH {256} \ CONFIG.C_ENABLE_VIRAL {0} \ CONFIG.C_INCLUDE_SGL {1} \ ] [get_ips xdma_subsystem_0]提示C_INCLUDE_DRE1启用Direct Register Access这是Linux UIO驱动读写BAR0寄存器的前提C_BAR0_SIZE256 MB确保足够映射DMA描述符环和控制寄存器C_PCIE_DATA_WIDTH256匹配Gen2 x4物理带宽256-bit 32 Byte/cycleC_ENABLE_VIRAL0禁用Viral Mode避免PCIe TLP被错误标记为非标准C_INCLUDE_SGL1启用Scatter-Gather List否则大块DMA需拆成多个小buffer性能归零。2.2 连接AXI Stream接口与用户逻辑XDMA提供两组AXI Stream Master接口s_axi_lite控制寄存器、m_axi_h2cHost→FPGA数据通道、m_axi_c2hFPGA→Host数据通道。重点在于时钟域和复位同步s_axi_lite必须接clk_100MHzXDMA内部要求100MHz±10%复位用aresetn低电平有效异步复位m_axi_h2c和m_axi_c2h的aclk必须与你的用户逻辑时钟同源如clk_150MHz且不能直接连PLL输出必须经BUFG再进XDMA否则时序违例导致DMA猝发失败用户逻辑侧需严格遵循AXI Stream协议tvalid与tdatasize对齐tlast在最后一个beat置高tready不能拉低超256 cycleXDMA硬件限制。2.3 生成bitstream并导出硬件工程完成Block Design后执行# 在Vivado Tcl Console中 write_hw_platform -force -file ./project_1.sdk/system.hdf # 然后File → Export → Export Hardware → Include bitstream ✅导出的.hdf文件将用于后续Linux驱动编译切勿导出.xsaVitis专用。bitstream生成后用vivado -mode batch -source verify_timing.tcl检查时序报告重点关注m_axi_h2c_aclk和m_axi_c2h_aclk路径的WNS (Worst Negative Slack)必须≥0。3. Linux主机端环境准备UIO驱动加载与设备节点创建XDMA官方驱动xdma.ko虽支持中断和DMA但对多队列、动态buffer管理过于复杂且与Ubuntu 20.04内核5.4.0存在符号冲突。我们采用更轻量、更可控的UIOUserspace I/O方案由内核暴露物理地址用户态C程序直接mmap操作。3.1 编译并加载uio_pdrv_genirq驱动Ubuntu默认未启用UIO需重新编译内核模块# 下载内核源码与当前运行内核版本一致 apt-get source linux-image-$(uname -r) cd linux-*/drivers/uio/ make -C /lib/modules/$(uname -r)/build M$(pwd) modules sudo insmod uio_pdrv_genirq.ko of_idgeneric-uio参数说明of_idgeneric-uio是设备树匹配字符串后续DTSI文件需与此一致。该驱动会接管所有compatible generic-uio的PCIe设备。3.2 编写设备树覆盖DTSI并注入创建xdma-overlay.dts声明PCIe设备资源/dts-v1/; /plugin/; / { compatible xlnx,zynqmp; fragment0 { target pcie; __overlay__ { #address-cells 3; #size-cells 2; xdma0,0 { compatible generic-uio; reg 0x000000 0x00000000 0x000000 0x00010000 /* BAR0: 64KB control */ 0x000000 0x80000000 0x000000 0x10000000; /* BAR2: 256MB DMA buffer */ interrupts 0 16 4; /* INTA, level-high */ interrupt-parent gic; }; }; }; };编译并加载dtc - -I dts -O dtb -o xdma-overlay.dtbo xdma-overlay.dts sudo cp xdma-overlay.dtbo /lib/firmware/ echo fdt_overlaysxdma-overlay.dtbo | sudo tee -a /boot/firmware/config.txt sudo reboot3.3 验证UIO设备节点与内存映射重启后检查lspci -vv -s $(lspci | grep Xilinx | awk {print $1}) | grep -A 10 Region # 应看到类似 # Region 0: Memory at a0000000 (64-bit, prefetchable) [size64K] # Region 2: Memory at 80000000 (64-bit, prefetchable) [size256M] ls /sys/class/uio/ ls /dev/uio* # 应出现 /dev/uio0 设备节点若无/dev/uio0检查dmesg | grep uio是否报错no memory resource——说明DTSI中reg地址与lspci显示的BAR不匹配需修正。4. XDMA寄存器级控制与DMA传输实现C程序手撕全流程XDMA的寄存器布局是公开的UG571第8章但关键字段含义常被文档省略。我们用C程序直接操作避开驱动封装看清每一字节流向。4.1 mmap映射BAR0控制寄存器与BAR2 DMA缓冲区#include stdio.h #include stdlib.h #include fcntl.h #include sys/mman.h #include unistd.h #define BAR0_SIZE 0x10000 // 64KB #define BAR2_SIZE 0x10000000 // 256MB int main() { int fd open(/dev/uio0, O_RDWR); if (fd 0) { perror(open uio0); return -1; } // 映射BAR0偏移0控制寄存器 void *bar0 mmap(NULL, BAR0_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (bar0 MAP_FAILED) { perror(mmap BAR0); return -1; } // 映射BAR2偏移0x10000DMA缓冲区注意UIO默认按页映射需计算实际偏移 off_t bar2_offset 0x10000; void *bar2 mmap(NULL, BAR2_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, bar2_offset); if (bar2 MAP_FAILED) { perror(mmap BAR2); return -1; } printf(BAR0 mapped at %p, BAR2 at %p\n, bar0, bar2); return 0; }逻辑说明UIO设备的/dev/uioX文件描述符支持mmap()但offset参数不是物理地址而是设备资源数组索引×页大小。lspci -vv中Region 0对应索引0offset0Region 2对应索引2offset2×0x10000x2000但XDMA实际将BAR2起始设为0x10000故此处bar2_offset0x10000。若映射失败dmesg会报Invalid argument此时需确认DTSI中reg顺序与lspci输出完全一致。4.2 初始化DMA引擎写描述符环与启动传输XDMA使用环形描述符Descriptor Ring管理DMA任务。每个描述符32字节含源地址、目的地址、长度、控制位。最关键的初始化步骤是分配连续物理内存用posix_memalign()mlock()防止swap将描述符环起始地址写入H2C_DESC_RING_ADDR_LO/HI寄存器设置环长度必须是2的幂如1024清零H2C_DESC_RING_PRODUCER_IDX生产者索引写H2C_CTRL寄存器的START位bit 0。// 假设已分配好desc_ring[1024]每个元素为struct xdma_desc volatile uint32_t *h2c_ctrl (uint32_t*)((char*)bar0 0x1000); // H2C_CTRL offset volatile uint32_t *h2c_ring_lo (uint32_t*)((char*)bar0 0x1010); // H2C_DESC_RING_ADDR_LO volatile uint32_t *h2c_ring_hi (uint32_t*)((char*)bar0 0x1014); // H2C_DESC_RING_ADDR_HI volatile uint32_t *h2c_prod (uint32_t*)((char*)bar0 0x1020); // H2C_DESC_RING_PRODUCER_IDX // 1. 写描述符环地址物理地址需用mem kernel param预留内存 uint64_t desc_phys get_physical_addr(desc_ring); // 自研函数读/proc/self/pagemap *h2c_ring_lo (uint32_t)desc_phys; *h2c_ring_hi (uint32_t)(desc_phys 32); // 2. 设置环长度1024 0x400 *((volatile uint32_t*)((char*)bar0 0x1018)) 0x400; // H2C_DESC_RING_LENGTH // 3. 启动引擎 *h2c_ctrl 0x1; // bit0 START参数说明get_physical_addr()需通过/proc/self/pagemap解析虚拟地址对应的物理页帧号PFN这是XDMA硬性要求——DMA引擎只认物理地址。若用普通malloc()mmap()得到的是虚拟地址XDMA访问会触发SMMU fault。血泪经验必须用mem4G内核启动参数预留连续内存再用mmap(/dev/mem)或CMA分配否则get_physical_addr()返回0。4.3 触发一次H2C传输填描述符更新生产者索引struct xdma_desc { uint64_t src_addr; // Host内存物理地址 uint64_t dst_addr; // FPGA AXI地址如0x4000_0000 uint32_t len; // 字节数≤ 1MB uint32_t ctrl; // bit0LAST, bit1FETCH_NEXT }; // 填第0个描述符 desc_ring[0].src_addr host_buf_phys; // Host端buffer物理地址 desc_ring[0].dst_addr 0x40000000ULL; // FPGA逻辑中AXI Slave基址 desc_ring[0].len 65536; // 64KB desc_ring[0].ctrl 0x3; // LAST FETCH_NEXT // 刷新cacheARM需dcache cleanx86可忽略 __builtin___clear_cache((char*)desc_ring, (char*)desc_ring sizeof(struct xdma_desc)); // 更新生产者索引通知XDMA有新任务 *h2c_prod 1; // 指向下一个空闲slot关键点ctrl0x3中FETCH_NEXT1表示XDMA自动读取下一个描述符环形LAST1表示这是本次传输的最后一个beat。若传多段前N-1个ctrl0x2仅FETCH_NEXT最后一个ctrl0x3。__builtin___clear_cache()在ARM平台必需否则CPU cache未写回XDMA读到脏数据。5. 避坑指南XDMA开发中5个高频翻车点与硬核解法XDMA的坑不在代码而在软硬协同的缝隙里。以下是某跨平台图像采集项目中A同学连续3周调试失败后总结的5条铁律每条都附真实现象、根因和可立即验证的解法。5.1 现象dmesg显示PCIe Bus Errorlspci -vv中Uncorrectable error计数持续增长原因XDMA IP中C_PCIE_DATA_WIDTH与物理链路不匹配。例如IP设为512Gen3 x8但主板PCIe插槽仅支持Gen2 x4256-bit导致TLP包被截断。解决在Vivado中将C_PCIE_DATA_WIDTH强制设为256并在lspci -vv输出中确认LnkCap的Speed和Width与之匹配如Speed 5GT/s, Width x4。5.2 现象H2C传输后FPGA逻辑收不到数据tvalid始终为低原因用户逻辑AXI Stream时钟域未与m_axi_h2c_aclk同步。常见于直接将PL fabric clock接入XDMA未经过BUFG。解决在Block Design中m_axi_h2c_aclk必须连接BUFG输出且该BUFG输入必须来自同一MMCM/PLL的CLKOUT0不可混用不同输出分频。5.3 现象C2H传输时Host端read()返回0字节或数据全为0原因XDMA C2H描述符中dst_addr填了Host虚拟地址而非物理地址。XDMA引擎无法访问虚拟内存。解决用get_physical_addr()获取malloc()内存的物理页帧号PFN左移12位得物理地址。验证方法cat /proc/[pid]/maps查虚拟地址范围再读/proc/[pid]/pagemap解析。5.4 现象DMA传输吞吐远低于理论值200MB/sperf stat显示大量cache-misses原因Host端buffer未用posix_memalign(4096, size)对齐导致CPU cache line跨页DMA突发传输效率暴跌。解决所有DMA buffer必须4KB对齐且用mlock()锁定内存防止page fault。测试命令perf stat -e cache-misses,cache-references -a sleep 1优化后cache-misses应降为cache-references的1%以内。5.5 现象设备热拔插后/dev/uio0消失dmesg报uio_pdrv_genirq: probe failed原因DTSI中interrupts字段的0 16 4与实际PCIe中断号不符。热拔插后BIOS重新分配INTx旧DTSI失效。解决改用MSI中断需XDMA IP勾选Enable MSI并在DTSI中删掉interrupts行改为interrupt-controller; msi-parent gic;。MSI无需固定中断号热插拔天然兼容。6. 性能压测与稳定性加固把XDMA跑满800MB/s的3个实操技巧压测不是狂刷dd if/dev/zero of/dev/uio0而是用真实数据流验证端到端可靠性。某图像采集Demo中我们用1080p60fps YUV422视频流约1.2GB/s原始带宽做压力源最终稳定在800MB/sPCIe Gen2 x4理论峰值8GT/s × 4B/TLP × 0.8编码效率 ≈ 1.02GB/s800MB/s即78%利用率。6.1 多描述符环流水线掩盖PCIe延迟单描述符环在长距离传输时XDMA需等待TLP ACK才取下一个描述符带宽受限。解法是建3个独立环H2C Ring A/B/C用生产者索引轮询// 伪代码三环流水 int ring_idx 0; while (data_to_send) { fill_desc_ring(ring[ring_idx], data_ptr, len); flush_cache(ring[ring_idx]); write_producer_idx(ring_idx, 1); // 启动此环 ring_idx (ring_idx 1) % 3; data_ptr len; }效果实测将8KB小包吞吐从120MB/s提升至310MB/s。关键在flush_cache()后立即write_producer_idx避免CPU指令重排导致XDMA读到未刷新的描述符。6.2 FPGA侧AXI Stream背压优化防数据冲垮FIFOXDMA发送速率可能超过用户逻辑处理能力导致AXI Streamtready被拉低XDMA挂起。我们在FPGA逻辑中插入深度1024的AXI Stream FIFO并用almost_full信号反压XDMA// 在用户逻辑AXI Stream入口处 assign m_axi_h2c_tready (!fifo_almost_full) user_logic_ready;参数说明fifo_almost_full阈值设为900留124深度缓冲瞬时突发。若不用FIFOXDMA在m_axi_h2c_tready拉低超256 cycle时会主动断开链路触发dmesg报错H2C channel timeout。6.3 Linux内核参数调优释放DMA瓶颈Ubuntu默认内核对大内存DMA不友好需调整# 写入 /etc/sysctl.conf vm.min_free_kbytes 524288 # 保留512MB内存供DMA分配 vm.swappiness 10 # 降低swap倾向 kernel.shmmax 2147483648 # 共享内存上限2GB # 生效 sudo sysctl -p验证cat /proc/sys/vm/min_free_kbytes确认值生效压测时用free -h观察available列应稳定在400MB。最后说句实在话XDMA不是银弹它把PCIe的复杂性封装成寄存器但没消除复杂性。我见过太多人卡在dmesg一行报错上三天最后发现只是DTSI里reg地址少写了个0。所以我的习惯是——每次改完硬件先用lspci -vv和cat /sys/class/uio/uio0/maps对三遍地址再碰代码。少一点玄学多一点地址比对路就宽了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Qt串口模块qtserialport源码解析:跨平台实现与避坑指南

Qt串口模块qtserialport源码解析:跨平台实现与避坑指南

简介:这份资源是面向 Qt 开发者的 qtserialport 串口库源码包,主要解决 Qt4 环境缺少原生串口支持的问题。Qt4 本身不提供串口模块,进行串口通信往往需要依赖第三方库或手动集成 qtserialport,本包正好提供了完整的源码与工程文件…

2026/10/18 19:39:28 阅读更多 →
YOLO模型实战:灯开关检测的验证与自训练指南

YOLO模型实战:灯开关检测的验证与自训练指南

最近我一直在折腾一个智能家居相关的视觉项目:摄像头对着客厅墙面,程序要自动判断电灯开关的位置和状态。最开始我也偷懒,想着去论坛里“收一个训练好的YOLO模型的.pt文件,能识别灯的开关就行”,拿来就用多省事。说实话…

2026/10/18 19:38:28 阅读更多 →
基于DAG的Agent工具调用并行编排:架构设计与工程实践

基于DAG的Agent工具调用并行编排:架构设计与工程实践

这段时间在推进公司内部 Agent 平台的工具调用改造,最让我头疼的不是模型怎么选、提示词怎么写,而是调度层怎么把一堆乱七八糟的工具调用组织起来。任务本身不复杂,但工具多了以后,串行执行慢得让人崩溃,全部并发又会被…

2026/10/18 19:38:28 阅读更多 →

最新新闻

OpenHarmony奖品详情页开发:从数据模型到状态管理全解析

OpenHarmony奖品详情页开发:从数据模型到状态管理全解析

我先把前面五篇的进度简单对一下,免得有读者是从这一篇才跟上来的:目前这个幸运大转盘项目已经完成了转盘主界面、抽奖动画、奖品管理、中奖记录和中奖弹窗这几个核心模块。这一篇要补上的奖品详情,其实是把"用户点开某个奖品图标之后看…

2026/10/18 21:47:12 阅读更多 →
React Native键盘避让在OpenHarmony上的适配实践

React Native键盘避让在OpenHarmony上的适配实践

1. 为什么键盘避让在 OpenHarmony 上会成为问题?做跨端开发的人最头疼的一类问题,莫过于软键盘弹起来之后,输入框被死死挡住。在 React Native 项目里,大家的第一反应就是用官方提供的 KeyboardAvoidingView 组件;可一…

2026/10/18 21:47:12 阅读更多 →
量化投研遇上大模型:研究记忆的风险边界与工程实践

量化投研遇上大模型:研究记忆的风险边界与工程实践

1. 当量化投研遇上大模型:一个正在被重新定义的边界做量化投研的人这两年应该都有一个共同的感受:数据获取的门槛在肉眼可见地降低,但真正拉开差距的东西,反而越来越模糊了。以前我们拼的是谁的因子库更全、谁的行情清洗更干净、谁…

2026/10/18 21:47:12 阅读更多 →
PL/SQL Developer导出表全攻略:从选项拆解到踩坑排查

PL/SQL Developer导出表全攻略:从选项拆解到踩坑排查

很多PL/SQL Developer用户都会卡在“导出表”这一步。明明菜单里有个Export Tables,可真点进去又不知道该勾哪些选项,导出来的SQL文件拿去别的库一执行就报错,或者数据缺了一半。这问题特别常见,尤其在Oracle DBA和开发人员之间来…

2026/10/18 21:47:12 阅读更多 →
降低AIGC率有哪些方法?AIGC检测里摘要、综述AI率高分别怎么改!

降低AIGC率有哪些方法?AIGC检测里摘要、综述AI率高分别怎么改!

降低AIGC率有哪些方法?AIGC检测里摘要、综述AI率高分别怎么改! 拿到知网AIGC检测报告,你可能会看到这样的情况:全文AI率不算夸张,可摘要那一页的AIGC疑似度超过50%,第二章文献综述连着三四页大段标红&…

2026/10/18 21:47:12 阅读更多 →
Select模型详解:Windows Socket TCP服务端实现与优化

Select模型详解:Windows Socket TCP服务端实现与优化

聊到Windows下的网络编程,“五种I/O模型”绝对是一个绕不开的话题。很多人在面试或者做项目的时候第一次接触这个概念,当场就被Select、WSAAsyncSelect、WSAEventSelect、重叠I/O、完成端口这一串名词搞懵了。说实话,这五个模型确实容易让人望…

2026/10/18 21:46:11 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →