深入理解Cortex-M3内核:架构原理、寄存器与中断实战
做了这么多年嵌入式开发接触过的内核从8位到64位都有但要说真正让我觉得“开窍”的还是Cortex-M3。记得刚开始用M3内核的MCU时我对它的理解仅限于“主频高、Flash大”直到有一次调试一个诡异的中断嵌套问题逼着我去翻内核手册才意识到以前对MCU的理解有多浅。这篇博文就基于《ARM Cortex-M3指南》系列第三篇的视角把Cortex-M3的底子彻底盘一遍。讲清楚它是什么、为什么好、底层怎么运转、实际开发中怎么用。适合刚啃完芯片数据手册却对内核一头雾水的新手也适合从8位机转过来、想知道“M3凭什么这么强”的开发者哪怕你已经写了几年M3代码里面几个细节也能帮你把之前踩过的坑串起来。1. 为什么Cortex-M3是嵌入式开发的一道分水岭1.1 从ARM7到Cortex-M3一次彻底的架构革新要理解Cortex-M3的价值得先看一眼它的前辈ARM7。ARM7是经典冯·诺依曼结构指令和数据共用一条总线取指和访存不能同时进行流水线经常空转。更重要的是ARM7有两种指令集状态——ARM状态和Thumb状态切换时要一条BX指令还得考虑流水线对齐问题光是模式切换就够让人头疼。而Cortex-M3基于ARMv7-M架构直接砍掉了ARM状态只保留Thumb-2指令集。这相当于把“两套指令、反复切换”的老路彻底废弃换来的是编码密度和性能的双赢。除了指令集Cortex-M3在硬件层面也做了大量“编译器友好”设计。比如硬件除法指令、饱和运算指令、位段提取指令这些在ARM7时代要么用库函数模拟要么靠多条指令拼。有了这些指令很多DSP算法和通信协议栈的代码量可以明显压缩。更关键的是Cortex-M3支持嵌套中断、向量化中断、以及硬件栈切换把以前需要汇编人肉维护的现场保护工作全部自动化。所以从ARM7到Cortex-M3不光是主频数字的变化而是整个处理器设计哲学的改变面向确定的、实时的、低成本的嵌入式控制场景。这也是我推荐新手直接学M3而不是先学ARM7的原因。ARM7的基本功当然有用但那套“软切换”思维在今天大多数MCU项目里已经用不上了。M3让开发者可以用更接近“裸机思维”的方式写代码同时又具备跑RTOS的能力是可进可退的中间地带。1.2 哈佛总线与三级流水线性能提升的底气从哪来Cortex-M3采用哈佛架构指令总线和数据总线物理分离具体到实现上是三条总线接口指令通过I-Code总线取指通过D-Code总线做数据访问另外还有一条系统总线用于访问外设和SRAM。这意味着处理器可以在同一个时钟周期里取指和访存总线瓶颈比冯·诺依曼结构小得多。实际项目里最直观的感受就是主频不需要拉得很高就能获得不错的指令吞吐率这对功耗敏感的嵌入式设备很关键。流水线方面Cortex-M3是三级流水线取指、译码、执行。相比更深的流水线三级的好处是分支代价低中断响应快。ARM7也是三级流水线但因为指令集状态切换和总线共享实际效率打了折扣。M3还引入了分支预测一个简单的预测器配合Thumb-2混合编码大部分情况下流水线都能跑满。你写while(1)循环里的状态机跳转时不用担心切换开销这在实时控制里是有实际意义的。不过要提醒一句不要以为M3的哈佛结构就真的“指令数据完全并行”。D-Code总线访问SRAM时如果系统总线也在访问外设仲裁还是会有等待周期。很多刚接触M3的开发者以为“哈佛结构无等待”结果用定时器触发DMA搬运大数据时发现CPU还是会被拖慢。真实世界没有免费的午餐总线矩阵只是让冲突概率降低不是让冲突消失。2. 寄存器组与操作模式CPU工作的基本盘2.1 R0~R15与xPSR你能亲手摸到的核心资源Cortex-M3的寄存器组比ARM7精简了不少但每一个都有明确的角色。R0~R12是通用寄存器其中R0~R7在Thumb-2的16位指令里可以直接访问剩下的R8~R12在部分16位指令里用不到得靠32位指令操作。这意味着密集运算时编译器会优先把变量压在R0~R7里你写内联汇编时也要遵循这个习惯否则生成代码会有额外搬运成本。R13是堆栈指针SP但它不是一个普通寄存器——它有两个物理实例主堆栈指针MSP和进程堆栈指针PSP。处理器当前使用哪个由CONTROL寄存器的bit[1]决定。默认跑裸机时只用MSP跑RTOS时内核代码用MSP任务代码用PSP。好处在于任务切换时内核栈和任务栈天然隔离用户任务栈溢出不会立刻毁掉内核关键数据。我见过不少RTOS的栈溢出问题正是因为OS用PSP做任务栈才能通过异常机制捕获到“栈指针异常”而不是系统直接跑飞。R14是链接寄存器LR保存函数返回地址R15是程序计数器PCThumb-2下最低位必须为1表示Thumb状态。还有一个有意思的细节M3里对PC的写操作会影响LR的EXC_RETURN值所以异常返回机制后面讲跟PC和LR是强关联的调试时看这两个寄存器能快速判断当前在普通函数还是异常上下文里。xPSR是程序状态寄存器分三个子段APSR应用级标志位N/Z/C/Q、IPSR当前异常编号、EPSR执行状态含T位。其中Q位是饱和运算溢出标志DSP类算法里很常用。中断服务函数里查看IPSR可以确认自己在哪个IRQ里这个技巧在共享代码里排查重入问题非常有用。寄存器作用特殊说明R0-R7通用16位指令可直接访问R8-R12通用主要在32位指令中使用R13(SP)堆栈指针MSP/PSP双实例R14(LR)链接寄存器异常处理中作EXC_RETURNR15(PC)程序计数器Thumb位必须为1xPSR程序状态APSREPSRIPSR2.2 线程模式、处理模式与特权级M3的格局为什么特别适合做系统Cortex-M3有两种工作模式线程模式Thread Mode和处理模式Handler Mode。复位后进入线程模式跑普通应用代码一旦触发异常或中断处理器自动切入处理模式。两种模式可以有不同的堆栈选择——这构成了M3安全性的第一层基础。第二层是特权级。M3区分特权级Privileged和用户级Unprivileged。复位后默认特权级但你可以通过CONTROL寄存器将自己降级到用户级。用户级代码访问不了某些系统控制寄存器比如NVIC配置寄存器也执行不了MRS/MSR的部分操作。想重新回到特权级只能通过异常典型做法是触发SVCall让处理器在特权级下帮你操作。这个机制对RTOS来说非常实用用户任务放在用户级即使任务代码跑飞恶意改写外设寄存器破坏力也被限制在可控范围内核通过SVC异常提供服务相当于系统调用。实际开发中我建议至少把“特权级-用户级”这个概念用起来。就算你裸机开发不跑OS也可以在初始化完成后把非关键任务降到用户级防止buffer overflow或者野指针把关键配置寄存器冲掉。代价只是每次访问保护资源时多一次SVC调用的开销但这个开销相比M3的中断延迟几乎是零头。3. 存储器映射与位带操作4GB空间里的门道3.1 统一编址的4GB地址空间为什么外设也能“直接访问”Cortex-M3把4GB地址空间固定划分区块每个区块有明确用途。0x00000000~0x1FFFFFFF是代码区通常接Flash0x20000000~0x3FFFFFFF是SRAM区0x40000000~0x5FFFFFFF是外设区0xE0000000往上是系统私有外设区NVIC、调试组件、SysTick都在这。这种统一编址的好处是外设寄存器和内存用同一套访问指令不用单开I/O指令空间。这也是为什么M3的C语言开发这么顺滑——一个*(volatile uint32_t *)0x40021000就能访问到寄存器不需要编译器做额外扩展。要注意的是地址映射的“固定”只体现在ARM内核层面具体哪个外设挂在哪个地址由芯片厂商决定。数据手册里的存储器映射表实际上是在ARM骨架上二次开发的结果。不同厂家的M3芯片外设区布局差异很大迁移代码时最费劲的就是这层。但因为SRAM区和外设区至少物理上不冲突你把变量放到0x20000000区、把外设配置放在0x40000000区大体不会出交叉映射的幺蛾子。还有两个细节值得提。一是代码区不光能放代码也可以放只读数据、字符串字面量二是SRAM区地址从0x20000000开始但芯片实际SRAM往往没有512MB那么大所以高地址空间是不存在物理存储的访问未映射区域会产生总线错误HardFault。很多新手把数组索引写越界一路写到了未映射区触发HardFault后一脸懵。遇到莫名奇妙的HardFault先检查数组越界和指针非法访问永远是最优先的排查方向。3.2 位带操作用“改字节”的方式干“改位”的活位带操作是Cortex-M3一个非常有特色的机制。M3把SRAM区的1MB空间和外设区的1MB空间定义为位带区Bit-band region每个位带区对应一个32MB的位带别名区Bit-band alias。你往别名区地址写一个32位值物理上等效于对位带区对应位的原子置位或清零。映射公式是这样的别名区地址 位带别名区基地址 (字节偏移 × 32) (位号 × 4)以SRAM位带区为例地址0x20000000的bit0对应的别名区地址是0x220000000x20000000的bit1对应0x22000004依此类推。为什么能做到原子因为M3把对别名区的读改写操作设计成单总线周期完成不需要你用“读-改-写”三步指令也就天然避免了中断插入导致的操作丢失。实际项目里位带操作最常见的使用场景是共享标志位的原子置位/清除。传统做法是主循环里flag | (1 5)如果这个操作正好被中断打断中断里又修改了flag那回来后的写回就可能覆盖中断的修改。用位带操作写*(volatile uint32_t *)ALIAS_ADDR 1就不用关中断来保护临界区了。注意位带操作只在M3/M4/M0等内核上有效搬到其他ARM内核比如M7就没这个硬件了移植代码时得做抽象层。4. 中断、异常与NVIC实时响应从何而来4.1 异常模型与向量表从复位到系统调用的完整链路Cortex-M3把中断和异常统一编号管理。编号1是复位2是NMI3是HardFault4~6是MemManage、BusFault、UsageFault11是SVCall14是PendSV15是SysTick16以上才是外部中断IRQ0~IRQ239具体个数由芯片决定。向量表默认放在地址0x00000000第一个字是初始SP第二个字是复位向量后面按异常号依次排列各服务函数地址。CPU响应异常时自动从向量表加载入口地址不需要软件查跳转表这就是“向量化中断”的含义。复位后CPU从复位向量指向的地址开始执行同时把栈顶地址装载到SP。所以链接脚本里第一行必须是栈顶地址很多启动文件写得像天书但核心就是“正确放置向量表初始化栈”。如果你用ST的HAL库或者Keil模板启动文件通常已经配好但一旦涉及Bootloader跳转或者自定义链接脚本这块就必须亲自动手。有个常见坑是把向量表放在了0x08000000芯片Flash起始却忘了改SCB-VTOR寄存器导致中断响应时跳到错误的向量。解决办法就是初始化早期设置SCB-VTOR 应用代码基地址并且注意向量表必须按2的幂次对齐到其大小。异常进入时硬件自动压栈xPSR、PC、LR、R12、R3、R2、R1、R08个字同时从MSP/PSP中选取当前栈。退出时硬件自动出栈。这套机制到PendSV和SVCall上就体现出了巨大优势RTOS任务切换时不需要软件手工保存全部寄存器硬件已经帮你把通用寄存器的现场保存好了上下文切换只需保存剩余的FPU寄存器如果启用和SP。我在移植一些RTOS时最复杂的汇编部分其实就是切换PSP和保存少量寄存器比老架构的切换代码简单得多。4.2 NVIC优先级与尾链技术中断延迟到底是怎么降下来的NVIC是嵌套向量中断控制器支持可编程优先级。M3的优先级是0~255的数字但芯片厂商通常只实现高位比特比如3位就代表8个优先级。这里必须提醒优先级数值越小优先级越高。刚接触STM32的人常常在这栽跟头——配好NVIC却发现低优先级先执行了往往是把优先级数字搞反了。NVIC还支持抢占优先级和子优先级的组合这通过SCB-AIRCR的PRIGROUP字段来分配。抢占优先级决定能否打断当前中断子优先级只在同抢占优先级时用来排队。M3的中断响应有一个固定规律只要新中断的抢占优先级更高就可以立即暂停当前中断并且硬件会自动保存现场。所以你不需要在ISR里写任何“保护旧现场”的代码这就是“硬件嵌套”的价值。更关键的是尾链技术Tail-chaining。传统CPU在连续处理两个中断时要先出栈ISR1退出、再入栈ISR2进入花两倍时间。M3的尾链技术检测到两个中断的入栈内容相同直接跳过出栈和入栈把入口改到ISR2。这个优化让连续中断场景的平均开销大幅下降。实时系统中如果ADC每10微秒中断一次紧接着定时器中断也需要响应尾链能把中断吞吐率拉高一截。另外有个“晚到中断Late-arriving”也很实用当ISR1正在压栈时更高优先级ISR2到达NVIC会直接把栈帧优先级标为ISR2取消ISR1的压栈动作处理完ISR2再回来处理ISR1。这样避免了两次压栈的浪费。这些细节用调试器观察中断时间线时一目了然理解了它们你才能解释为什么M3能满足微秒级的实时要求。5. 调试手段与入门实操建议5.1 SWD调试与调试组件两个引脚能做的事比想象多Cortex-M3的调试接口支持JTAG和SWD两种。我强烈推荐在项目里用SWD它只要两根线SWDIO、SWCLK加上复位线GND就能完成下载和调试。对于PCB面积紧张的小板子省下的引脚和走线空间很可观。很多调试器默认是JTAG模式要在工具链里切换成SWD。M3调试子系统包含FPBFlash Patch Breakpoint、DWTData Watchpoint and Trace、ITMInstrumentation Trace Macrocell、TPIUTrace Port Interface。FPB能把指定的Flash地址替换成SRAM里的断点指令实现“硬件断点”而不用改Flash。DWT可以监控数据地址访问在变量被改写时触发断点这在排查栈溢出/指针篡改时是神器。ITM则是轻量级日志通道——只要在调试器里使能SWO引脚ITM_SendChar就能往主机打印日志不占用串口、不影响实时性。这个功能我几乎每个项目都在用尤其是调试协议栈时序时比加串口打印靠谱得多。SWO引脚的波特率通常由内核频率和调试器配置决定如果抓到的日志乱码先核对内核主频和调试器里设定的SWO频率是否一致。不少新手的SWO日志乱得一塌糊涂多半不是代码问题而是CLK配置与调试器不一致。5.2 从理论到上手的几条实用经验学习Cortex-M3基础光看手册是不够的我建议按这个路径实践先拿一个成熟的开发板跑一个点灯程序然后用调试器单步走观察复位后SP的初始值、PC如何跳到main、进中断时压栈哪些寄存器。这个过程比读十遍手册都有用。调试时推荐打开两个窗口Peripherals—Core Peripherals—Nested Vector Interrupt Controller另一个是Registers窗口。前者能看到当前活跃IRQ、抢占状态后者能看到硬件压栈后的R0~R12现场。遇到HardFault时查看LR里的EXC_RETURN值0xFFFFFFF9表示用MSP返回0xFFFFFFFD表示用PSP返回加上PC值就能定位爆栈还是野指针。还有个小技巧M3的SysTick定时器常被当作RTOS的时钟节拍但如果裸机下只用来做毫秒延时要注意它是24位递减计数器重装值是SYSCLK/1000不是SYSCLK/1000 - 1。很多延时误差就出在这一减上。另外SysTick用内核时钟源还是外部时钟源不同芯片配置不同延时不准时先查这个。最后一个经验是关于存储保护的。如果芯片有MPUMemory Protection UnitM3为可选组件最好在项目后期试着用起来。它可以把关键外设区设为只读、把代码区设为可执行不可写能有效拦截很多内存踩踏错误。虽然配置MPU有一点点学习成本但它能帮你把“跑飞的程序”变成“可控的HardFault异常”后者比前者好排查十倍。我在一个长期运行的采集节点项目里启用了MPU半年内捕获了三次非法访问如果没有MPU这三次都会变成莫名其妙的随机死机。如果说要从这篇文章里带走在开发中最能用上的核心记忆点我会选三件事一是弄清楚异常模型和向量表这是所有RTOS和中断逻辑的根二是位带操作和NVIC优先级搭配能让临界区处理和中断响应变得干净利落三是调试时一定会用到的SWD/ITM组合它能让你的排查效率提升不只一档。Cortex-M3的可贵之处在于它不算年轻但设计思路极其成熟你今天花时间搞懂的内核运行机制往后的M4、M33上照样复用八十%剩下的只是扩展和升级。

相关新闻

AADL与OSATE2:嵌入式架构建模与可调度性分析实战指南

AADL与OSATE2:嵌入式架构建模与可调度性分析实战指南

做过嵌入式或安全关键系统的人应该都有体会:越复杂的系统,越难在地图上讲清楚“系统到底长什么样”。需求文档里有一段话,设计文档里有一张框图,代码里有一套模块划分,硬件上又是另外一套资源布局,它们之间…

2026/10/9 20:35:06 阅读更多 →
基于YOLO的PCBA高密度板电子元件缺失与错装检测实战

基于YOLO的PCBA高密度板电子元件缺失与错装检测实战

就在去年下半年,我被一桩事反复折磨:产线上那块高密度PCBA板,0402规格的电阻电容密密麻麻排了大半张板子,AOI设备天天误报,人工目检那边又跟不上节奏。每天盯屏的质检员换了三轮,漏检率还是压不下去。那段时…

2026/10/11 0:20:56 阅读更多 →
自动化测试详解:从接口到UI的落地经验与避坑指南

自动化测试详解:从接口到UI的落地经验与避坑指南

先聊点实在的。我在这个行业摸爬滚打这些年,经手过的项目大大小小也有几十个了,几乎每个团队立项时都会拍着胸脯说要上自动化测试,但真正能把自动化测试做出价值、让它在版本迭代里起到“守门员”作用的团队,屈指可数。大部分人要…

2026/10/9 20:34:06 阅读更多 →

最新新闻

HMM-LSTM股票市场趋势分析:四种模型动态权重组合实战

HMM-LSTM股票市场趋势分析:四种模型动态权重组合实战

简介:面向股票量化分析与时序建模学习者,这套Python源码包聚焦HMM与LSTM融合的股价趋势预测,提供四种模型的完整实现,覆盖数据清洗、特征构造、模型训练、概率预测与效果评估等环节。压缩包共61个文件,以.py源码为主&a…

2026/10/11 0:20:45 阅读更多 →
开发者效率升级:Typeoff 全局语音输入,重构编码文本输入体验|TaoToken 统一 Key 通道实践

开发者效率升级:Typeoff 全局语音输入,重构编码文本输入体验|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 0:20:45 阅读更多 →
AgentScope深入分析-LLMMCP:把MCP endpoint改到TaoToken的配置与验证

AgentScope深入分析-LLMMCP:把MCP endpoint改到TaoToken的配置与验证

/* 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 0:20:45 阅读更多 →
AI编程工具:Claude Code 还是 Cursor,我试了三个月!!!

AI编程工具:Claude Code 还是 Cursor,我试了三个月!!!

/* 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 0:20:44 阅读更多 →
输电线路金具检测数据集:10000张图与YOLO训练全流程

输电线路金具检测数据集:10000张图与YOLO训练全流程

简介:这是一套面向电力巡检与输电线路智能检测方向的YOLO目标检测数据集,适用于算法工程师、高校学生及科研人员开展电力金具识别模型的训练与验证。数据均来自真实场景,覆盖多种拍摄条件,标注由labelimg完成,标注框质…

2026/10/11 0:19:44 阅读更多 →
YOLOv8车流检测多端部署实战指南

YOLOv8车流检测多端部署实战指南

简介:本资源是一个基于YOLOv8构建的多端车流检测系统开源项目,专为本科毕业设计、课程设计及AI视觉初学者提供可运行、可复现的完整解决方案。系统支持图片/视频上传与实时摄像头流检测,并通过GUI界面实现交互式操作与结果可视化,…

2026/10/11 0:19:44 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →