<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>嵌入式 on To the Moon</title><link>https://pycv.github.io/blog/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/</link><description>Recent content in 嵌入式 on To the Moon</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 27 Jul 2026 11:41:16 +0800</lastBuildDate><atom:link href="https://pycv.github.io/blog/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>嵌入式C语言会不会像当年的汇编一样被边缘化？</title><link>https://pycv.github.io/blog/excerpts/2026-06-01-embedded-c-ai-future/</link><pubDate>Mon, 01 Jun 2026 21:37:00 +0800</pubDate><guid>https://pycv.github.io/blog/excerpts/2026-06-01-embedded-c-ai-future/</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文由 AI 自动摘录整理，原始链接：&lt;a class="link" href="https://mp.weixin.qq.com/s/AWuxQ_dPruM2BBp2fsdI6Q" target="_blank" rel="noopener"&#10; &gt;嵌入式C语言会不会像当年的汇编语言一样，慢慢被边缘化？&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;推荐指数&lt;/strong&gt;：6/10（读重点章节）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="背景"&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;微信公众号「最后一个bug」的文章，探讨在 AI 写代码能力越来越强的背景下，嵌入式 C 语言是否会像当年的汇编语言一样被边缘化，以及嵌入式 C 程序员如何应对。&lt;/p&gt;&#10;&lt;h2 id="核心观点"&gt;核心观点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;汇编的致命伤是架构绑定&lt;/strong&gt;：汇编完全绑定特定 CPU 架构，换芯片就得重写；C 语言通过编译器抽象实现了跨平台可移植性，这是汇编永远无法跨越的鸿沟&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;C 语言是软件世界的地基&lt;/strong&gt;：CPython 解释器、Java 的 HotSpot 虚拟机、V8 引擎、Linux 内核、FreeRTOS、TCP/IP 协议栈全是 C/C++ 写的——&amp;ldquo;塔尖可以换，但塔底一动整个塔就塌了&amp;rdquo;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AI 能生成代码，但解决不了硬件问题&lt;/strong&gt;：AI 可以写出一份八九不离十的 SPI 初始化代码，但高温下时钟毛刺导致的 SPI 丢数据，AI 看不到示波器波形也闻不到板子烧焦的味道&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;破局三方向&lt;/strong&gt;：往&amp;quot;硬&amp;quot;了走（硬件调试）、往&amp;quot;深&amp;quot;了走（系统级设计决策）、往&amp;quot;广&amp;quot;了走（技能栈拓宽，如 Rust/Python/Go）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="补充要点"&gt;补充要点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;MCU 的物理限制是 C 语言最坚固的护城河——一颗只有 64KB RAM 的 STM32F103 跑不了 AI 模型&lt;/li&gt;&#10;&lt;li&gt;AI 辅助生成的外设驱动代码已经可用，但嵌入式工程师的不可替代性从&amp;quot;写代码&amp;quot;转移到了&amp;quot;解决系统问题&amp;quot;&lt;/li&gt;&#10;&lt;li&gt;汇编没落不是因为汇编程序员技术不好，而是需求收缩了——纯粹汇编的用武之地仅剩启动代码、RTOS 上下文切换、逆向工程等狭窄场景&lt;/li&gt;&#10;&lt;li&gt;系统级决策（裸机 vs RTOS、任务栈大小、优先级排布、磨损均衡策略）是 AI 目前最薄弱的环节&lt;/li&gt;&#10;&lt;li&gt;建议用 Rust 的内存安全理念反向改进 C 语言编程习惯——&amp;ldquo;最好的护城河不是你会什么语言，而是你能解决什么问题&amp;rdquo;&lt;/li&gt;&#10;&lt;li&gt;文章以 SPI 通信高温丢数据的真实案例说明硬件调试的不可替代性：用逻辑分析仪抓了一下午才定位到时钟毛刺&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>一个数组越界，竟让我排查了几天——嵌入式段错误定位实录</title><link>https://pycv.github.io/blog/excerpts/2026-03-14-embedded-segmentation-fault-debugging/</link><pubDate>Sat, 14 Mar 2026 16:19:35 +0800</pubDate><guid>https://pycv.github.io/blog/excerpts/2026-03-14-embedded-segmentation-fault-debugging/</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文由 AI 自动摘录整理，原始链接：&lt;a class="link" href="https://mp.weixin.qq.com/s/7cFIPWiEzTIJQEHmR7gOjQ" target="_blank" rel="noopener"&#10; &gt;一个数组越界，竟让我排查了几天&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;推荐指数&lt;/strong&gt;：8/10（推荐读原文）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="背景"&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;程序跑了几天好好的，换个位置就段错误死机。屏蔽两行三角函数代码就正常，打开就必崩——但问题根源和那两行代码毫无关系。最终真凶是一个&amp;quot;隔山打牛&amp;quot;式的数组越界。&lt;/p&gt;&#10;&lt;h2 id="核心观点"&gt;核心观点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;打印法可能把你带偏&lt;/strong&gt;：屏蔽代码后&amp;quot;不崩了&amp;quot;，只是切断了越界的触发路径，并没有解决根本问题。表象往往和根因相隔甚远。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;远程 GDB 精确定位崩溃点&lt;/strong&gt;：gdbserver + VSCode 远程调试，段错误发生时能精确知道崩溃的代码行号，比打印法更可靠。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;数组越界&amp;quot;隔山打牛&amp;quot;&lt;/strong&gt;：一个 5 元素的 float 数组 &lt;code&gt;arr&lt;/code&gt;，实际写到了 &lt;code&gt;arr[5]&lt;/code&gt;、&lt;code&gt;arr[6]&lt;/code&gt;、&lt;code&gt;arr[7]&lt;/code&gt;、&lt;code&gt;arr[8]&lt;/code&gt;。而 &lt;code&gt;arr[8]&lt;/code&gt; 的地址正好是静态全局变量 &lt;code&gt;fd&lt;/code&gt; 的地址，写入操作直接篡改了 &lt;code&gt;fd&lt;/code&gt; 的值，导致段错误。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="关键技巧"&gt;关键技巧&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;-fdata-sections 编译参数&lt;/strong&gt;：让每个变量放到独立的 section 中，链接器生成 map 文件时就会包含 static 变量的地址信息，方便分析内存布局。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;AddressSanitizer（-fsanitize=address）&lt;/strong&gt;：对付内存类 bug 的&amp;quot;大杀器&amp;quot;，会直接报出数组越界的精确位置和调用栈，可能 10 分钟就能定位根因。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="调试工具速查表"&gt;调试工具速查表&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;工具/方法&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;适用场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;优势&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;log 打印法&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;快速初筛&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;简单直接，零成本&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;远程 GDB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;精确定位崩溃行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可看调用栈和变量值&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;core dump + gdb&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;事后分析&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要复现，离线分析&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;strace&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统调用级跟踪&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;排查文件/网络/权限问题&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AddressSanitizer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内存越界/溢出/UAF&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编译期插桩，精确到行&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;map 文件 + -fdata-sections&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分析变量内存布局&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看 static 变量地址&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="经验总结"&gt;经验总结&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;表象 ≠ 根因&lt;/strong&gt;：通过屏蔽/打开某些代码来定位问题时，看到的可能只是 bug 的表象。要多思考&amp;quot;为什么&amp;quot;，从根本上解决。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;选对工具事半功倍&lt;/strong&gt;：打印法虽然常用，但遇到内存踩踏类 bug 时容易把人带偏。远程 GDB 和 map 文件是更高效的手段。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;AI 辅助排查&lt;/strong&gt;：有明显代码缺陷的代码，AI review 分分钟就能检测出来。结对分析可以让 AI 检查可疑代码是否存在缺陷。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;em&gt;摘录时间：2026-03-14&lt;/em&gt;&lt;/p&gt;&#10;</description></item></channel></rss>