一、硬件/板子相关点灯嵌入式的 Hello World。不管什么芯片先点个灯。灯亮了说明时钟、GPIO、烧录、工具链基本通了。灯不亮那就开始怀疑人生。跑飞程序不按预期执行PC 指针乱跳可能进了 HardFault也可能直接死在某处。总之就是“它有自己的想法”。挂死 / 卡死 / 死机不响应、不打印、不闪灯。你问它怎么了它不说话。炸了可能是程序崩了也可能是板子烧了。具体是哪种取决于有没有闻到糊味。冒烟硬件烧毁的经典标志。电源接反、电压给高、短路都会让你看到一缕青烟。那一刻你知道了什么叫“电子香”。飞线PCB 画错了用导线手动补救。飞线是硬件工程师的浪漫也是软件工程师的噩梦——因为你永远不知道下一根线会不会影响时序。飞线大法硬件问题软件背锅的终极解决方案。板子有问题飞根线。客户催得急飞根线。能不能量产再说。打板 / 改板打板是把 PCB 做出来改板是发现画错了重新来。改板一次钱包和心态一起瘦身。贴片 / SMT / DIP贴片是机器焊DIP 是插件焊。你焊多了就会知道什么叫“焊武帝”。BOM物料清单。BOM 里少一个电阻产线就停给你看。原理图 / PCB / Layout硬件三件套。软件工程师看原理图通常只关心两件事引脚接哪了电源对不对。上拉 / 下拉 / 浮空 / 悬空上拉是拉到高电平下拉是拉到低电平浮空是没人管。浮空的引脚就像没写需求的功能——状态随机。开漏 / 推挽输出模式。开漏一般要配上拉推挽能强驱动。配错了波形就跟你闹脾气。复用 / 重映射一个引脚能当好几个功能用。重映射就是换个位置继续用。手册里写得很清楚但你经常找不到。时钟没开嵌入式第一坑。外设不工作90% 的原因是时钟没使能。报了HardFault你查代码查半天最后发现少了一行 __HAL_RCC_XXX_CLK_ENABLE()。忘开时钟新手必踩老手偶尔也踩。踩一次记一辈子。二、调试/故障相关HardFaultCortex-M 的终极黑洞。程序跑飞后经常停在这里。你问它为什么它让你自己看寄存器。卡在中断中断没清标志、中断里死循环、中断优先级配错都会让你卡在里面出不来。中断没清标志位没清中断反复触发。你以为它进了一次其实它进了无数次。中断嵌套高优先级中断打断低优先级中断。用好了是实时性用不好是灾难。优先级反转RTOS 经典坑。低优先级任务拿着锁高优先级任务等锁中优先级任务还在跑。最后高优先级被中优先级拖死。看门狗 / 喂狗看门狗是防死机的喂狗是告诉它“我还活着”。忘了喂狗它就复位你。复位 / 掉电 / 上电复位是重启掉电是断电。很多 bug 只在掉电重启后出现因为内存里的东西全没了。烧录 / 下载 / 刷固件把程序写进芯片。烧录失败的原因可以有很多线没接好、芯片没识别、Flash 锁了、供电不够、玄学。Bootloader / APP / IAP / OTABootloader 是引导程序APP 是业务程序IAP 是在应用编程OTA 是远程升级。OTA 失败一次你就知道什么叫“现场变砖”。仿真器 / J-Link / ST-Link / DAP调试器。没有仿真器的嵌入式开发就像没有筷子的中餐——也能吃但很难受。串口打印大法最朴素的调试手段。变量不对打印。流程没走打印。中断没进打印。缺点是占时间优点是真好使。RTT / SWO比串口打印更高级的调试输出。速度快不占串口但需要仿真器支持。示波器 / 逻辑分析仪抓波形的。时序不对、毛刺、抖动、通信失败一抓就知道。问题是很多时候你没有。抓包协议分析。I2C、SPI、CAN、Modbus抓出来一看谁没 ACK谁发错帧清清楚楚。时序 / 毛刺 / 抖动时序是时间关系毛刺是窄脉冲抖动是边沿不稳。它们仨凑一起能让通信直接崩。纹波 / 地弹 / 共地电源不干净地不平参考点不一致。硬件问题但经常表现为软件 bug。玄学无法解释的现象。比如加个 printf 就好了去掉就复现。加个延时就好了去掉就死机。没人知道为什么但它就是好了。薛定谔的 bug你看它的时候不出现你不看它的时候必出现。调试器一挂它就好了。一测就复现一走就好调试器效应。你坐在那儿它老老实实你一离开它立刻崩给你看。三、软件/代码相关裸机 / 裸奔没有操作系统直接跑 main 循环 中断。简单、直接、可控但功能一多就乱。前后台前台是中断后台是 main 循环。经典架构写好了很稳写不好就是一团乱麻。状态机非阻塞流程的神。用好了代码清晰用不好switch-case 能写到天荒地老。轮询死等。while(!flag); 这种。简单但浪费 CPU。低功耗场景下轮询就是电费杀手。DMA直接内存访问。数据搬运不占 CPU用好了性能起飞用不好数据错位、缓存不一致、传输完成标志不清。双缓冲 / 环形缓冲串口、ADC、音频常用。写得好数据不丢写不好指针打架。队列 / 信号量 / 互斥锁 / 消息队列 / 事件组RTOS 的几大件。用错了不是死锁就是优先级反转。临界区 / 关中断 / 原子操作保护共享资源。关中断简单粗暴但关久了影响实时性。原子操作优雅但不是所有平台都有。内存对齐 / 字节对齐 / 大小端结构体对齐、协议解析、跨平台通信的永恒坑点。你以为发过去是 0x1234对面收到可能是 0x3412。volatile告诉编译器“别优化这个变量”。不加可能死循环加了也不代表线程安全。static / const / inlineC 语言三件套。用好了代码清晰用不好链接报错、重复定义、优化翻车。宏 / 条件编译宏是双刃剑。写得好方便写不好展开后你自己都不认识。Makefile / CMake构建系统。写得好一键编译写不好加个文件都要改半天。Release / Debug / O0 / O2Debug 能跑Release 跑飞是嵌入式经典剧情。优化等级一高时序、volatile、延时全变样。Warning编译器警告。新手忽略老手敬畏。很多 bug 其实 warning 早就提醒你了。祖传代码 / 屎山 / 技术债前任留下的代码。能跑但没人敢动。一动就炸一炸就加班。重构想收拾屎山。结果往往是重构到一半发现还不如重写重写到一半发现需求又变了。四、流程/职场相关联调软件和硬件一起调。联调现场通常是互相甩锅的起点。甩锅 / 背锅“这是硬件问题。”“这是软件问题。”“这是测试环境问题。”最后发现是电源没插好。填坑 / 挖坑 / 救火填坑是解决问题挖坑是留下问题救火是紧急处理线上问题。嵌入式工程师的日常就是一边填坑一边救火一边被挖坑。客户现场最怕去的地方。因为在那里所有“在我电脑上是好的”都会失效。量产 / 小批量 / 打样打样是做个样品小批量是试产量产是正式大批量。量产出问题那叫事故。验收 / 演示 / 翻车演示前一切正常演示时当场死机。这就是嵌入式版的“墨菲定律”。驻场 / 出差 / 加班驻场是去客户那里办公出差是去现场调试加班是以上两者的默认状态。提桶跑路干不下去了换个环境。嵌入式圈不大跑路之后可能还会在下一家公司遇到前同事。嵌入式黑话本质上是这行人的共同记忆。每一个词背后都是一次加班、一块板子、一个 bug、一缕青烟。