Apollo-11飞行计算机拆解:嵌入式实时系统的优先级调度与优雅降级
“Apollo-11”这个代号一出来做嵌入式、做过程控制、做现场联调的人脑子里大概率会闪出同一个画面资源少到离谱但任务重到压头。这不是一次单纯的“人类壮举”更是一套后来被反复拆解的工程样本——一台存储容量以“KB”为单位、运算速度在“MHz以下”级别的飞行计算机要实时完成导航、姿态控制和着陆决策。它要同时面对三重死约束硬件冻结之后不能再改发射窗口不会被任何团队推迟软件模块之间还互相咬合。接下来这段复盘我会从系统工程、软件可靠性和实操复现三个角度把 Apollo-11 拆成一份“可以照着思考”的工程笔记。适合做嵌入式、自动化、软件架构或项目管理的人看也适合对这套老系统纯粹好奇的朋友参考。1. 一个“几十年前的任务”为什么今天还要重新拆1.1 当年的工程约束有多变态先把最容易被今天的人忽略的部分摆出来那台计算机的内存总量按今天的眼光看大概只有一张普通手机照片的大小。主频和现在的电子表也不在一个量级但飞行器要靠这点算力完成的任务清单长得吓人——轨道计算、姿态控制、导航解算、发动机点火时序、显示刷新、键盘响应每一项都必须卡在严格的时间周期里完成。除了算力还有功耗、散热、重量、抗辐射和机械振动的限制任何一块电路板都要用最少的元件实现最多的功能。更要命的是通信延迟。地月之间的信号单程就要一秒多地面根本没法像今天飞无人机那样“实时遥控”。飞行器必须在局部把计算闭环完全跑完地面只能等遥测数据回传后再做粗粒度决策。所以在设计阶段所有工程师都默认一条铁律飞行器本身必须具备独立完成关键任务的能力地面团队只是辅助。这些限制逼出来的是一种非常“抠门”的工程风格每一条指令、每一个内存字、每一次中断响应都必须有明确用途。冗余是有的但绝不等于堆料。你在现代项目里很难再见到一个团队为了几十个字的内存占用去手写计算表但在那个年代这就是日常工作。1.2 为什么这些约束对现代程序员反而是财富很多人会觉得“几十年前的电脑这么弱研究它有什么参考价值”。恰恰相反今天的大多数系统开发都在算力过剩的环境里进行于是我们习惯用“加一层服务”“多开一个进程”“堆更多内存”来解决复杂性结果系统越来越臃肿出了问题越来越难看清楚因果链。研究 Apollo-11 是一次很好的“约束还原”它逼你区分一个系统里哪些逻辑是核心骨架哪些只是锦上添花。这套思路在今天特别适用的场景包括低功耗物联网节点、嵌入式控制器、无人机返航逻辑、机器人安全保护甚至金融系统里的低延迟模块。它们共同的特点是资源有限、延迟敏感、故障代价高。你不可能把所有功能都用最舒服的方式写完再指望硬件够快必须一开始就设计好调度优先级和失败降级路径。项目管理这块也能学到东西。它是一台软硬件同步冻结、功能互相咬合、测试窗口极其有限的系统很接近今天“硬件 固件 云端 运营”一起联调的大型项目。软硬件接口怎么提前锁定哪些功能必须提前 freeze哪些测试必须写在功能开发之前这些问题的答案那个年代的团队想得比很多人现在还要清楚。2. 指令舱计算机靠“急救逻辑”撑住的核心系统2.1 它不是“慢”而是每一步都在做优先级决策指令舱计算机最值得研究的一点是它的实时调度方式。它并不是一个“顺序执行完所有任务”的普通程序而是一个靠固定周期加中断驱动运行的实时系统。高优先级的中断可以随时打断当前正在做的低优先级工作就像急诊分诊台心跳骤停的病人一定排在普通感冒前面不是因为他先来而是因为他更危险。计算机内部的任务按重要程度和周期被分成了好几类姿态控制的更新频率最高因为它直接关系到飞行稳定性仪表显示的刷新频率可以低一点因为慢半拍人眼基本无感键盘输入则是突发事件必须通过中断立刻响应。每一类任务在调度表里占什么位置、能容忍多少延迟、被抢占之后什么时候补跑这些不是写代码时顺手决定的而是单独做了一张调度表反复测试和评审。这张调度表才是整个系统里最核心的“代码”。今天做实时嵌入式系统的人同样应该把精力重点放在任务周期和优先级设计上而不是一上来先写业务逻辑。你后来发现的所有“偶发性问题”绝大多数都可以追溯到优先级没有定清楚、某个任务超时拖累了整体。2.2 数据精度的“土办法”整数到底怎么算另一个让现代开发者惊讶的细节是那台机器几乎没有浮点运算能力所有计算都得用整数和定点数完成。为了表示角度、速度、位置这些连续量工程师要把物理量先按一定比例缩放成整数。比如把一圈 360 度映射到某个整数值范围内把三角函数做成查表或者多项式近似把积分写成固定步长的累加器。这套做法对算法设计的影响非常非常深。你在今天的开发环境里可以随手调用一个 sin() 函数但当时得先问自己角度范围到底多大、精度要多少位、累加误差会不会在十分钟后放大到不可接受。所有数值边界必须在动手之前就算清楚否则系统跑到一半溢出调试成本高到难以承受。这件事给今天的启发很直接不管你的 CPU 多快数值范围的边界和精度损失都该在设计文档里写清楚。我见过太多“功能正常但偶发出错”的案例最后查下来就是某个中间变量在某条分支上的取值超过了预期范围。看看老系统怎么做定点数换算能帮你提前躲开这类坑。2.3 过载不是崩溃而是一套“优雅降级”策略这里要说的是整个系统里最经典的设计之一当任务队列排满、主循环处理不过来时计算机并不会直接死机而是会进入报警状态把非关键任务挂起只保留跟导航、推进和控制直接相关的核心任务。这个思路用一个词概括就是“丢卒保车”——卒是显示、键盘响应这些次要工作车是着陆必需的制导和控制。当年月面下降过程中就出现过计算机报警航天员和地面控制团队通过遥测数据分析后发现关键导航数据仍然有效核心任务没有被影响于是迅速判断可以继续下降。这个案例后来被反复引用不是因为它“运气好”而是因为它示范了一个成熟系统的故障反应方式报警是状态摘要不是世界末日系统提前定义了“哪些功能可以放弃、哪些必须保留”所有人照着预案判断就行。现代分布式系统里的熔断、限流、服务降级本质上和这个思路一模一样。你不需要在故障发生时临时开会决定砍掉哪个功能而是应该在架构设计阶段就把“最小安全集”定下来电量低了砍什么、流量高了砍什么、硬件故障了砍什么。3. 从轨道到月面三个最值得学的关键判断3.1 什么人机分工最合理整个下降过程并非“全自动按一个按钮就完事”那么简单。它的流程分了好几个阶段前面是刹车减速段计算量大、对精度要求极高非常适合交给自动系统执行越接近月面情况越复杂传感器只能给你有限的信息程序员无法把“眼前这片区域看起来适不适合降落”写进判断逻辑所以必须由航天员观察确认。工程上一个特别重要的分层是自动系统运行的时候人类不是旁观者而是监督者一旦发现自动判断和实际情况不符人可以立刻切换程序、输入新参数或者改用手动控制。这里面的核心思想是自动化程度不是越高越好而是要在合适的位置留出人工接管路径。放到今天的项目里面比如辅助驾驶或者自动流水线道理完全一样。系统设计者必须提前回答人在什么时候需要介入、通过什么方式介入、介入后系统怎么确认控制权已经交接完成。这些问题如果不在设计阶段给出答案真出意外时人根本反应不过来。3.2 报警之后凭什么敢说“继续飞”那段历史里最戏剧性的瞬间之一就是下降过程中计算机反复报警。航天员的第一反应是向地面报告地面支持团队并没有简单回答“中止”或者“继续”而是快速调看遥测数据对照预先定义的报警含义确认核心导航和控制任务仍在正常运行才给出继续下降的指令。这件事对做监控和告警系统的人是一堂极好的课。报警本身不是“红灯”它是一条“状态摘要”系统在告诉你它采用了哪套降级方案、丢掉了哪些任务、保留了哪些任务。如果告警体系在开发时就把触发条件和业务影响绑定清楚那报警发生时的决策链路就会非常短反过来说今天很多系统把告警当成洪水每个指标波动都发一条消息值班人员只能麻木地忽略这种设计等于没有告警。所以我的建议是在做运维监控之前先花时间做一张《告警影响级别表》把每一条告警和“它到底影响了哪个核心业务”对应起来。判据要在事故发生前写清楚不要等报警响了再拉一群人去会议室猜。3.3 极简界面下的操作防错设计航天员面对的不是触摸大屏而是一个小小的数字键盘和一排数码管显示器。所有操作都被编码成“动词 名词”先告诉系统你要做什么再告诉系统对什么东西做。这种设计能让操作者必须明确自己的意图减少模棱两可的输入。为了防止误操作命令在执行前通常要经过显示确认某些关键步骤甚至需要二次操作。今天的命令行工具、自动化平台的审批流、双人复核机制本质上都是同一套逻辑给不可逆操作加一层确认。从交互设计上看越少的按键越需要在设计阶段做“误操作路径分析”。如果你只给用户三个按钮就必须提前想清楚每一种可能的按键组合会导致什么后果哪些组合需要在确认后执行哪些组合要直接禁用。这个思路放在当年是生死攸关放在今天至少能帮你的产品少挨几句骂。4. 实操把手痒变成“跑一遍老系统”4.1 准备跑一个开源模拟器很多朋友可能不知道社区里已经有基于当年飞行软件重建的开源模拟器项目。想亲手体验这套系统并不需要你真去拆一台古董硬件装一个纯软件模拟器就够了。开始之前先把编译工具链准备齐全常见的是 gcc、make 和 cmake不同项目要求不同以你找到那个仓库的文档为准。拉取源码之后一般就是三步配置、编译、运行。# 第一步获取源码 git clone https://example.com/agc/agc-sim.git cd agc-sim # 第二步构建具体命令以项目文档为准 mkdir -p build cd build cmake .. cmake --build . # 第三步启动 ./agc_sim程序启动后你会看到一个非常复古的界面一个类似老式终端的显示屏底部有数字键盘像是把一台航天仪表搬到了电脑窗口里。此时可以先让默认的飞行程序跑一会儿观察那些数字不断跳动的状态——你能直观感受到一个实时系统在“按节拍干活”的样子。4.2 假装我是当年的航天员发一条指令想真正和这套系统交互可以试试输入一条最简单的指令。操作方式一般是输入两位“动词”码再输入两位“名词”码然后按下执行键。我举个例子不同模拟器版本指令表有差异我只描述过程如果你输入“显示”类的动词码再输入“累计时间”类的名词码数码管就会切换显示当前任务运行时间。这里必须提醒一句不要乱试危险的动词码。有些组合会让虚拟计算机切到预点火或者发动机点火分支也许不会烧掉你的电脑但会把你当前模拟的任务状态带跑还得花时间复位。安全做法是先打开模拟器的帮助文档或“指令速查表”确认哪些是只读操作再动手输入。我自己的习惯是每次打开模拟器先跑一遍它的自带演示流程然后再手动发指令最后再尝试复位和重启。按这个顺序来能少踩很多“不知道自己在哪一步”的坑。4.3 亲手制造一次过载报警读再多的调度设计文档都不如亲眼看一次过载报警来得直观。你可以写一个简单的测试脚本快速连续地给虚拟计算机发请求或者不断请求各种显示任务让主循环的处理能力逼近上限。当负载超过阈值时显示界面上会出现报警状态同时你能观察到显示刷新类任务先被停掉但姿态控制和推进相关的任务仍然保持运行。第一次跑出这个效果的时候我是真的有点震撼的。你看到系统不是崩掉而是像一个熟练的调度员一样先把自己手里的活按轻重缓急重新排了一遍。这个体验比干读十篇论文都更能让你理解“优雅降级”到底是什么意思。注意模拟器在时间尺度上可能和真实系统不一样有的会比真实系统快很多有的会刻意模拟实时节奏。跑报警实验之前先看一眼文档里有没有相关说明否则你可能发现报警出现得比你预期快得多或者慢得多。4.4 自己改一版调度策略进阶如果你不满足于只是跑通可以试着改一改调度策略。真实的飞行代码结构很复杂但我们要理解的核心逻辑可以简化成类似下面的伪代码void scheduler() { while (1) { if (landing_radar_ready) { run_landing_radar(); // 最高优先级着陆雷达数据 } else if (attitude_control_ready) { run_attitude_control(); // 姿态控制 } else if (display_ready load_ok) { run_display_update(); // 仪表刷新优先级最低 } // 其他任务依次往下排 } }你可以改一版自己的实验程序把显示任务的优先级调高再加大负载看看姿态控制会不会被拖住然后把优先级改回去再对比一轮。通过这个改动你能亲手体会到调度表为什么是实时系统的灵魂。这只是教学实验别指望改两行代码就能让它变成真实飞控。但如果你正在学嵌入式实时系统这种“把优先级表改来改去、观察行为变化”的练习比背一万遍调度理论都有效。5. 复盘中的常见误解和踩坑记录5.1 “性能不够”是最偷懒的解释很多人把当年那段历史总结成“电脑太慢但运气好”。这个说法非常误导人。那段下降过程真正惊险的点不是算力不够而是系统在算力不够时依靠预先设计的优先级和降级策略仍然保住了核心功能。就像一支团队出问题时你只给他们换更快的电脑解决不了流程混乱和决策链路太长的问题。复盘系统故障时不要只把目光放在“性能”上。要看线程模型合不合理、降级策略有没有覆盖每一种主要故障、人对关键参数的判断依据是否清晰。性能不足只是众多原因之一设计决策才是更值得花时间研究的地方。5.2 “全自动着陆”是一个错误印象另一个容易误解的点是它并不算全自动着陆而是“分段自动化 人工监控”的协作。不同的飞行阶段自动化等级完全不同航天员既不是没事可做也不是全盘手动而是在关键节点负责观察判断和异常接管。如果你正在设计一套人机协作产品别把“自动”和“手动”当成非黑即白的选项。更合理的做法是把整个流程切成段落每个段落定义好自动化等级、人的职责、系统在什么条件下请求接管、人如何确认已接管。这是从那段飞向月面的过程中学到的非常实用的一课。5.3 模拟器实操中最常见的几个问题我在折腾模拟器的过程中也踩过不少没什么技术含量但很消磨耐心的坑整理成一张速查表问题现象可能原因解决办法编译报错缺少头文件本机依赖库版本太新或太旧对照项目文档安装标称版本依赖界面显示乱码终端编码或字体不对换成项目推荐的终端模拟器键盘输入没反应焦点不在虚拟面板上先点击面板窗口再输入命令不知道当前处于什么状态指令表没看熟优先查帮助文档里的状态诊断命令复位后任务状态异常退出前没有正常停机按文档先走复位流程再关闭窗口如果遇到上面的问题别急着怀疑模拟器坏了大概率是环境和操作顺序的问题。读文档永远是第一步而不是最后一招。5.4 把老系统的方法“翻译”到自己的项目里学了这么多最终还是要落在自己的项目上。这里我推荐一个适合练手的练习设计一台“电量有限”的无人小车。你要做的第一件事不是写驱动代码而是先画一张表电池电量不同区间下哪些功能必须保留哪些功能可以降级。正常电量时小车可以全速跑、可以传高清图电量降到中低阈值就要关闭图像传输、降低速度、优先执行返航路径规划电量再低一档进入强制返航模式不再响应遥控指令只执行安全停车停在指定位置后发送位置信息并等待充电。这张表做好之后再去实现调度逻辑。你会发现AGC 里那套“报警、降级、保核心”的思路放在今天的小项目上依然完全成立。6. 一点个人体会这些年我反复看 Apollo-11 相关的资料最震撼我的其实不是“做到了”而是在信息极度不完整、资源极度有限的情况下团队怎么定义问题、怎么分割责任、怎么提前准备失败路径。每次对比自己写代码的习惯我都会问一句如果明天上线时某个核心模块挂了系统会不会自动进入一个预先设计好的“最小安全集”如果答案是不会那说明我的优先级表还没写好。现在我做一个新系统的第一版设计时会先花时间列一张“丢什么、保什么”的表再开始写具体功能。功能可以迭代优先级和失败路径没法后期随便补。Apollo-11 留给工程世界最好的遗产不是某一台计算机而是这种把取舍做到极致的思维方式。工程不是功能的堆叠工程是约束下的选择。

相关新闻

PicX 图床技术详解:基于 GitHub API 的图片上传托管与链接生成实现

PicX 图床技术详解:基于 GitHub API 的图片上传托管与链接生成实现

开发工具前端 【免费下载链接】picx 🏞️ 一款基于 GitHub API 开发的图床工具,提供图片上传托管和生成图片链接。 项目地址: https://gitcode.com/gh_mirrors/pi/picx 点击查看 免费下载 PicX 是一款完全基于 GitHub API 开发的开源图床工具…

2026/10/15 2:17:17 阅读更多 →
Oracle DDL原样丢给MySQL必报错?KFS的结构化映射大法

Oracle DDL原样丢给MySQL必报错?KFS的结构化映射大法

在某大型医院的数据同步项目中,260条同步链路同时运行,源端涉及Oracle、MySQL、SQL Server、KES V8R6、Vastbase等10多种数据库,并持续向目标库汇聚数据。在这样的环境里,把数据同步过去并不难。真正让链路“卡住”的,…

2026/10/15 2:17:17 阅读更多 →
TensorFlow与Keras版本对应全攻略:避开环境配置陷阱

TensorFlow与Keras版本对应全攻略:避开环境配置陷阱

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

2026/10/15 2:17:17 阅读更多 →

最新新闻

Electron + Vue 项目结构搭建:主进程、渲染进程与IPC通信实践

Electron + Vue 项目结构搭建:主进程、渲染进程与IPC通信实践

我最早是在做一个后台管理系统的时候碰上了 Electron。当时需求很明确:系统本身是 Vue 写好的网页,但客户希望在 Windows 桌面上能直接双击打开、离线可用、还能调用一些浏览器里做不了的系统能力,比如文件拖拽和本地目录读写。如果单独做一套…

2026/10/15 2:49:27 阅读更多 →
生成函数在算法竞赛中的应用:解锁计数与递推难题

生成函数在算法竞赛中的应用:解锁计数与递推难题

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

2026/10/15 2:49:27 阅读更多 →
ASM1083数据表解读:PCIe转PCI桥片硬件设计与调试指南

ASM1083数据表解读:PCIe转PCI桥片硬件设计与调试指南

简介:ASM1083 PCIe转PCI芯片数据表面向硬件工程师、嵌入式开发者与主板维修人员,用于解决PCIe接口与传统PCI设备之间的桥接设计问题。该芯片由ASMedia出品,支持x1至x16多种PCI Express lanes,数据传输速率最高2.5Gb/s,…

2026/10/15 2:49:27 阅读更多 →
JUnitCore方法级运行为何比类级更慢?揭秘Runner生命周期开销

JUnitCore方法级运行为何比类级更慢?揭秘Runner生命周期开销

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

2026/10/15 2:49:27 阅读更多 →
U8g2单色屏图形库应用笔记:移植、中文显示与刷新提速

U8g2单色屏图形库应用笔记:移植、中文显示与刷新提速

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

2026/10/15 2:49:27 阅读更多 →
ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

本文适用版本:ESXi 7.0 U3 → 8.0 U2 升级场景(vSphere 6.7 升级也会遇到) 阅读时长:约 8 分钟 难度:⭐⭐⭐(操作不可逆,生产 VM 强烈建议先备份再动)一、为什么写这篇文章?最近私信里又有几位网友问:ESXi 7.0 升到 8.0 之后,VM 的快照怎么都删不掉,vSphere Client 里一直显示…

2026/10/15 2:48:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →