新闻详情

新闻详情

首页 / 资讯中心 / 详情

TinyUSB usbtest 实战指南:用 Linux 内核 30 项 USB 电池测试验证与移植 DCD 驱动

发布时间:2026/9/29 5:56:53来源:尧图网络
TinyUSB usbtest 实战指南:用 Linux 内核 30 项 USB 电池测试验证与移植 DCD 驱动
嵌入式驱动开发通信物联网【免费下载链接】tinyusbAn open source cross-platform USB stack for embedded system项目地址https://gitcode.com/gh_mirrors/ti/tinyusb点击查看免费下载examples/device/usbtest是 TinyUSB 设备侧的“被测对象”它实现了 Linux 内核usbtest.ko/testusbGadget Zero 风格 source/sink 协议的设备端对端让宿主机侧约 30 个编号测试用例可以完整压测 TinyUSB 的设备控制器驱动DCD。本文以仓库内 .claude/skills/usbtest/SKILL.md 技能文档为主体结合 示例固件、主机运行脚本 与 HIL 测试框架 源码系统讲解这套电池的构建、运行、调试、修复与移植方法。读完本文你将掌握如何跑通整组电池、如何把一个新 MCU/DCD 移植到 30/30 全绿、以及当某个用例报 errno 110/32/5/71 时如何按部就班定位到具体的 DCD 路径。一、认识 usbtest这是 DCD 测试不是固件测试Linux 内核自带一对 USB 测试工具即usbtest.ko内核模块源码位于内核drivers/usb/misc/usbtest.c与testusb用户态调度器源码位于内核tools/usb/testusb.c。testusb通过 usbfs ioctl 通知内核模块执行编号用例而usbtest.ko负责实际驱动总线流量并在宿主机侧完成所有数据校验。TinyUSB 侧的examples/device/usbtest固件实现的就是这个协议的设备端对端在 vendor 专用接口上实现了 Gadget Zero 风格的 source/sink 协议——bulk IN 端点是无限数据源pattern 0全零字节bulk OUT 端点是无限数据汇数据直接丢弃覆盖 bulk、EP0 控制、interrupt、isochronous 四类传输包含 halt、data-toggle、unlinkURB 中途取消等对抗性场景。因此整套电池battery是 DCD 能遇到的最具对抗性的压力测试——据该技能文档记载到目前为止每一个移植过的端口port都至少暴露了一个真实驱动缺陷。核心原则这套电池测的是 DCD不是应用固件。当某个用例失败时应当怀疑它所压测的 DCD 路径见下文“用例 → DCD 子系统映射表”单独复现该用例并且在改动任何代码之前先在硬件上定位根因仓库中的hw-debugger技能负责此事。一次只改一个变量一个修复只有在失败用例通过、且完整电池在多次重新烧录周期后仍然保持 30/30 时才算是被证明有效。协议分层上有一个容易混淆的点TinyUSB 在这套测试里扮演的是USB 设备device role宿主机是 Linux PC。也就是说它压测的是 TinyUSB 的 DCD设备控制器驱动而不是 TinyUSB 的 host 栈——这是该技能文档明确强调的边界。二、固件侧实现Tier 能力通告与 source/sink 泵2.1 能力分层与 bcdDevice 通告固件在 usb_descriptors.h 中定义了USBTEST_TIER宏默认完整实现第 4 层能力层越低可运行的用例越少。这个层数被写进设备描述符的bcdDevice低字节0x0100 | USBTEST_TIER见 usb_descriptors.c主机脚本据此自动挑选匹配的用例组合Tier能力usbtest 用例1bulk source/sink0, 9, 10, 1–8, 11, 12, 24, 13, 29, 17–20, 27, 282 vendor 控制 0x5b/0x5cctrl_out 14, 213 interrupt source/sink 25, 264 isochronous source/sink 15, 16, 22, 23厂商类同时使能了 interrupt 端点对CFG_TUD_VENDOR_EP_INT_OUT/IN、isochronous 端点对CFG_TUD_VENDOR_EP_ISO_OUT/IN与 altsetting 支持CFG_TUD_VENDOR_ALT_SETTINGS配置见 tusb_config.h。alt 0 不携带任何端点默认 altsetting 不为 iso 端点申请带宽符合 USB 2.0 5.6.3alt 1 携带完整 source/sink 端点集宿主机 usbtest 驱动会自行选择 alt 1。由于没有现成的 TUD_ 宏能描述这种布局配置描述符是手写的见 usb_descriptors.c。另外接口必须是编号 0——testusb -D的 ioctl 固定发给接口 0。2.2 端点尺寸的按速协商TUD_OPT_HIGH_SPEED是编译期能力标志不是实时总线速度。因此完整速度FS配置描述符以及 HS 主机读到的 OTHER_SPEED 描述符必须使用 FS 合法尺寸——interrupt 每端点 ≤ 64 B、isochronous ≤ 1023 B/帧——即使在 HS 编译下也如此。所以头文件中区分了_FS/_HS两套尺寸宏USBTEST_INT_EP_MPS_FS/HS、USBTEST_ISO_EP_MPS_FS/HS并针对特定 MCU 覆盖例如 CH32 USB IP 的每端点缓冲区极小usb_descriptors.h 中 WCH USBFS 部件把所有端点限制在 64 BRenesas RA 的 interrupt 管道 6–9 固定 64 B 单缓冲同文件 #L71-L75依据 RA6M5 参考手册 R01UH0891 第 29.1 节。运行时写长度跟随实际协商速度main.c中usbtest_int_len()/usbtest_iso_len()用tud_speed_get() TUSB_SPEED_HIGH判断确保 HS 构建在 FS 枚举时提交 FS 长度bulk 例外它提交多包传输。源码缓冲区按编译期能力最大值分配static uint8_t const tx_chunk[CFG_TUD_VENDOR_TX_EPSIZE]; static uint8_t const int_tx_chunk[USBTEST_INT_EP_MPS]; #if USBTEST_TIER 4 static uint8_t const iso_tx_chunk[USBTEST_ISO_EP_MPS]; #endif2.3 source/sink 泵与回调自我愈合的端点管理usbtest_pump()main.c轮询式保持四条/六条端点都处于 armed 状态并且能在端点 halt 测试SET/CLEAR_FEATURE endpoint halt之后自我愈合stall 会把端点标记为 busy此时调用静默失败直到宿主机清除 halt下一轮 tick 重新武装。这依赖tusb_config.h中的CFG_TUD_VENDOR_RX_MANUAL_XFER 1应用自行重新武装 RX因为 halt 测试中不会有任何 completion 回调触发。同时CFG_TUD_VENDOR_RX_BUFSIZE 0/CFG_TUD_VENDOR_TX_BUFSIZE 0开启非缓冲模式每次传输都提交精确长度宿主机永远不会在传输中途看到意外的短包或 ZLP——usbtest 的数据完整性用例会把它们判为失败。回调把管道持续灌满tud_vendor_rx_cb丢弃数据后立即tud_vendor_read_xfer()重新武装tud_vendor_tx_cb完成后继续写下一块。interrupt 与 iso 端点对走同样的泵tud_vendor_int_rx_cb等iso 完成回调即使是错过帧也会无条件重新武装main.c。EP0 上tud_vendor_control_xfer_cb实现了 ctrl_out 用例的协议0x5b把宿主机wLength字节写入ctrl_buf0x5c读回尺寸可变main.c。主循环 / FreeRTOS 两条路径都支持非 RTOS 构建在主循环里每 tick 调一次usbtest_task(NULL)FreeRTOS 构建则创建 blinky、usbd、usbtest 三个静态任务见main.c的freertos_init()。三、运行整套电池构建、HIL 全流程与手动单用例3.1 构建固件通过构建契约编译device/usbtest与device/board_test。描述符尺寸会经示例自带的 usb_descriptors.h 与 tusb_config.h 按 MCU 自动适配不要额外加-D--variants已经为 roster 中每个变体把各自 define 送进独立的cmake-build-variant见 hil 技能的 Prerequisites多出的-D会粘在 HIL 实际烧录的目录上。不在 roster 上的板子则去掉--variants。board_test是 HIL 在电池跑完后烧录的“驻留固件”python3 .claude/skills/build/scripts/check_build.py --board board -e device/usbtest -e device/board_test --shared --variants this hosts config单 J-Link 的台架可以用ninja -C cmake-build/cmake-build-variant usbtest-jlink直接烧录Espressif 板子用idf.py烧录。3.2 HIL 全流程搭好板子后跑完整电池。HIL 框架会自动上锁无需预先 hold、经 roster 中记录的 probe 烧录、为电池设置预算、并在板子允许时启用挂死恢复python3 test/hil/hil_test.py -b board -t device/usbtest this hosts configHIL 集成按板子执行电池并上报✅ 30/30单元格。CIhil_test.py还会额外传--budget并在板子的恢复 flasher 满足 convoy-safe 且烧录可用时传--recover-board/--recover-fw一旦某用例 HUNG电池会中止先通过 roster probe复位DUT非破坏性约 130 ms只有复位无法解除楔死wedge时才重新烧录。手动运行不带这些标志HUNG 后的设备会保持楔死——这是预期行为需要你自己复位或重新烧录。两个关键环境变量定义并发预算见 hil_lock.py 与 hil_test.pyHIL_USBTEST_PARALLEL默认 2每台宿主控制器最多并发 2 个电池。HIL_USBTEST_BATTERY_BUDGET默认 260单个电池的时长预算超过即停止启动新用例。技能文档特别警告这个并发宽度是一个经过实测的吞吐/带宽权衡不是安全天花板——但超出预算的并发电池是真实危险无预算的并发电池曾让 VFIO 透传的 xHCI 出现致命 PCIe 错误而硬冻结整机在并发电池下劣质 DUT 端口抖动曾直接烧毁一颗 uPD720201而单纯降低并发宽度并不能修复这类问题。另外几个实战细节电池运行会把cafe 4010以 Gadget Zero 的 profile 注册进 usbtest 模块每台机一次并保留 id 与绑定unbind 曾卡死宿主机 xHCIusb_hcd_alloc_bandwidth而下一个示例会在自己的 PID 下枚举。烧录后总是等几秒钟再跑——枚举可能弹跳一次testusb若撞进这个间隙会看到设备在用例中途掉线。在 CI 机器上做手动工作时先 hold 板锁结束后 release——绝不要停掉 actions runner它一直运行per-board flock 才是仲裁者见 hil 技能。绝不要在一台正在跑电池的机器旁边手动再启一个电池。3.3 手动运行单个用例调试时往往只想复现一个用例。由于 HIL 框架在电池结束后会把板子重新烧成驻留固件手动单用例流程是hold 板子 → 用 roster 里记录的 probe 参数烧录 usbtest并钉住 probe→ 等约 3–5 秒完成枚举 → 跑用例 → release。从本机 HIL 配置 JSON 中板子的条目读取probe-uid/args是该板 flasher 的 uid/argsuid是板子自身的 uidvariant是待测变体若条目没有 variant 列表则用板名。非 J-Link flasher 则运行 hil_flash.py 中该 flasher 的flash_flasher()函数——它按条目的FLASHER_SUFFIX构建 usbtest 镜像python3 test/hil/helper/hil_lock.py hold board --reason usbtest case 29 JLinkExe -USB probe-uid args -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 \ -CommandFile cmake-build/cmake-build-variant/device/usbtest/usbtest.jlink python3 test/hil/usbtest.py --serial uid --tests 29 python3 test/hil/helper/hil_lock.py release board3.4 主机运行脚本的关键行为test/hil/usbtest.py 是主机的权威运行器处理驱动绑定、逐用例参数与结果解析。它的核心行为均可在源码中验证5 字段绑定形式绑定必须用cafe 4010 0 0525 a4a0引用 Gadget Zero0525:a4a0使动态 id 继承其能力 profileautoconf ctrl_out iso intr。绝不要注册裸的vid pid动态 id那样 driver_info 为 NULLusbtest_probe()会无 NULL 检查地解引用它造成内核 oops。autoconf 还负责启用 bulk 端点发现。模式设置set_pattern(0)usbtest.py把内核模块的 pattern 参数设为 0——Tier 1 固件源出全零perf 用例 27/28 也依赖它。testusb 输出怪癖其退出码只要设备存在就恒为 0结果必须从 stdout 解析正则test (\d),\s*(\d)\.(\d) secs与test (\d) -- (\d)见 usbtest.py被能力 profile 门控-EOPNOTSUPP的用例会被 testusb 静默跳过——缺失结果行 NOT RUN脚本把它报为失败因为所选电池中每个用例都应当运行。逐用例参数表PARAMSusbtest.pyFS/HS 各一套所有-s/-v值都是 512 的倍数以保持整包对齐——设备流送整包非对齐的 IN 长度会溢出-EOVERFLOW用例 14/21 绝不能用默认参数跑内核里 vary ≥ length 是 -EINVAL。宿主控制器兼容性检查check_host_compatusbtest.py直接拒绝在 MosChip MCS99909710:9990后面的 DUT 上运行FRINDEX 硅片缺陷EHCI 从不调度 int-OUT URB且会把 unlinked read 当作短传输完成Renesas uPD720201/202 则必须固件 ≥ 2.0.2.6PCI 配置 0x6c 读取版本固件是 RAM 上传的断电即回退 ROM否则其命令环会在 unlink 压力下死掉、hub worker 死锁持锁。HUNG 判定与恢复usbtest.py某用例 HUNG 时先经confirm_wedge观察节点上的 D 状态进程最长WEDGE_CONFIRM_S30秒——只有节点仍有持锁者才算楔死确认后先 probe 复位非破坏、约 130 ms失败即可在源头上解开 URB无效才重烧。全程用wedged_pids()扫描/proc中仍处 D 状态且命令行含该设备节点的进程来仲裁失败即关闭fail closed扫描不完整时宁可继续按楔死处理。3.5 手动 testusb 使用了解陷阱仓库 README 同时给出了手动路径但要特别当心testusb默认值永远显式传 512 的倍数给-s/-v且绝不要裸跑testusb -a默认参数集包含参数非法的用例以及全速下长达小时级的运行sudo modprobe usbtest echo cafe 4010 0 0525 a4a0 | sudo tee /sys/bus/usb/drivers/usbtest/new_id sudo testusb -D /dev/bus/usb/BBB/DDD -t 1 -c 128 -s 1024 -v 512 # bulk write sudo testusb -D /dev/bus/usb/BBB/DDD -t 2 -c 128 -s 1024 -v 512 # bulk read宿主机侧要求usbtest内核模块CONFIG_USB_TEST、由内核tools/usb/testusb.c构建的testusb二进制、以及 sudo 权限usbfs ioctl 驱动 bind/unbind。四、修复错误的 profile模块重载而不是 remove_id/sys/bus/usb/drivers/usbtest/new_id列表只显示cafe 4010永远看不出它背后的能力 profile一个已绑定的接口会保留它被 probe 时的 profile。错误 profile 的症状比如用户态 profile0525 a4a4用例 14/21、25/26、15/16/22/23 全部 NOTRUN而 bulk 用例通过且dmesg会点名 probe正确的 probe 名是Linux gadget zero。修复方法是在预留的空闲机上重载模块remove_id单独使用会让所有已绑定接口停留在旧 profile 上按 hil 技能的机群级规则整群预留该命令及其 per-host 配置陷阱归 hil 技能所有确认锁已持有、且没有testusb/usbtest.py在运行。sudo modprobe -r usbtest然后sudo modprobe usbtest。若卸载被拒绝说明仍有接口在使用找到持有者并等待绝不要强制卸载。注册正确条目下一次usbtest.py或hil_test.py运行会自动完成。用dmesg验证下一个枚举的板子出现Linux gadget zeroprobe然后释放。五、移植阶梯新 MCU/DCD 到 30/30把一块新 MCU/DCD 跑满整套电池按层次推进每层干净后才升 Tier且每层之后都跑完整电池不是只跑本层新增用例Tier 1bulk置USBTEST_TIER 1先做到枚举成功 用例 0、9、10EP0 1–8、17–20、27、28 稳定。EP0 正确性优先——一切其他结果都通过它上报。Tier 2ctrl_out 14/21、Tier 3interrupt 25/26、Tier 4iso 15/16/22/23——逐层提高。端点适配Tier 4 需要 6 个端点 EP0。小容量器件需要在示例自己的 usb_descriptors.hUSBTEST_INT/ISO_EP_MPS_FS和 tusb_config.hCFG_TUD_VENDOR_TX_EPSIZELPC11/13 因 2 KB USB RAM 降到 512里做 per-MCU mps/epbuf 覆盖参考现有 CH32/LPC11 模式。实在装不下的部件进 skip.txt。签核 可靠性不是一次通过3–10 次完整的 烧录→电池 循环。一次 30/30 在不稳定 bring-up 上说明不了任何问题确定性的部分丢失计数例如恰好 1/8 丢失是特征签名而非噪声——要追查。在 test/hil/tinyusb.json 注册板子让 HIL 套件开始跑它。六、用例 → DCD 子系统映射表这是定位问题的核心索引。任何用例失败先看它压测的是哪条 DCD 路径失败用例压测内容第一怀疑对象9, 10EP0 控制风暴EP0 状态机、ZLP/状态阶段、负载下的控制饥饿1–8, 17–20, 27, 28bulk source/sink、sg、perfFIFO 处理、多包传输、ZLP 容忍度11, 12, 24URB 传输中途 unlinkabort/close 路径留下半武装状态13set/clear haltstall 必须杀死传输已武装 IN 上的 halt 必须冲刷 TX FIFO29在已武装、未 halt的端点上 clear-halt经典坑dcd_edpt_clear_stall复位 toggle 但解除武装了已排队的接收 → 永久 NAKerrno 110。修复toggle 复位到 DATA0并且重新武装/保留挂起的传输。曾在 rp2040、fsdev、ch32_usbhs、rusb2 上独立发现14, 21vendor EP0 写/读回多包 control-OUT 分块、DCP 流控25, 26interrupt src/sinkbulk 通了之后通常就免费15, 16, 22, 23isochronous见下节 ISO 规则七、ISO 规则最常被违反的契约等时端点是这套电池里被违反最多的约束FS 下双向都只允许 DATA0——绝不要在 iso 端点上跑 bulk 式 toggle 逻辑手工 toggle 的部件跳过 iso IN 的 ISR toggle 翻转以及 iso OUT 的 toggle 失配丢弃。违反的症状恰好每隔一个包丢失。无握手——iso 从不 NAK/STALL带响应字段的部件使用其“无响应”编码例如 WCH 上的 NYET。dcd_edpt_iso_alloc/iso_activate绝不能是返回 false 的桩——usbd 会因此让接口 open 失败内核报 did not bind/SET_CONFIG 超时。如果 DCD 以“硬件不支持”拒绝 iso以数据手册为准——手册高于代码注释本仓库树里两条“无 iso 支持”声明都是假的其中一条参考手册只对某个端点号记载了例外。多包 iso IN 提交是合法的DCD 每帧流送一个包在 ISR 中重新填充。慢速核可能需要双缓冲 iso 才能赶上帧截止时间CH32V20X fsdev 只有 512 B PMAtusb_config.h中通过CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP 1开启双缓冲同时描述符把 iso mps 降到 32 以保持 2×3264 B/端点 的 PMA 预算。八、调试阶梯从 errno 到根因8.1 errno 速查errno含义110超时——端点永久 NAK / 设备楔死32EPIPE——意外 STALL5EIO——iso 包错误查dmesgN errors out of M71EPROTO——设备应答错误/太慢在 HC 重试之后8.2 Step 0读用例到底在做什么内核模块是ground truth映射表只是摘要。在任何理论化之前——也总是在判断一个 HUNG 用例是否可恢复之前——先读内核源码。获取与运行机内核匹配的上游版本uname -r发行版打了自己的补丁时用发行版源码curl --fail -sSO https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/plain/drivers/usb/misc/usbtest.c?hv$(uname -r | sed -E s/^([0-9.](-rc[0-9])?).*/\1/; s/\.0(-|$)/\1/) # 在运行机上执行x.y.0[-rcN] 对应 tag vx.y[-rcN]用例 N 位于内核usbtest_do_ioctl()的case N:下内核tools/usb/testusb.c映射这些标志-c param.iterations-s param.length-g param.sglen含义并不像字面那样。注意 ABI 名Debian ≤12 的6.1.0-18-amd64、Ubuntu 原装6.8.0-45-generic映射到 vx.y所以要从/proc/versionDebian或/proc/version_signatureUbuntu读真实版本Fedora6.14.0-0.rc3…或 Ubuntu-mainline6.12.0-061200rc3-…的 rc 内核会隐藏其-rcN需手工补上 tag。两个实战判读示例技能文档中的精确记录真实流量与通过标准用例 24 在-c 256 -s 1024 -g 8下是 256 轮、每轮 8 个 bulk-OUT URBunlinkurbs[num-4]/urbs[num-2]要求这两个返回-ECONNRESET、其余 6 个正常完成——不是标志看起来的“256 个 URB”。等待是否有界——决定可恢复性simple_io用wait_for_completion_timeout内核 :481unlink 路径用裸的wait_for_completion内核 :1502、:1615。设备在那里 stall 会把 ioctl 永久卡在D 状态——它持有设备锁没有任何办法恢复它见 usb-kernel-recover 技能The terminal case。先知道这一点能避免你把整台机器烧在注定无用的尝试上。8.3 定位 DCD 路径按序升级usbtest.py的逐用例输出 捕获的dmesgTEST n标记括住每个用例。usbmonusb-kernel-debug 技能URB 级 ground truth。它看不到 data toggle 或 NAK——toggle 失步和端点已死看起来一模一样有 Submits 无 Completes要在设备侧用 GDB 区分。设备侧诊断在原始失败用例上跑target-debugEspressif 用esp-target-debug。对照参考手册read-doc技能再动任何寄存器级代码——按 CLAUDE.md因为 DCD 里的注释/假设对硬件能力可能一直是错的。尽早查厂商硅片 errata中的时序/DMA 挂起一个未实现的 erratum 工作区曾在某端口造成 case-10 挂起。九、能通过 gcc/桌面审查、却在他处翻车的陷阱TUD_OPT_HIGH_SPEED是编译期能力不是实时速度FS 配置描述符以及 OTHER_SPEED即使在 HS 构建上也必须用 FS 合法尺寸int ≤ 64iso INOUT ≤ 1023 B/帧——使用独立的_FS/_HS描述符宏。未使用的static inline辅助函数clang 的-Wunused-function和 IAR 的Pe177会报错而 gcc 保持安静 → 加TU_ATTR_UNUSED。只在裸 asm 里引用的符号对 LTO 不可见会在-fltomake 构建中被丢弃 → 保留一个TU_ATTR_USED的 C 引用。带硬件上下文栈QingKe HWSTK的核上嵌套 USB 中断普通__attribute__((interrupt))会破坏返回 → 使用依赖硬件栈的 naked 处理函数。专用 USB RAM 预算PMA/USB-RAM随器件和构建系统段放置而异查链接映射表而不只是“能编译”。十、红旗停下来重新审视“跑通一次就算完事” → 跑多次重新烧录循环。“DCD 注释说硬件不支持” → 打开数据手册。“usbmon 看不出 toggle 问题” → usbmon 本来就看不到 toggle。“gcc 上没问题” → clang/IAR/LTO/make 还没验证。“修好了 iso IN” → 对 iso OUT 应用同样的豁免toggle 逻辑是对称的。单板干净运行不代表并发/机群行为正确——机群运行每台宿主控制器最多 2 个电池HIL_USBTEST_PARALLEL外加同一 hub 上行的并发烧录单板永远不会压到这些。凭用例名或表格行推理 → 打开usbtest.c第 8.2 节的 Step 0。标志含义与表象不符且可恢复性是那个用例的 wait 的属性不是机器的属性。十一、继续深入仓库内的相关资源固件实现examples/device/usbtest/src/main.c、usb_descriptors.c、usb_descriptors.h、tusb_config.h固件使用说明与完整用例表examples/device/usbtest/README.md主机运行器test/hil/usbtest.pyHIL 编排test/hil/hil_test.py烧录与锁test/hil/hil_flash.py、test/hil/helper/hil_lock.py板子注册表test/hil/tinyusb.json配套技能机群预留与并发规则见 .claude/skills/hil/SKILL.md内核侧楔死恢复见 .claude/skills/usb-kernel-recover/SKILL.md掌握这套电池后你会获得一套可复现的“30/30 全绿”签核标准它既是新 DCD bring-up 的验收门槛也是任何 DCD 改动后回归的可靠性底线。赞分享嵌入式驱动开发通信物联网【免费下载链接】tinyusbAn open source cross-platform USB stack for embedded system项目地址https://gitcode.com/gh_mirrors/ti/tinyusb点击查看免费下载相关推荐Plate 项目 Lexical 测试收割用可移植测试索引驱动 Slate v2 行为移植Plate 项目 Lexical 测试收割用可移植测试索引驱动 Slate v2 行为移植 导读 本文讲解 plate 仓库中 docs/editor tes前端富文本UI组件如何把自己的 PC 游戏串到任何屏幕上自托管串流主机 Sunshine 完整指南如何把自己的 PC 游戏串到任何屏幕上自托管串流主机 Sunshine 完整指南 Sunshine 是一款跑在自家游戏 PC 上的自托管游戏串流主机它用硬件音视频后端Semaphore 项目备份与恢复实战TC-008 测试用例驱动的数据可移植性指南Semaphore 项目备份与恢复实战TC 008 测试用例驱动的数据可移植性指南 本文以 Semaphore 开源仓库中的功能测试用例 TC 008项目备后端DevOps任务调度认证鉴权上一篇Superpaper终极指南免费跨平台多显示器壁纸管理神器让你的桌面视觉体验飙升下一篇终极跨平台macOS系统镜像获取方案gibMacOS深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Claude Code 与 CC Switch 安装使用:TaoToken 统一 Key 接入配置实战 2026/9/29 6:57:15

Claude Code 与 CC Switch 安装使用:TaoToken 统一 Key 接入配置实战

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

阅读更多 →
GSD Core 1.15.0 版本解析:bracket 阶段 ID 迁移、compact-content 上下文压缩与规划文档统一写路径 2026/9/29 6:57:14

GSD Core 1.15.0 版本解析:bracket 阶段 ID 迁移、compact-content 上下文压缩与规划文档统一写路径

【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 点击查看 免费下载 GSD Core(Git. Ship. Done)在 2026-09-26 发布的 1.15.0 版本中,围绕「阶段标识符规范化」「规划文…

阅读更多 →
【人工智能通识专栏】第一讲:LLM的发展历程——从Transformer到DeepSeek的TaoToken配置实践 2026/9/29 6:57:14

【人工智能通识专栏】第一讲:LLM的发展历程——从Transformer到DeepSeek的TaoToken配置实践

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

阅读更多 →
告别低效开发!深度体验 MonkeyCode:企业级 AI 编程基础设施的破局之道 2026/9/29 6:57:14

告别低效开发!深度体验 MonkeyCode:企业级 AI 编程基础设施的破局之道

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

阅读更多 →
New Phytologist 投稿指南:用 TaoToken 统一 Key 搭好投稿前配置检查清单 2026/9/29 6:57:14

New Phytologist 投稿指南:用 TaoToken 统一 Key 搭好投稿前配置检查清单

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

阅读更多 →
个人开发者LLM全流程实战:从预训练到RAG的完整指南 2026/9/29 6:57:07

个人开发者LLM全流程实战:从预训练到RAG的完整指南

最近不少读者私信问我一个问题:个人开发者到底能不能跑通 LLM 的完整链路?这里说的完整链路,不只是用开源的 ChatGLM、Qwen 或 LLaMA 做做推理,而是从数据准备、词表训练、预训练、领域继续训练,再到 SFT、偏好对齐、检…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉