Jetson Nano C++ GPIO实战:libgpiod库选型、引脚映射与避坑指南
简介Jetson Nano的GPIO库是一套基于C/C的硬件控制开发包面向嵌入式开发者与AI边缘计算爱好者用于通过GPIO接口控制LED、传感器等外围设备解决Linux系统下引脚访问与编程的入门难题。资源完整包含库源码、头文件、示例、CMake配置、Docker部署文件及安装文档共68个文件以cpp和h源文件为主另有md、txt、yml等辅助材料压缩包仅106KB轻量易携带。已有856人学习下载适合希望深入掌握Jetson Nano引脚操作和Linux GPIO子系统的开发者。内容涵盖GPIO基本概念、Jetson Nano引脚结构、GPIO库调用流程以及多线程同步等注意事项附带简单输出、PWM、按钮中断、事件监听等典型例程便于读者对照实践同时提供单元测试和Docker环境可快速验证程序并迁移至不同部署场景。1. Jetson Nano的GPIO库为什么同一份C程序在这块板子上不灵把树莓派上跑惯了的点灯程序原封不动搬到Jetson Nano我第一个反应是“怎么没反应”。同样是物理引脚13树莓派上对应的是wiringPi的0号口在Jetson上却要先过一遍内核编号再到芯片line number中间还隔着一个可能被复用成I2C或SPI的Pinmux状态。真正解决这个问题靠的不是某一段网上复制的代码而是把这条板卡的GPIO库选型、引脚映射规则和C操作方式一起捋顺。这份资源应用笔记我就按“选型→环境→实操→避坑”来写适合两类人一类是从树莓派迁移过来、觉得引脚号对不上就抓狂的应用开发者另一类是项目里必须用C直接控制外设、不想依赖Python解释器的嵌入式工程师。2. 库选型与底层原理sysfs为什么被边缘化C该站哪一边2.1 引脚编号体系的差异从物理引脚到内核line numberJetson Nano引出的是40pin物理排针但它不像树莓派那样把引脚号按物理位置线性排列。它的GPIO来自Tegra系列芯片内部多个bank每个bank有32个编号位物理引脚和内核编号之间需要查原理图上的映射表。更麻烦的是内核在不同时期暴露给用户态的方式不一样。旧方案是sysfs也就是通过 /sys/class/gpio 下的 export 和 unexport 文件逐个操作引脚。这种写法在树莓派、各种开发板上流传最广很多老教程还在用。但内核从4.8左右开始就把sysfs GPIO接口标记为deprecated官方维护者多次建议迁移到字符设备接口。sysfs的问题在于“全局编号”你要先算出当前引脚在内核全局编号体系里是gpio216还是gpio498这一层换算出错率极高。比如同样一块板卡不同设备树版本、不同启动参数下同一物理引脚的全局编号都可能变化。我当年跨板卡移植一个温控器程序就在这上面卡了两天最后发现不是代码问题是编号表拿错了。新方案是libgpiod它直接面向 /dev/gpiochip0 这类字符设备节点库内部把引脚抽象成“line”操作时使用line number即该GPIO chip内的偏移量。这个偏移量与具体chip绑定不再需要全局编号定位引脚的误差小得多。C程序里链接libgpiod绕开了sysfs那些读起来像“文件系统改配置”的别扭写法API是正统的数值读写函数也方便做错误码判断。从长远维护看选字符设备方向是对的。2.2 C环境下的库对比libgpiod、sysfs与寄存器直写我在C项目里实际评估过几种操作GPIO的方式简单对比方案用户态入口编号定位方式C友好度适用场景sysfs/sys/class/gpio内核全局gpio编号一般且被标记废弃维护老系统、临时调试libgpiod/dev/gpiochipX字符设备chip内line number高提供完整C接口与命令行工具新内核、C/C正式项目Python扩展库基于libgpiod的Python封装物理引脚映射低C无官方对应快速验证电路、单次实验寄存器直写/dev/mem映射寄存器bankbit高但需自己搞定Pinmux高频操作、深度定制常见做法是选libgpiod。系统自带的Python扩展库虽然把引脚映射写成了物理号很省心但它没有官方C绑定而寄存器直写对于普通业务来说风险太高一个地址错位就可能把整个总线带崩。libgpiod提供的是标准C APIC可以直接调用同时附带gpiodetect、gpioinfo、gpioset、gpioget这批命令行工具调试阶段查引脚状态很方便。我自己的习惯是用原生C API再包一层尽量少引第三方封装因为这块板卡的生态更新快拉进来一个没人维护的封装库到时候内核一变反而是负担。选型时还要看另一个点中断支持。sysfs的边沿触发需要自己操作polllibgpiod直接提供了事件等待接口这对C程序来说更直观后续章节的代码会体现这一点。3. 环境准备与库安装把板卡状态调到“可编译”3.1 检查设备节点与内核版本先确认gpiochip存在拿到新板卡先别急着写代码先确认内核里GPIO字符设备节点已经暴露出来。Jetson Nano刷完官方出厂系统后一般在 /dev 下会有两个gpiochip节点分别对应不同的GPIO控制器。先执行一条命令看看ls -l /dev/gpiochip*正常输出类似crw-rw---- 1 root gpio 254, 0 Jul 3 10:22 /dev/gpiochip0 crw-rw---- 1 root gpio 254, 1 Jul 3 10:22 /dev/gpiochip1这里看两个信息第一设备节点存在第二用户组是gpio这意味着当前用户如果不在gpio组里后续打开chip就会报权限错误这一点在避坑章节我会专门说。接下来再看一下内核和工具链cat /proc/device-tree/model g --version如果g不存在说明这个出厂系统连编译链都没装全后面CMake工程肯定编不过。常见做法是先补基础工具sudo apt update sudo apt install -y build-essential cmake libgpiod-dev gpiodlibgpiod-dev是C/C开发所需的头文件和动态库gpiod是命令行工具集两个都要装。装完后用gpioinfo快速扫一遍chip0的每条line确认引脚有没有被别的驱动占用这一步比直接写代码更省钱。3.2 搭建CMake工程模板把C编译参数固定下来我一般会为每块板卡建一个固定模板避免每开一个新项目都重写CMake。最小可用的CMakeLists.txtcmake_minimum_required(VERSION 3.10) project(gpio_demo) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(PkgConfig REQUIRED) pkg_check_modules(GPIOD REQUIRED libgpiod) add_executable(gpio_demo src/main.cpp) target_link_libraries(gpio_demo ${GPIOD_LIBRARIES}) target_include_directories(gpio_demo PRIVATE ${GPIOD_INCLUDE_DIRS})重点在pkg_check_modules这一行。libgpiod安装后自带pc文件pkg-config能直接查出头文件路径和链接参数。不这样做的话你可能会忘了加 -lgpiod编译时头文件能找到链接时一堆undefined reference。然后写一个最简main.cpp验证链路#include gpiod.h #include cstdio int main() { struct gpiod_chip *chip gpiod_chip_open_by_name(gpiochip0); if (!chip) { perror(gpiod_chip_open_by_name); return 1; } printf(chip line count: %u\n, gpiod_chip_num_lines(chip)); gpiod_chip_close(chip); return 0; }这段代码只做一件事打开gpiochip0并打印line数量。gpiod_chip_num_lines返回的是这个chip支持的引脚总数一般GPIO控制器是32的倍数。如果open失败先检查设备节点名是不是gpiochip1不同批次板卡索引可能不一样改成gpiod_chip_open_by_number(0)也可以绕开名字差异。4. C GPIO库实战输出、输入、中断与PWM的完整闭环4.1 输出高电平控制LED输入读取按键状态先写一个最实用的例程一个输出引脚控制LED闪烁一个输入引脚读取按键状态。注意代码里的4和3不是物理引脚号而是line number实际值要用板卡原理图或gpioinfo确认。#include gpiod.h #include cstdio #include unistd.h int main() { struct gpiod_chip *chip gpiod_chip_open_by_name(gpiochip0); if (!chip) { perror(open chip failed); return 1; } struct gpiod_line *led gpiod_chip_get_line(chip, 4); if (gpiod_line_request_output(led, app-led, 0) 0) { perror(request led output failed); gpiod_chip_close(chip); return 1; } struct gpiod_line *btn gpiod_chip_get_line(chip, 3); if (gpiod_line_request_input_flags(btn, app-btn, GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP) 0) { perror(request btn input failed); gpiod_line_release(led); gpiod_chip_close(chip); return 1; } for (int i 0; i 10; i) { int key gpiod_line_get_value(btn); gpiod_line_set_value(led, key ^ 1); usleep(200 * 1000); } gpiod_line_release(led); gpiod_line_release(btn); gpiod_chip_close(chip); return 0; }这里有个细节输入引脚用了GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP开启内部上拉。Jetson的引脚在悬空时电平非常飘不加上拉读回来的数据就是玄学一会儿0一会儿1。逻辑上这段程序是“按键按下时LED亮”因为按键接地会把上拉拉低取反后输出1。gpiod_line_set_value的第二个参数就是电平值0或1没有第三个状态这一点别被某些框架的三态写法带偏。release顺序也有讲究先释放自己申请过的line再关闭chip养成习惯防止后续函数复用chip时句柄冲突。4.2 PWM与中断硬件资源有限参数别想当然libgpiod只管数字量读写PWM不归它管。Jetson上硬件PWM通道数量很少我手上这块板卡40pin排针里真正支持硬件PWM的物理引脚只有两个默认还被其他功能占用。所以PWM部分我一般走sysfs的pwm接口注意这里不是GPIO的sysfs而是内核pwm子系统的 /sys/class/pwm。操作方式#include fcntl.h #include unistd.h #include cstring #include cstdio int main() { const char *base /sys/class/pwm/pwmchip0; char path[128]; int fd open(/sys/class/pwm/pwmchip0/export, O_WRONLY); if (fd 0) { perror(open export); return 1; } if (write(fd, 0, 1) 0) { perror(write export); close(fd); return 1; } close(fd); snprintf(path, sizeof(path), %s/pwm0/period, base); fd open(path, O_WRONLY); write(fd, 2000000, 7); // 周期 2ms对应 500Hz close(fd); snprintf(path, sizeof(path), %s/pwm0/duty_cycle, base); fd open(path, O_WRONLY); write(fd, 1000000, 7); // 占空比 50% close(fd); snprintf(path, sizeof(path), %s/pwm0/enable, base); fd open(path, O_WRONLY); write(fd, 1, 1); close(fd); return 0; }这里的单位是纳秒不是百分比。period是2000000ns即2msduty_cycle 1000000ns即50%占空比。很多人第一次写都会把这两个当成0~255的占空比寄存器结果输出就是乱的。另外这个pwmchip0节点在默认系统里可能根本没导出来如果open export失败要去设备树里确认PWM控制器是否使能这部分属于系统级配置不是用户态代码能解决的我会在避坑章节单独讲。中断部分用libgpiod的事件接口比轮询干净得多#include gpiod.h #include ctime int main() { struct gpiod_chip *chip gpiod_chip_open_by_name(gpiochip0); struct gpiod_line *line gpiod_chip_get_line(chip, 3); if (gpiod_line_request_rising_edge_events(line, event-button) 0) { perror(request event failed); return 1; } struct timespec timeout {5, 0}; struct gpiod_line_event ev; int ret gpiod_line_event_wait(line, timeout); if (ret 0) { gpiod_line_event_read(line, ev); printf(event type: %d, time: %ld.%ld\n, ev.event_type, ev.ts.tv_sec, ev.ts.tv_nsec); } else if (ret 0) { printf(wait timeout\n); } else { perror(wait failed); } gpiod_line_release(line); gpiod_chip_close(chip); return 0; }gpiod_line_event_wait阻塞等待边沿事件timeout传NULL就是永久等待。返回1表示有事件0表示超时。注意事件读取是一次性的读完要再调用wait才会进入下一轮这个状态关系要理清。gpiod.h对C是兼容的不需要额外extern C但要确保链接的是libgpiod的so。5. GPIO库实战避坑指南权限、复用与悬空三处翻车总结5.1 设备节点能ls一调用就Permission denied现象程序编译通过gpiod_chip_open_by_name也成功了但执行gpiod_line_request_output时报Permission denied。原因当前Linux用户不在gpio组里。虽然 /dev/gpiochip0 的组权限是gpio但你登录的用户没有加入这个组内核open设备节点放行后续ioctl申请line时被拒绝。表面看是设备节点权限问题实际是用户组缺失。解决sudo usermod -aG gpio $USER然后注销重新登录或者临时用sudo运行程序。不建议整个服务长期挂sudo工程化项目要在部署脚本里把用户加组这一步做掉否则换一台板卡又得重新排查。5.2 同一个引脚又当显示又当GPIOPinmux状态没切过来现象程序正常跑没有报错但用电表量物理引脚电平完全不对有的引脚甚至和显示器抢信号。原因Jetson的40pin排针大量引脚是复用功能默认设备树里可能配成HDMI、I2C或SPI而不是纯粹GPIO。用户态程序操作的是GPIO控制器但物理引脚还被Pinmux复用控制器锁在别的功能上电平自然出不来。解决在烧录系统阶段就要用板卡配置工具把目标引脚显式设为GPIO重新生成设备树再烧写或加载。这个配置属于系统层重刷系统会丢所以要写进部署文档。日常调试时可以用gpioinfo看line的label如果显示被其他driver占用基本就是Pinmux没切。5.3 输入悬空读回来像乱跳电平浮动不是玄学现象按键没按下程序读到1过了一会儿又读到0没有任何规律。原因输入引脚悬空时电平受周围走线、手指甚至空气湿度影响芯片内部没有默认上下拉。我碰到过最夸张的是程序读到的值和用手碰一下杜邦线完全联动。解决用gpiod_line_request_input_flags带上拉或下拉参数。按键一端接地就配PULL_UP一端接电源就配PULL_DOWN。除了代码层面还要检查外部电路有没有接10k左右的上拉/下拉电阻内部上下拉一般几十k欧抗干扰能力不如外部电阻。5.4 快速连按按键中断事件丢了一半现象用中断接口检测按键慢按没问题快速连按只触发一次。原因边沿事件中断没有软件消抖按键机械抖动会产生大量毛刺高频率事件挤在同一条line上库内核态缓冲有限来不及全部上报就丢了。解决在硬件上并一个0.1uF电容软件上做消抖收到第一次事件后短时间内丢弃后续事件比如20ms。实际项目里还可以改成记录事件时间戳在业务逻辑层做逻辑判断而不是依赖每一次中断都触发一个完整流程。5.5 换了一块板卡之前的line number全废现象同一套代码在A板卡上运行正常换到B板卡后带动的是完全不同的引脚甚至烧错外设。原因不同批次或不同系统镜像设备树里GPIO控制器的索引和引脚复用定义可能有差异line number不是绝对物理引脚号。最典型的例子是GPIO chip0和chip1在不同镜像下负责的bank不同。解决整个工程的引脚号不散落在业务代码里统一用一个配置表维护启动时加载。每块板卡在Bring-Up阶段先跑一遍本章第4节的回环程序把实际映射打印出来和原理图对照确认后再固化配置。6. 进阶用法用C封装一个GPIOManager单例做回环自检业务代码和硬件引脚管理混在一起是移植性差的根源。我后来的习惯是封装一个GPIOManager单例把chip生命周期、line申请与释放统一管起来业务模块只传逻辑名。大致接口设计class GpioManager { public: static GpioManager instance(); bool init(const char *chipName); bool writeLine(int line, bool value); bool readLine(int line); bool requestLine(int line, int flags, const char *label); private: GpioManager() default; ~GpioManager(); GpioManager(const GpioManager ) delete; GpioManager operator(const GpioManager ) delete; struct gpiod_chip *chip_; };单例模式对GPIO这种全局硬件资源是合理的避免多个模块各自打开chip造成同一line被重复申请而互相踢掉。init里固定调用gpiod_chip_open_by_name失败时打印chipName方便启动阶段快速定位设备节点是否变化。每个业务模块requestLine成功后管理内部记录一个申请列表析构时统一释放程序异常退出也不至于让line一直占着。回环自检是这个封装最划算的验证方法把某根输出line和某根输入line用一根杜邦线短接然后依次翻转输出电平读取输入电平做比对。gpioset gpiochip0 41 gpioget gpiochip0 3按常规命令行工具的使用方式gpioset把line4拉高gpioget读line3如果杜邦线接对了返回值是1然后gpioset 40再读line3得到0。这样一组对照下来输出通路、输入通路、上下拉配置、Pinmux状态全部验证完。比拿示波器逐个小信号量快得多。从那以后我每次给新板卡写C GPIO程序都强制先走一遍这个流程gpioinfo看map回环自检验证通路再进入业务编码。整套流程走完后面踩的坑能少一大半。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

单片机MD5校验原理与移植避坑:从资源适配到固件升级实践

单片机MD5校验原理与移植避坑:从资源适配到固件升级实践

简介:面向瑞萨、ST及上海东软等常见MCU平台,这套MD5加密源码为单片机开发者提供了可直接移植的哈希算法C实现,适用于数据完整性校验、密码存储与防篡改等嵌入式安全场景。压缩包仅含1个C源文件和1个头文件,整体约3KB,结…

2026/10/16 20:18:48 阅读更多 →
Delphi转C# 4.0迁移实战:类型映射、工具选型与避坑指南

Delphi转C# 4.0迁移实战:类型映射、工具选型与避坑指南

简介:Delphi2CS 4.0 是一款将 Delphi 代码转换为 C# 代码的实用工具,主要面向需要做旧项目迁移、跨语言重构的开发者,尤其适合手上积累了大量 Delphi 源码、希望低成本转向 .NET 技术栈的中高级程序员。该版本在原有基础上做了关键调整&#…

2026/10/16 20:18:47 阅读更多 →
Spring AI Alibaba停更后Java AI集成重构指南

Spring AI Alibaba停更后Java AI集成重构指南

1. 项目概述:当一个生态组件悄然退场,开发者真正该焦虑的是什么? “Spring AI Alibaba已停更了,Java还有希望吗?”——这句话最近在几个技术社区里反复刷屏,语气里带着点调侃,又透着真实的困惑…

2026/10/16 20:17:47 阅读更多 →

最新新闻

AI辅助专著写作:五步工作流与工具选型实战

AI辅助专著写作:五步工作流与工具选型实战

写一本专著和写一篇深度长文,完全不是一个量级的事。文章可以靠一个灵感撑起来,专著却要面对几十万字的结构、海量文献、前后一致的专业表达、动辄一年的写作周期。最近两年,AI辅助写作的工具成熟了不少,我也帮几位作者朋友系统梳…

2026/10/17 3:05:44 阅读更多 →
AI辅助专著写作实战:从工具选型到六步流程全解析

AI辅助专著写作实战:从工具选型到六步流程全解析

一、掌握AI专著写作秘诀!超实用工具推荐,轻松打造专业著作说实话,第一次用AI辅助写专著的时候,我心里是犯嘀咕的。那时候我手头压着一本面向行业从业者的技术专著,前前后后拖了快一年,大纲改了六版&#xf…

2026/10/17 3:05:44 阅读更多 →
基于YOLO的商品标签识别:从数据标注到模型部署的完整实战指南

基于YOLO的商品标签识别:从数据标注到模型部署的完整实战指南

先聊一下这个项目为什么值得做。我接触过好几个零售客户的真实需求:门店每天要核验货架上的价签是不是和后台价格一致,促销签有没有过期,生鲜商品的产地标签有没有贴错。这些工作靠人眼去扫,一家几十平方米的店也要耗掉一两个小时…

2026/10/17 3:05:44 阅读更多 →
AI/ML论文精读方法论:从三遍阅读到知识网络

AI/ML论文精读方法论:从三遍阅读到知识网络

读 AI/ML 论文这件事,我踩过的坑比大多数人想象得多。刚开始那半年,我也学别人每天在 arXiv 上刷几篇,收藏夹里存了上百个标题,可到了年底复盘,真正能讲清楚“这篇解决了什么问题、为什么这样解决”的论文,…

2026/10/17 3:05:44 阅读更多 →
AI辅助专著写作全流程指南:工具选型与避坑方法

AI辅助专著写作全流程指南:工具选型与避坑方法

这两年我前前后后帮人看的书稿少说也有七八本,自己也从头到尾跑过几轮从选题到出版的完整流程。每次聊到AI专著写作,大家的反应总是很两极:有人觉得这就是“输入一个书名,第二天导出全书”的魔法;有人觉得AI写出来的东…

2026/10/17 3:05:44 阅读更多 →
从LLM到Agent的AI测试:八项核心技术体系与工程实践

从LLM到Agent的AI测试:八项核心技术体系与工程实践

上周我接了一个客服Agent的回归任务,改动内容其实很小——只是把系统提示词里的一段话换了个措辞。结果同样的测试用例,前一轮通过、这一轮失败。而且失败原因非常刁钻:模型回答本身是对的,但它对工具返回的一个异常订单号进行了“…

2026/10/17 3:04:44 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →