技术笔记

动手写一个 Claude Code 插件:从一条斜杠命令到事件钩子

上一篇我们把插件这个包裹拆开看了个遍:一个目录,一份 plugin.json,几个约定位置的子目录。结尾埋了三个伏笔——hooks.json 的事件表、子代理的 frontmatter 字段、MCP 协议。本篇来还债,方式不是继续拆别人写的插件,而是从空目录开始,把每一级组件亲手造一遍。 动手之前先给你一个反直觉的预期管理:整个开发流程里没有”编译”这个步骤。没有 npm run buil...

定时器与 PWM:把时间外包给硬件(以 Cortex-M4 为例)

你想给板子加个呼吸灯——LED 慢慢亮、慢慢灭,显得有生命感。PWM 还没学,就用最朴素的办法硬模拟:主循环里翻转引脚,亮多灭少就是”变亮”,亮少灭多就是”变暗”。灯真的呼吸起来了。然后你往主循环里加了一行 printf,呼吸开始抽搐;把它搬进 FreeRTOS 任务里,别的任务一忙,灯就一卡一卡。你反复检查,每一行都没写错。 错的是整个做法本身:你在用 CPU 的手指头充当电路。CPU ...

Claude Code 插件:一份清单、一个目录、和不需要服务器的应用商店

你花了一个周末给 Claude Code 调教出一套顺手的斜杠命令:/review 按团队规范审代码,/deploy 走发布清单,还有一个 subagent 专门写 commit message。然后同事说”也给我一份”——最直接的办法是把 .claude/ 目录打包发过去。过两周你改了 /review 的提示词,再发一遍;同事那边自己也有改动,合并靠肉眼。 更惨的是另一个方向:你听说有人...

机器人开发,到底是在开发什么?

先看一个反差:让电脑下棋赢过世界冠军,这件事 1997 年就做完了;让机器人像五岁小孩一样收拾好自己的房间,到今天没有任何一家公司做得到。 对着一屋子玩具,小孩瞄一眼就知道哪个是积木、该放回哪个箱子。这件”谁都会”的事,恰好是机器人开发里最难的部分。为什么?这篇文章用大白话把机器人开发从头讲一遍——不出现一个没翻译的术语。 一句话版本:机器人开发,就是教一台机器循环做三件事——用传感器”...

精读 .map 文件:固件的竣工图(以 Cortex-M4 为例)

凌晨两点,产线值班工程师发来一个十六进制数:0x08001c58。背景是:那台跑了三天两夜的设备 HardFault 复位了一次,好在固件里留了后手——HardFault 处理函数把压栈的八个寄存器捞出来存进了备份寄存器,其中 PC 就是这个值(怎么捞的,见中断篇的压栈帧:R0、R1、R2、R3、R12、LR、PC、xPSR)。现在问你:这个地址,是哪个函数? 先排除一个错觉:烧进芯片的 ...

双分区 OTA:先拿到 offer 再辞职的升级法(以 Cortex-M4 为例)

字段工程师在客户机房点下「升级」。进度条走到 87%,机房的 UPS 跳闸了。重启之后,那台设备再也没起来——Flash 里躺着半截新程序、半截旧程序,谁都不完整。寄回工厂,重走一遍烧录产线,客户体验归零。 为什么一次升级能把设备「升死」?因为最常见的升级方式,本质是一场原地装修:先把旧的擦掉,再写新的。擦和写之间有个窗口,窗口里断电,旧房已拆、新房没盖完。更糟的是,这个窗口和下载速度成正...

启动文件:main 之前的世界是怎么立起来的(以 Cortex-M4 为例)

每个 STM32 工程里都有一个你从未打开过的文件:startup_stm32f407xx.s。几百行汇编,从工程模板生成的那天起就没人多看它一眼。大多数人第一次被迫打开它,是因为一个诡异的 bug——比如这个真实案例:串口收不到数据,单步调试,程序卡死在一个叫 Default_Handler 的死循环里。检查代码,中断服务函数明明写了。再检查一遍,发现了: void USART1_IRQ...

Org mode:一个纯文本文件,凭什么管住了我的笔记、待办和代码实验

先看一个你可能熟悉的场景:待办事项在滴答清单里,读书笔记在 Notion 里,代码实验的草稿散落在各个 IDE 的临时文件里,每周写周报时打开五个窗口来回切。然后某天某个 app 改版了、收费了、停止维护了——你的数据跟着陪葬,或者沦落成一份再也不会打开的导出文件。 现在有一个反直觉的事实:一个诞生于 1986 年的文本编辑器里附带的一个模式,至今仍是无数程序员和研究者的笔记中心、任务管理...