CAN 接收中断与队列:最重的活不在最急的地方干(以 STM32F4 为例)
那颗从 收发器篇 埋下、被 位同步篇 和 电路篇 两次按下不表、排了三次队的炸弹,这篇终于拆。先把雷管念一遍原文:「接收 FIFO 只有 3 级——500kbps 下一帧标准数据帧约 222µs,3 级满打满算 666µs 的余量,一次比一次长的中断风暴就能把它灌爆。轮询路线在真实机器人上活不过第一版」。 再看它爆炸的真实现场。机器人主控跑着 1ms 周期的控制循环,六七个关节电机各以 1...
那颗从 收发器篇 埋下、被 位同步篇 和 电路篇 两次按下不表、排了三次队的炸弹,这篇终于拆。先把雷管念一遍原文:「接收 FIFO 只有 3 级——500kbps 下一帧标准数据帧约 222µs,3 级满打满算 666µs 的余量,一次比一次长的中断风暴就能把它灌爆。轮询路线在真实机器人上活不过第一版」。 再看它爆炸的真实现场。机器人主控跑着 1ms 周期的控制循环,六七个关节电机各以 1...
位同步篇 结尾说「下一站终于要拆收发器篇那颗 666µs 的炸弹了」——结果这次又被点了名,炸弹第三次排队(排队排出了惯性,下一篇真的拆)。这次的题目是三篇 CAN 一直当道具用的那根线本身:芯片外面的电路。收发器篇 讲完了芯片里面(TXD/RXD、驱动管、超时),位同步篇讲完了时间轴(边沿、拨表),但双绞线、120Ω、那个悬停的 2.5V,一直没人为它们单独开一场——而它们才是 CAN 硬...
上一篇 CAN 总线 用环回模式把整个协议层跑通了,收发器被一句话打发:「真要接物理总线时,再加一颗 CAN 收发器(3.3V 的 SN65HVD230 或 5V 的 TJA1050)和一根双绞线」。这篇就来还这笔债——但先看一个会让你愣一下的事实。 环回跑通的那天,你把示波器挂上 PB9(CAN1_TX),想看看传说中的 CAN 长什么样。看到的是老朋友:0 和 3.3V 之间的方波,跟...
《CAN 总线篇》 讲位时序那节的时候,给自己留了一句欠条:「先记住它是『对表时允许的步长上限』」——SJW 是什么、对表对的是什么表,当时都没展开。收发器篇 结尾挂着的那颗 666µs 的炸弹先让它再排一会儿队,这篇先回来还这笔更老的账:总线上没有任何时钟线,各个节点到底是怎么把「每一位」的发送时间点对齐的。 先把这件事的怪异程度摆出来。串口没有时钟线,靠每帧开头的起始位硬对一次表——一...
《串口篇》 结尾岔出的总线之路,走过了 SPI(加一根时钟线)和 I2C(时钟线 + 地址 + 开漏),但你可能注意到它们有个共同点:都得有个主机。主机不点头,从机一个字都不能说。现在想象机器人上的场景:主控一块、六七个关节电机驱动各一块、IMU 一块、电池管理一块,全都挂在同一对线上,谁想说话谁开口——没有主机、没有点名、没有中央仲裁器。 更怪的是这件事:两个节点在同一纳秒同时开口,总线...
先来个三连问,画面都是你天天见的。这行 hunk 头取自一次真实的 git diff: @@ -2,7 +2,7 @@ l1 那个 7 数的是哪些行?上下文行算不算?被删的行算不算? 第二行 index 46584d4..c77cd3f 100644 里那串十六进制,和 commit hash 是一回事吗? 拿一份行号早已对不上的旧补丁去打一个文件,为什么经常照样能打上?...
先按一遍计算器。一个跑了 30 轮工具调用的 agent 任务,假设每轮往账本里新增 1000 token(一张求助单加几条工具结果,这个数不夸张,甚至偏保守),那么全部新增内容是 30 × 1000 = 3 万 token。但每次调 API,都得把之前攒下的账整本重发一遍,所以你实际付的输入总量是 1000 + 2000 + … + 30000 = 46.5 万 token——是新内容的 ...
先说一个反直觉的事实:你每次调用 DeepSeek API 的那一两秒里,模型其实什么都没”做”。它不查网、不跑代码、不看表,甚至不知道今天是几号。它自始至终只干一件事——收到一段文本,续写下一段文本。 可是同样”只会续写文本”的模型,放进 Claude Code 这类工具里,就能改你的代码库、跑你的测试、提交你的 commit。模型没换量级,多出来的本事从哪来的? 答案在模型外面那层东...
假设你给一台传感器写联网代码。最直觉的做法:设备每隔一秒问服务器一次”有新指令吗?”——HTTP 轮询,简单直接。一天下来,86400 次询问,86300 次得到的回答是”没有”。往少了算,一来一回 500 字节,一天就是约 43 MB 流量,其中真正的数据可能不到 2 KB。在 WiFi 环境里你顶多觉得浪费;但如果这台设备在沙漠里,通过按字节计费的卫星链路上报油压——多说的每一个”没有吗...
《定时器与 PWM》 结尾的速查表里,电机那一行写着”~20kHz,高级定时器(TIM1/TIM8)”,末尾一句”死区和互补输出下篇见”。今天兑现这笔账。但先看一个现场——一个几乎每个自己搭过电机驱动的人都经历过的现场: 你用定时器的两路通道引出一对 PWM,软件保证它们反相。示波器一看:完美互补,沿对得整整齐齐,比钟表还准。你满意地把它接上四颗 MOS 管搭的 H 桥,接上电机,上电——...