内核寄存器:CPU 手边的十六个格子(以 Cortex-M4 为例)
你大概见过调试器里那个寄存器面板——单步时它就挂在旁边,一排 R0、R1……R15,跟着一个小小的黄色箭头哗哗地变。大多数人从不点开它。真正逼你点开它的,往往是这两件事之一:看 FreeRTOS 的任务切换代码,通篇是 STMDB SP!, {R4-R11} 这样的天书;或者给一段奇怪的崩溃查因,反汇编出来的东西,一个 C 变量都看不见。 先给你一个 5 秒的实验垫底。随便写一个函数: ...
你大概见过调试器里那个寄存器面板——单步时它就挂在旁边,一排 R0、R1……R15,跟着一个小小的黄色箭头哗哗地变。大多数人从不点开它。真正逼你点开它的,往往是这两件事之一:看 FreeRTOS 的任务切换代码,通篇是 STMDB SP!, {R4-R11} 这样的天书;或者给一段奇怪的崩溃查因,反汇编出来的东西,一个 C 变量都看不见。 先给你一个 5 秒的实验垫底。随便写一个函数: ...
上一篇 《FreeRTOS 核心原理》 结尾留了句话:中断里要通知任务,用”置标志位 / 放队列 / 唤醒一个任务”。前一个你已经会了–全局变量加标志位,裸机时代人人写过。但先看一个几乎每个 RTOS 新手都踩过的坑: 两个任务,一个生产数据,一个消费数据。最直觉的写法:一个全局数组,加一个 data_ready 标志: uint8_t buf[64]; volatile int dat...
点灯、按键、中断都调通了,你接上串口,想用打印看看程序里到底发生了什么。结果终端上蹦出来的不是 Hello,而是满屏乱码:xÿÿxÿ。你换了数据线、换了终端软件、重启了板子,乱码纹丝不动。更诡异的是:把波特率从 115200 改成 115202(就差 2),乱码了;改回 115200,好了。 问题不在数据,在时间。串口只有两根线–一根发、一根收–没有时钟线。接收方怎么知道每一位从哪开始、到...
你照着教程点亮了 LED,信心满满地把灯换成按键:把引脚配成”输入”,按下想让灯亮。结果灯的表现像在闹鬼——有时不亮,有时乱闪,有时按下去根本没反应。你反复对照教程,每一行都对。你怀疑是硬件坏了,换了一块板子,还是这样。 问题不在代码,也不在板子,而在一条你从没写过、也从没人告诉你的默认值里:STM32 上电复位后,所有 GPIO 引脚默认是”浮空输入“——既不输出,也不读,既不拉高,也不...
你把按键中断调通了,LED 应手而亮,很有成就感。然后你往”中断处理函数”里加了一行调试用的 printf——板子死了。更气人的是它死得毫无规律:有时按三下就死,有时按三十下都没事,同一个按键,这次按死、下次不按死。换成延时,死得更干脆。 你反复检查 GPIO、时钟、库版本,全都没问题。问题确实不在那儿。真正的原因藏在一个更基本的地方:你写的那个”函数”,根本不是被”调用”的。 它是被 ...
先说一个几乎没人明说的诡异事实:在 FreeRTOS 里,你写的每个任务都是一个 for(;;) 死循环,里面没有一行”我该把 CPU 让出来了”的代码——但几个任务却在自动轮流执行。 CPU 是单核,同一瞬间只有一条指令在执行。那当你盯着任务 A 看时,任务 B 的”另一半”正在哪?它没跑完,也没消失——它被完整地冻结在某一行上,等着某个看不见的东西把它叫醒。 这篇接着上一篇 《Cor...
先说一个反直觉的事实:你花几千块组装的电脑,无法保证”在精确的第 1000 个时钟周期把某个引脚拉高”这件事;而一片几块钱的 Cortex-M4 单片机(MCU,Microcontroller Unit,微控制器),可以。 再问一个让几乎所有嵌入式新手都愣住的问题:单片机上电之后,CPU 执行的第一条指令从哪来?是 main() 吗? 不是。在 main() 的第一行执行之前,一段你没写...
一个新手几乎必踩的坑。你听说 lodash 是个好用的工具库,于是: npm install -g lodash 装完了,终端还友好地打印了版本号。回到项目里写 require('lodash'),运行: Error: Cannot find module 'lodash' 明明刚装的,”全局”的,装给整台电脑的,怎么就找不到?更气人的是反方向的委屈:教程让你 npm insta...
先跑一段代码(浏览器控制台和 Node 里都行): console.log("A"); setTimeout(() => console.log("C"), 0); Promise.resolve().then(() => console.log("B")); console.log("D"); setTimeout 的第二个参数是 0 毫秒–零延迟,”马上”的意思。很多人...
装一个 Express,官方文档就一行命令:npm install express。三秒跑完,一切正常。直到有一天你随手 ls node_modules–里面躺着几十个你从没点名要过的文件夹。你点了一个菜,后厨端上来一桌。 另一幕更常见:周一你把 Node 升级到最新版,老项目当场罢工;切回旧版本,新教程的示例又跑不了。一台电脑只能装一个 Node?那同时维护三个项目的人怎么办? 这篇讲...