<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>XiaoGao 的个人博客</title>
  
  <subtitle>从寄存器到推理，把设备、数据与智能连起来。</subtitle>
  <link href="https://xiaogao-code.space/atom.xml" rel="self"/>
  
  <link href="https://xiaogao-code.space/"/>
  <updated>2026-10-23T06:11:10.000Z</updated>
  <id>https://xiaogao-code.space/</id>
  
  <author>
    <name>XiaoGao</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>嵌入式学习路线图：9 个仓库串成一条从电路到系统的主线</title>
    <link href="https://xiaogao-code.space/2026/10/22/embedded-roadmap/"/>
    <id>https://xiaogao-code.space/2026/10/22/embedded-roadmap/</id>
    <published>2026-10-22T02:00:00.000Z</published>
    <updated>2026-10-23T06:11:10.000Z</updated>
    
    <content type="html"><![CDATA[<p>九门课、九个仓库，如果只是平铺在 GitHub 首页，它们就只是一堆孤立的资料。这个索引仓库做了一件事：给它们排一个顺序，让「先学什么、后学什么、为什么是这个顺序」有一个明确的答案。</p><span id="more"></span><h2 id="它是什么"><a href="#它是什么" class="headerlink" title="它是什么"></a>它是什么</h2><p>这是一个<strong>索引仓库</strong>，不存放课程文件本身。它把分散在 9 个独立仓库中的嵌入式课程笔记，按一条从语言基础到系统开发的主线串联起来，形成一条可执行的阅读路径。每个仓库只负责一个明确的知识域，可以单独克隆、单独阅读，也可以按编号顺序推进。</p><p>目标写得很清楚：<strong>读得懂数据手册、点亮一颗芯片、交付一版固件</strong>。</p><h2 id="三个阶段，九门课"><a href="#三个阶段，九门课" class="headerlink" title="三个阶段，九门课"></a>三个阶段，九门课</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">基础 ──&gt; 硬件 ──&gt; 系统</span><br><span class="line"></span><br><span class="line">01 C 语言               03 模拟电路      06 STM32 单片机</span><br><span class="line">02 数据结构与算法       04 数字电路与组成 07 FreeRTOS</span><br><span class="line">                        05 原理图与 PCB   08 Linux 与 Shell</span><br><span class="line">                                         09 Linux 应用层</span><br></pre></td></tr></table></figure><table><thead><tr><th>编号</th><th>仓库</th><th>内容</th></tr></thead><tbody><tr><td>01</td><td>c-systems-programming-handbook</td><td>C 核心语法、指针、预处理器、自定义类型、动态内存与文件操作</td></tr><tr><td>02</td><td>data-structures-and-algorithms</td><td>数组、链表、栈、队列，查找、排序与复杂度分析</td></tr><tr><td>03</td><td>analog-circuits-and-components</td><td>电学基础、电阻电容电感、二极管&#x2F;三极管&#x2F;MOS 管与典型电路</td></tr><tr><td>04</td><td>digital-logic-and-computer-organization</td><td>逻辑门、触发器、冯诺依曼模型、指令集、总线与引导流程</td></tr><tr><td>05</td><td>schematic-and-pcb-design</td><td>嘉立创 EDA 原理图、PCB 布局布线、封装设计与焊接</td></tr><tr><td>06</td><td>stm32-mcu-development-notes</td><td>GPIO、中断、定时器、DMA、ADC、SPI、CAN、以太网与低功耗</td></tr><tr><td>07</td><td>freertos-learning-notes</td><td>任务调度、内核移植、队列、信号量、事件组与内存管理</td></tr><tr><td>08</td><td>linux-shell-regex-notes</td><td>Ubuntu 系统管理、Shell 脚本与正则表达式</td></tr><tr><td>09</td><td>linux-application-development-notes</td><td>GCC 工具链、文件 I&#x2F;O、进程线程、IPC、Socket 与 epoll</td></tr></tbody></table><p>顺序不是课程表本身，而是<strong>依赖关系</strong>：没有指针和内存模型，看不懂寄存器位域；不理解触发器，就理解不了定时器与中断；没跑过裸机，RTOS 的调度器只是黑盒；不熟悉系统调用，Linux 应用层就只在背 API。</p><h2 id="统一的仓库约定"><a href="#统一的仓库约定" class="headerlink" title="统一的仓库约定"></a>统一的仓库约定</h2><p>九个仓库遵循同一套结构，便于批量阅读与检索：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">repository/</span><br><span class="line">├── README.md            中文索引与内容概览</span><br><span class="line">├── README-English.md    English index</span><br><span class="line">└── docs/</span><br><span class="line">    ├── &lt;title&gt;.pdf      课程文档（只读，便于在线预览）</span><br><span class="line">    └── &lt;title&gt;.docx     可编辑版本</span><br></pre></td></tr></table></figure><p>约定里有一条边界值得借鉴：<strong>README 只做索引与学习建议，完整定义、图示与示例以 <code>docs/</code> 中的文档为准</strong>。也就是说，索引不复制正文，避免同一份知识在两处维护、两处过期。每个仓库末尾还有一段「关键词」，列出覆盖的技术术语，方便搜索时定位。</p><p>文档同时提供 PDF 与 DOCX：PDF 用于在线预览，DOCX 用于批注和摘录——同一内容的两种消费方式。</p><h2 id="一个值得记住的细节"><a href="#一个值得记住的细节" class="headerlink" title="一个值得记住的细节"></a>一个值得记住的细节</h2><p>这个仓库本身没有一行代码，但它可能是整个体系里最有价值的一个——因为它回答的是「路径」问题。资料越多，路径越稀缺：九个仓库各自都完整，但没有排序时，新人面对的是九扇没有门牌的门。</p><p>把「阅读顺序」单独做成一个版本化的仓库，还有一个隐性好处：路线图和课程仓库可以独立演进。课程内容更新不影响路线，路线调整也不需要动任何一门课的正文。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/embedded-roadmap">embedded-roadmap</a></li></ul>]]></content>
    
    
    <summary type="html">一个不存放课程文件的索引仓库——把分散在 9 个独立仓库中的嵌入式笔记按「语言 → 硬件 → 系统」三阶段串联，给出可执行的阅读路径与统一的仓库约定。</summary>
    
    
    
    <category term="嵌入式开发" scheme="https://xiaogao-code.space/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="学习路线" scheme="https://xiaogao-code.space/tags/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/"/>
    
    <category term="硬件基础" scheme="https://xiaogao-code.space/tags/%E7%A1%AC%E4%BB%B6%E5%9F%BA%E7%A1%80/"/>
    
    <category term="嵌入式" scheme="https://xiaogao-code.space/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="索引仓库" scheme="https://xiaogao-code.space/tags/%E7%B4%A2%E5%BC%95%E4%BB%93%E5%BA%93/"/>
    
    <category term="STM32" scheme="https://xiaogao-code.space/tags/STM32/"/>
    
    <category term="FreeRTOS" scheme="https://xiaogao-code.space/tags/FreeRTOS/"/>
    
    <category term="Linux" scheme="https://xiaogao-code.space/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>AI 基础手册：37 篇笔记从线性代数走到知识图谱</title>
    <link href="https://xiaogao-code.space/2026/10/21/ai-foundations-handbook/"/>
    <id>https://xiaogao-code.space/2026/10/21/ai-foundations-handbook/</id>
    <published>2026-10-21T02:00:00.000Z</published>
    <updated>2026-10-23T06:11:10.000Z</updated>
    
    <content type="html"><![CDATA[<p>训练集准确率 98%，验证集 92%，上线一周后掉到 70%。这类问题几乎无法靠继续调参解决——往回追，原因往往不在某一行代码，而在三处同时空着：不清楚泛化误差从哪里来，不知道梯度为什么会消失，也说不准模型的假设在什么数据上不成立。</p><p>这套笔记就是按「把空补上」的顺序整理的。</p><span id="more"></span><h2 id="规模与原则"><a href="#规模与原则" class="headerlink" title="规模与原则"></a>规模与原则</h2><table><thead><tr><th>指标</th><th align="right">数值</th></tr></thead><tbody><tr><td>笔记</td><td align="right">37 篇</td></tr><tr><td>板块</td><td align="right">7 个</td></tr><tr><td>正文</td><td align="right">约 30 万字</td></tr><tr><td>块级公式</td><td align="right">258 个</td></tr><tr><td>Markdown 行数</td><td align="right">9,613 行</td></tr><tr><td>新手提示</td><td align="right">113 条</td></tr></tbody></table><p>四条写作原则：</p><ul><li><strong>公式可验算</strong>——258 个块级公式，逐项核对变量含义与推导步骤；</li><li><strong>术语有出处</strong>——名词首次出现给出英文全称与缩写，篇末汇总成表；</li><li><strong>体例统一</strong>——37 篇共用一套结构，翻到任何一篇都知道去哪里找结论；</li><li><strong>面向工程</strong>——每个方法都交代局限与失效场景，不只讲它为什么有效。</li></ul><h2 id="内容地图"><a href="#内容地图" class="headerlink" title="内容地图"></a>内容地图</h2><p>三十秒版本：<code>001</code>–<code>006</code> 给数学工具，<code>007</code>–<code>015</code> 给算法范式，<code>016</code>–<code>032</code> 拆网络结构与训练方法，<code>033</code>–<code>036</code> 看深度学习之外的路线。</p><table><thead><tr><th>板块</th><th align="right">篇数</th><th>内容</th></tr></thead><tbody><tr><td>000 开篇</td><td align="right">1</td><td>技术路线、知识地图</td></tr><tr><td>001 数学基础</td><td align="right">6</td><td>线性代数、概率论、数理统计、最优化、信息论、形式逻辑</td></tr><tr><td>002 机器学习</td><td align="right">9</td><td>概论、回归、朴素贝叶斯、逻辑回归、决策树、SVM、集成、聚类、降维</td></tr><tr><td>003 人工神经网络</td><td align="right">6</td><td>生理背景、感知器、多层感知器、RBF、SOM、模糊网络</td></tr><tr><td>004 深度学习</td><td align="right">6</td><td>概述、前馈网络、正则化、优化、自编码器、深度强化学习</td></tr><tr><td>005 框架下的神经网络</td><td align="right">5</td><td>深度信念网络、卷积、循环、对抗生成、长短期记忆</td></tr><tr><td>006 深度学习之外</td><td align="right">4</td><td>概率图模型、集群智能、迁移学习、知识图谱</td></tr></tbody></table><h2 id="三条学习路线"><a href="#三条学习路线" class="headerlink" title="三条学习路线"></a>三条学习路线</h2><p><strong>一周速览</strong>（时间有限时串起最小完整链条）：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">000 导论 → 007 机器学习概论 → 018 多层感知器</span><br><span class="line">        → 023 深度前馈网络 → 029 卷积神经网络</span><br></pre></td></tr></table></figure><p>从「AI 有哪些路线」出发，先建立评估与泛化概念，再看反向传播如何训练网络，最后落到一个具体结构上。</p><p><strong>完整通关</strong>：按编号顺序读完全部 37 篇。板块内部有依赖，跨板块跳跃时建议回头补对应的数学篇目——训练技巧（022–027）与优化、信息论（001–006）对照阅读；主流骨架（028–032）建议配合论文原文。</p><p><strong>专题直达</strong>：</p><table><thead><tr><th>想查什么</th><th>去哪里</th></tr></thead><tbody><tr><td>过拟合、偏差与方差</td><td>007、024</td></tr><tr><td>梯度消失与梯度爆炸</td><td>025、030、032</td></tr><tr><td>注意力机制</td><td>032</td></tr><tr><td>生成模型</td><td>026、031</td></tr><tr><td>卷积的感受野与参数共享</td><td>029</td></tr><tr><td>概率图模型与近似推断</td><td>033</td></tr><tr><td>预训练、微调与负迁移</td><td>035</td></tr><tr><td>知识表示与推理</td><td>006、036</td></tr></tbody></table><h2 id="每篇的统一体例"><a href="#每篇的统一体例" class="headerlink" title="每篇的统一体例"></a>每篇的统一体例</h2><p>37 篇共用一套结构，读熟一篇就等于读熟了全部：</p><table><thead><tr><th>组成部分</th><th>作用</th></tr></thead><tbody><tr><td>读前须知</td><td>开头三行：需要什么前置、这一篇在地图上的位置、读完之后能做什么</td></tr><tr><td>分节</td><td>「一、二、三」为大节，下设「1.1、1.2」小节，标题本身即结论</td></tr><tr><td>补充说明</td><td>对易错点的展开：补充推导、概念辨析或工程取舍</td></tr><tr><td>新手提示</td><td>引用块，解释最容易卡住的术语与公式</td></tr><tr><td>四个常见误区</td><td>篇末先破后立，列出最容易理解偏的四处</td></tr><tr><td>要点回顾</td><td>编号列表，10～12 条，可当复习提纲</td></tr><tr><td>名词汇总</td><td>名称 &#x2F; 英文全称 &#x2F; 英文缩写 &#x2F; 简介，四列成表</td></tr></tbody></table><h2 id="排版上的取舍"><a href="#排版上的取舍" class="headerlink" title="排版上的取舍"></a>排版上的取舍</h2><ul><li>正文不写行内公式；α、σ、∇、⊙ 这类符号直接用 Unicode 字符，脱离渲染器也能读；</li><li>只对必要推导使用块级公式，GitHub 原生渲染 LaTeX，无需插件;</li><li>中文一律使用弯引号；术语首次出现给出英文全称与缩写；</li><li>全部文件 UTF-8 无 BOM，三个平台打开均无乱码。</li></ul><p>这些约定看起来琐碎，但它们决定了笔记在 GitHub、终端和本地编辑器里是否都「读得下去」——笔记的第一读者永远是不确定环境下的自己。</p><h2 id="一个值得记住的细节"><a href="#一个值得记住的细节" class="headerlink" title="一个值得记住的细节"></a>一个值得记住的细节</h2><p>「四个常见误区 + 要点回顾 + 名词汇总」这个组合，是把笔记从「记录」变成「可复习」的关键。记录只服务第一次阅读，复习提纲服务第 N 次；而名词四列表让一篇 30 万字的库可以在检索时被当作词典用。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/ai-foundations-handbook">ai-foundations-handbook</a></li></ul>]]></content>
    
    
    <summary type="html">37 篇可逐行验算的中文 AI 笔记，7 个板块、30 万字、258 个块级公式——从数学基础、经典机器学习、神经网络到深度学习之外的图模型与知识图谱，每篇共用一套体例。</summary>
    
    
    
    <category term="人工智能" scheme="https://xiaogao-code.space/categories/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
    <category term="人工智能" scheme="https://xiaogao-code.space/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    <category term="机器学习" scheme="https://xiaogao-code.space/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="深度学习" scheme="https://xiaogao-code.space/tags/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="神经网络" scheme="https://xiaogao-code.space/tags/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/"/>
    
    <category term="数学基础" scheme="https://xiaogao-code.space/tags/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/"/>
    
    <category term="知识图谱" scheme="https://xiaogao-code.space/tags/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/"/>
    
    <category term="学习路线" scheme="https://xiaogao-code.space/tags/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/"/>
    
  </entry>
  
  <entry>
    <title>双轴步进电机同步运动控制：Sync_CalcParams 与 AVR446 梯形加减速</title>
    <link href="https://xiaogao-code.space/2026/10/10/sync-calc-params-motion-control/"/>
    <id>https://xiaogao-code.space/2026/10/10/sync-calc-params-motion-control/</id>
    <published>2026-10-10T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>两轴各走各的梯形曲线，步数不同就会不同时停。这个项目用一个漂亮的数学观察解决了同步问题：只要两轴的 <code>speed/accel</code>、<code>speed/decel</code> 相同，三段运动时间就完全一致——于是把从轴参数按步数比例统一缩放即可。全整数运算，无浮点、无查表。</p><span id="more"></span><h2 id="系统架构"><a href="#系统架构" class="headerlink" title="系统架构"></a>系统架构</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">┌───────────────────────────┐   TCP :5000    ┌───────────────────────────┐</span><br><span class="line">│  Python 上位机            │ &lt;============&gt; │  ESP8266（TCP 透传）      │</span><br><span class="line">│  指令下发 / 轨迹可视化    │                └─────────────┬─────────────┘</span><br><span class="line">└───────────────────────────┘                              │ USART3 115200</span><br><span class="line">                                                           v</span><br><span class="line">┌──────────────────────────────────────────────────────────────────────┐</span><br><span class="line">│                          STM32F103VET6                              │</span><br><span class="line">│                                                                      │</span><br><span class="line">│  USART3 中断（IDLE 帧判定）→ 指令解析（8 参数）                      │</span><br><span class="line">│      → Sync_CalcParams 双轴同步算法（参数缩放）                      │</span><br><span class="line">│      → MSD_Move1 / MSD_Move2 同时启动                                │</span><br><span class="line">│                                                                      │</span><br><span class="line">│  TIM3 中断 → 电机 1 脉冲（加速 / 匀速 / 减速状态机）                │</span><br><span class="line">│  TIM4 中断 → 电机 2 脉冲（加速 / 匀速 / 减速状态机）                │</span><br><span class="line">│                                                                      │</span><br><span class="line">│  USART1 115200 → 调试信息打印                                        │</span><br><span class="line">└──────────────────────────────────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h2 id="核心算法一：Sync-CalcParams-双轴同步"><a href="#核心算法一：Sync-CalcParams-双轴同步" class="headerlink" title="核心算法一：Sync_CalcParams 双轴同步"></a>核心算法一：Sync_CalcParams 双轴同步</h2><p><strong>问题</strong>：两轴各自独立执行梯形加减速时，若步数不同，就会在不同时刻停止，无法同步到达。</p><p><strong>原理</strong>：梯形速度曲线的关键时间参数为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">t_accel = speed / accel      （加速段时间）</span><br><span class="line">t_decel = speed / decel      （减速段时间）</span><br></pre></td></tr></table></figure><p>只要两轴的 <code>speed/accel</code>、<code>speed/decel</code> 相同，三段运动时间就完全一致。因此选出步数较多的轴为<strong>主轴</strong>（参数不变），<strong>从轴</strong>的速度与加&#x2F;减速度统一乘以步数比例：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ratio       = steps_slave / steps_master</span><br><span class="line">speed_slave = speed_master × ratio</span><br><span class="line">accel_slave = accel_master × ratio</span><br><span class="line">decel_slave = decel_master × ratio</span><br></pre></td></tr></table></figure><p><code>ratio</code> 在时间公式中被约去：<code>t = (speed×ratio) / (accel×ratio) = speed / accel</code>，从轴在时间轴上与主轴完全对齐。步数相差多少，缩放比例就是多少，与方向无关。</p><p><strong>示例</strong>：<code>2000 200 200 75 | 1000 200 200 75</code></p><table><thead><tr><th>参数</th><th align="right">电机 1（主轴）</th><th align="right">电机 2（从轴，缩放后）</th></tr></thead><tbody><tr><td>步数</td><td align="right">2000</td><td align="right">1000</td></tr><tr><td>速度</td><td align="right">75</td><td align="right">75 × 0.5 &#x3D; <strong>37</strong></td></tr><tr><td>加速度</td><td align="right">200</td><td align="right">200 × 0.5 &#x3D; <strong>100</strong></td></tr><tr><td>减速度</td><td align="right">200</td><td align="right">200 × 0.5 &#x3D; <strong>100</strong></td></tr></tbody></table><p>电机 2 以一半的速度、一半的加速度走一半的路程，与电机 1 同时出发、同时到达。</p><p><strong>工程保护</strong>：缩放乘法用 32 位中间量防溢出，缩放结果下限钳位为 1 杜绝除零，步数为 0 的轴跳过计算，步数取绝对值比较（方向不影响同步）。</p><h2 id="核心算法二：AVR446-整数梯形加减速"><a href="#核心算法二：AVR446-整数梯形加减速" class="headerlink" title="核心算法二：AVR446 整数梯形加减速"></a>核心算法二：AVR446 整数梯形加减速</h2><p>速度规划基于 Atmel AVR446 应用笔记的整数算法，全部整数乘除与平方根查算：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">min_delay  = A_T_x100 / speed                            # 最高速度最小脉冲间隔</span><br><span class="line">step_delay = T1_FREQ_148 × sqrt(A_SQ / accel) / 100      # 加速度首步脉冲间隔</span><br><span class="line">max_s_lim  = speed² / (A_x20000 × accel / 100)           # 达到最高速度所需步数</span><br><span class="line">accel_lim  = step × decel / (accel + decel)              # 开始减速的临界步数</span><br></pre></td></tr></table></figure><p>定时器中断内以递推方式逼近理论速度曲线：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">new_delay = delay - (2 × delay + rest) / (4 × accel_count + 1)</span><br><span class="line">rest      = (2 × delay + rest) % (4 × accel_count + 1)</span><br></pre></td></tr></table></figure><p>余数 <code>rest</code> 携带到下一次迭代，使整数运算不产生累计误差：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">STOP ──&gt; ACCEL ──&gt; RUN ──&gt; DECEL ──&gt; STOP</span><br><span class="line">  启动     加速段      匀速段     减速段     到达目标步数</span><br></pre></td></tr></table></figure><p>每个脉冲下降沿完成一次状态评估与延时更新（软件步进计数），保证双轴脉冲互不干扰。</p><h2 id="通信协议"><a href="#通信协议" class="headerlink" title="通信协议"></a>通信协议</h2><p>文本指令协议：8 个整数、空格分隔、<code>\r\n</code> 结尾，以 IDLE 空闲中断判定帧结束，无帧头帧尾开销。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">step1 accel1 decel1 speed1 step2 accel2 decel2 speed2</span><br><span class="line"></span><br><span class="line">示例：2000 200 200 75 1000 200 200 75</span><br></pre></td></tr></table></figure><p>用户只需给出两轴各自步数与主轴速度参数，从轴参数由固件自动按比例缩放。</p><h2 id="硬件与软件"><a href="#硬件与软件" class="headerlink" title="硬件与软件"></a>硬件与软件</h2><table><thead><tr><th>器件</th><th>说明</th></tr></thead><tbody><tr><td>MCU</td><td>STM32F103VET6（Cortex-M3，72 MHz，512 KB Flash）</td></tr><tr><td>执行机构</td><td>微步细分步进电机驱动器 ×2（PUL &#x2F; DIR &#x2F; ENA）</td></tr><tr><td>无线模块</td><td>ESP8266（AT 固件，STA 模式 TCP 客户端）</td></tr></tbody></table><p><strong>固件架构</strong>：裸机前后台——中断负责实时脉冲输出与串口不定长帧接收，主循环负责指令解析与运动调度，全程无阻塞延时。双定时器独立中断通道（TIM3&#x2F;TIM4）驱动两轴，时基精度 1 µs；DWT 周期计数器实现微秒级精确延时；ESP8266 检测到 <code>CLOSED</code> 后自动重连。</p><p><strong>Python 上位机</strong>（<code>server.py</code>）：TCP 服务器（端口 5000）+ Matplotlib 实时可视化——按脉冲当量（默认 2000 步&#x2F;cm）换算位移，实时绘制双轴位置与运动轨迹，移动记录持久化，后台线程打印 STM32 调试信息。</p><h2 id="一个值得记住的细节"><a href="#一个值得记住的细节" class="headerlink" title="一个值得记住的细节"></a>一个值得记住的细节</h2><p>两轴步数相差越悬殊，从轴速度越低；低速时梯形曲线可能退化为纯加减速（无匀速段），但<strong>时间同步仍然成立</strong>——因为同步的前提是时间参数比例一致，而不是速度曲线形状一致。这个不变量是整套算法能够成立的关键。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/sync-calc-params-motion-control">sync-calc-params-motion-control</a></li></ul>]]></content>
    
    
    <summary type="html">双轴步进电机同步运动控制完整工程——Sync_CalcParams 参数比例缩放实现两轴同时启停，AVR446 整数递推梯形加减速无浮点规划速度曲线，ESP8266 无线透传 + Python 上位机实时轨迹可视化。</summary>
    
    
    
    <category term="机器人" scheme="https://xiaogao-code.space/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    
    
    <category term="STM32" scheme="https://xiaogao-code.space/tags/STM32/"/>
    
    <category term="步进电机" scheme="https://xiaogao-code.space/tags/%E6%AD%A5%E8%BF%9B%E7%94%B5%E6%9C%BA/"/>
    
    <category term="运动控制" scheme="https://xiaogao-code.space/tags/%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/"/>
    
    <category term="AVR446" scheme="https://xiaogao-code.space/tags/AVR446/"/>
    
    <category term="ESP8266" scheme="https://xiaogao-code.space/tags/ESP8266/"/>
    
    <category term="上位机" scheme="https://xiaogao-code.space/tags/%E4%B8%8A%E4%BD%8D%E6%9C%BA/"/>
    
    <category term="梯形加减速" scheme="https://xiaogao-code.space/tags/%E6%A2%AF%E5%BD%A2%E5%8A%A0%E5%87%8F%E9%80%9F/"/>
    
    <category term="整数算法" scheme="https://xiaogao-code.space/tags/%E6%95%B4%E6%95%B0%E7%AE%97%E6%B3%95/"/>
    
    <category term="Wi-Fi通信" scheme="https://xiaogao-code.space/tags/Wi-Fi%E9%80%9A%E4%BF%A1/"/>
    
  </entry>
  
  <entry>
    <title>STM32F407 智能定时用电控制器：四状态机 + 1ms 分时调度</title>
    <link href="https://xiaogao-code.space/2026/09/29/stm32f407-smart-timer-controller/"/>
    <id>https://xiaogao-code.space/2026/09/29/stm32f407-smart-timer-controller/</id>
    <published>2026-09-29T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>倒计时控制继电器通断负载，听起来简单，做扎实却不容易。这个项目基于 STM32F407VE，用一套 1ms 分时任务调度把倒计时、数码管扫描、按键消抖、串口解析、蜂鸣器节奏和温度保护全部塞进裸机主循环，从未使用中断——时序可推演、行为可预测。</p><span id="more"></span><h2 id="功能全景"><a href="#功能全景" class="headerlink" title="功能全景"></a>功能全景</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">按键 + 串口双通道设置 → 四位数码管 MM.SS 实时显示 → 启动后继电器吸合</span><br><span class="line">→ 每秒短鸣 + LED 快闪 → 倒计时归零报警（蜂鸣器周期鸣叫）→ 一键停止/复位</span><br></pre></td></tr></table></figure><h2 id="四状态机设计"><a href="#四状态机设计" class="headerlink" title="四状态机设计"></a>四状态机设计</h2><table><thead><tr><th>状态</th><th>行为</th></tr></thead><tbody><tr><td>设置</td><td>可调整时间；继电器断开 &#x2F; LED 熄灭 &#x2F; 蜂鸣器静音</td></tr><tr><td>运行</td><td>每秒倒计时递减；继电器吸合 &#x2F; LED 快闪 &#x2F; 每秒短鸣</td></tr><tr><td>暂停</td><td>倒计时冻结；继电器断开 &#x2F; LED 熄灭 &#x2F; 蜂鸣器静音</td></tr><tr><td>报警</td><td>时间到；继电器断开 &#x2F; LED 闪烁 &#x2F; 周期鸣叫，K4&#x2F;K5&#x2F;<code>B</code> 停止</td></tr></tbody></table><p>状态边界清晰：仅 run 递减且继电器吸合，set&#x2F;pause 每周期强制复位输出，alarm 仅响应停止键——把状态误操作在逻辑层面清零。上电默认进入设置状态、默认 60 秒，倒计时归零自动断开继电器，防止负载超时运行。</p><h2 id="1ms-分时调度"><a href="#1ms-分时调度" class="headerlink" title="1ms 分时调度"></a>1ms 分时调度</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">app_timer_1ms_task()                                [SysTick 每 1ms 触发]</span><br><span class="line">  ├── system_ms++                                   系统毫秒计数</span><br><span class="line">  ├── 每 100ms → temperature_control_safe_task()    温度保护复查</span><br><span class="line">  ├── display_scan()                                数码管扫描一位（4ms 一轮）</span><br><span class="line">  ├── key_scan() → key_process()                    按键采样（20ms 消抖）</span><br><span class="line">  ├── usart_receive_check() → usart_process()       串口轮询与命令解析</span><br><span class="line">  ├── 每 1000ms → run 状态倒计时递减</span><br><span class="line">  ├── run_beep_task() / alarm_beep_task()           蜂鸣器节奏调度</span><br><span class="line">  ├── LED 翻转调度（run 40ms / alarm 120ms）</span><br><span class="line">  └── display_update_buffer()                       刷新显示缓存</span><br></pre></td></tr></table></figure><p>单一 1ms 心跳分频出 100ms 和 1000ms 多级节拍，全程无阻塞延时。</p><h2 id="关键技术点"><a href="#关键技术点" class="headerlink" title="关键技术点"></a>关键技术点</h2><h3 id="寄存器级串口驱动"><a href="#寄存器级串口驱动" class="headerlink" title="寄存器级串口驱动"></a>寄存器级串口驱动</h3><p>USART1（PA9&#x2F;PA10，AF7）直接操作 MODER&#x2F;OTYPER&#x2F;AFR&#x2F;BRR 寄存器完成初始化；波特率用分数分频公式计算，fraction 带四舍五入与满 16 进位修正，84MHz → 9600bps 精确得到 <code>BRR = 0x222E</code>；收发查询 TXE&#x2F;RXNE 标志，不占中断资源。</p><h3 id="硬件-PWM-蜂鸣器"><a href="#硬件-PWM-蜂鸣器" class="headerlink" title="硬件 PWM 蜂鸣器"></a>硬件 PWM 蜂鸣器</h3><p>TIM4_CH1（PD12）1MHz 时基 + PWM1 模式：频率 &#x3D; 1MHz&#x2F;ARR 控制音调（100Hz~10kHz 越界钳位），占空比控制音量。变调时对比较值做防溢出钳位，切换平滑。</p><h3 id="数码管动态扫描"><a href="#数码管动态扫描" class="headerlink" title="数码管动态扫描"></a>数码管动态扫描</h3><p>共阴极四位管：PB8<del>PB15 段选、PC0</del>PC3 位选，1ms 点亮一位、4ms 刷新一轮。扫描流程”先消隐后输出”，杜绝换位瞬间的”鬼影”。</p><h3 id="20ms-按键消抖"><a href="#20ms-按键消抖" class="headerlink" title="20ms 按键消抖"></a>20ms 按键消抖</h3><p>5 键逐 1ms 采样，电平连续稳定 20 个周期才确认；仅在稳定键值”变化”时上报一次（边沿触发），长按零重复。</p><h3 id="时间边界防溢出"><a href="#时间边界防溢出" class="headerlink" title="时间边界防溢出"></a>时间边界防溢出</h3><p>+1min 上限 98:00、+10s 上限 99:49、-10s 下限 00:10 的钳位设计，杜绝 uint16 溢出与两位数显示越界。</p><h3 id="温度失效保护"><a href="#温度失效保护" class="headerlink" title="温度失效保护"></a>温度失效保护</h3><p>TIM3_CH1&#x2F;PB4 温度闭环输出强制关闭：停计数 → 关通道 → CCR1 清零 → 引脚拉低。上电立即执行，运行中每 100ms 复查，保证任何状态下都不会误动作。</p><h2 id="串口命令协议（9600-8N1）"><a href="#串口命令协议（9600-8N1）" class="headerlink" title="串口命令协议（9600 8N1）"></a>串口命令协议（9600 8N1）</h2><table><thead><tr><th>命令</th><th>功能</th></tr></thead><tbody><tr><td><code>S</code></td><td>启动 &#x2F; 暂停（与 K3 同一入口）</td></tr><tr><td><code>R</code></td><td>复位</td></tr><tr><td><code>Q</code></td><td>查询状态：<code>time=01:30 set, relay off, temp safe</code></td></tr><tr><td><code>M</code> &#x2F; <code>T</code> &#x2F; <code>A</code></td><td>+1 分钟 &#x2F; +10 秒 &#x2F; -10 秒</td></tr><tr><td><code>B</code></td><td>停止报警</td></tr><tr><td><code>Dmmss</code></td><td>设置时间，如 <code>D0130</code> &#x3D; 01:30</td></tr></tbody></table><p>串口命令复用按键处理函数，按键与串口行为完全一致，消除双通路逻辑分叉。非法输入（秒 ≥ 60、零时长、运行中设置）逐项拒绝并回执原因。</p><h2 id="蜂鸣器与-LED-提示编码"><a href="#蜂鸣器与-LED-提示编码" class="headerlink" title="蜂鸣器与 LED 提示编码"></a>蜂鸣器与 LED 提示编码</h2><table><thead><tr><th>事件</th><th>蜂鸣器</th><th>LED</th></tr></thead><tbody><tr><td>启动 &#x2F; 每秒递减</td><td>短鸣 120ms @ 2700Hz</td><td>40ms 周期翻转</td></tr><tr><td>倒计时归零报警</td><td>120ms 鸣 &#x2F; 120ms 停 @ 4200Hz</td><td>120ms 周期翻转</td></tr><tr><td>设置 &#x2F; 暂停</td><td>静音</td><td>熄灭</td></tr></tbody></table><p>零硬件成本，靠节奏编码提升状态可读性。</p><h2 id="工程分层"><a href="#工程分层" class="headerlink" title="工程分层"></a>工程分层</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">APL 应用入口层     main.c（初始化 → 1ms 调度循环）</span><br><span class="line">HAL 硬件抽象层     board_config.h（引脚集中定义）</span><br><span class="line">                   ├─ app_timer.c   四状态机 / 倒计时 / 按键与串口处理</span><br><span class="line">                   ├─ tim.c         1MHz 时基 + __weak 回调框架</span><br><span class="line">                   ├─ bsp_output.c  LED / 蜂鸣器 / 继电器</span><br><span class="line">                   ├─ bsp_display.c 数码管动态扫描</span><br><span class="line">                   ├─ bsp_key.c     按键扫描与消抖</span><br><span class="line">                   ├─ bsp_usart.c   寄存器级收发</span><br><span class="line">                   └─ temp_safe.c   温度失效保护</span><br><span class="line">SPL / CMSIS        ST 官方库（CMSIS V4.2 + SPL V1.5.0）</span><br></pre></td></tr></table></figure><p>全工程无中断、无 DMA、无 RTOS，引脚集中定义、Doxygen 全量注释，是裸机任务调度与嵌入式工程化实践的好参考。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/stm32f407-smart-timer-power-controller">stm32f407-smart-timer-power-controller</a></li></ul>]]></content>
    
    
    <summary type="html">STM32F407 智能定时用电控制器实战——四状态机互斥保护、SysTick 1ms 分时任务调度、寄存器级 USART 驱动、数码管动态扫描、20ms 按键消抖与温度失效保护。</summary>
    
    
    
    <category term="嵌入式开发" scheme="https://xiaogao-code.space/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="STM32F407" scheme="https://xiaogao-code.space/tags/STM32F407/"/>
    
    <category term="状态机" scheme="https://xiaogao-code.space/tags/%E7%8A%B6%E6%80%81%E6%9C%BA/"/>
    
    <category term="裸机调度" scheme="https://xiaogao-code.space/tags/%E8%A3%B8%E6%9C%BA%E8%B0%83%E5%BA%A6/"/>
    
    <category term="数码管" scheme="https://xiaogao-code.space/tags/%E6%95%B0%E7%A0%81%E7%AE%A1/"/>
    
    <category term="PWM蜂鸣器" scheme="https://xiaogao-code.space/tags/PWM%E8%9C%82%E9%B8%A3%E5%99%A8/"/>
    
    <category term="寄存器开发" scheme="https://xiaogao-code.space/tags/%E5%AF%84%E5%AD%98%E5%99%A8%E5%BC%80%E5%8F%91/"/>
    
    <category term="SysTick" scheme="https://xiaogao-code.space/tags/SysTick/"/>
    
    <category term="分时调度" scheme="https://xiaogao-code.space/tags/%E5%88%86%E6%97%B6%E8%B0%83%E5%BA%A6/"/>
    
    <category term="USART" scheme="https://xiaogao-code.space/tags/USART/"/>
    
  </entry>
  
  <entry>
    <title>NeoInsight：LangChain + Neo4j 的知识图谱问答系统</title>
    <link href="https://xiaogao-code.space/2026/09/22/neo-in-sight-rag-neo4j/"/>
    <id>https://xiaogao-code.space/2026/09/22/neo-in-sight-rag-neo4j/</id>
    <published>2026-09-22T02:00:00.000Z</published>
    <updated>2026-10-23T06:11:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>大模型能背下训练数据里的事实，但背不下你图数据库里的三元组。RAG 的常见做法是检索文本段落塞进上下文，而图谱路线更直接：让模型把问题翻译成 Cypher，在图上查完再把结果讲回人话。</p><p>NeoInsight 就是这个闭环的一个完整、可运行的演示。</p><span id="more"></span><h2 id="一条链路，四步闭环"><a href="#一条链路，四步闭环" class="headerlink" title="一条链路，四步闭环"></a>一条链路，四步闭环</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">用户提问</span><br><span class="line">   ↓</span><br><span class="line">LLM 基于图谱 Schema 生成 Cypher</span><br><span class="line">   ↓</span><br><span class="line">Neo4j 执行查询</span><br><span class="line">   ↓</span><br><span class="line">LLM 基于查询结果生成自然语言回答</span><br></pre></td></tr></table></figure><p>全过程透明——响应里同时返回生成的 Cypher 和查询结果，出了问题能立刻分辨是「模型翻译错了」还是「图里没有这条数据」。这一点在调试 RAG 系统时比什么都重要。</p><h2 id="技术栈"><a href="#技术栈" class="headerlink" title="技术栈"></a>技术栈</h2><table><thead><tr><th>层</th><th>技术</th></tr></thead><tbody><tr><td>前端</td><td>Vue 2.6 · Element UI · Vuex · Vue Router · Axios（Vue CLI 5）</td></tr><tr><td>后端</td><td>Python · Flask 3 · neo4j 官方驱动 · LangChain-OpenAI · pandas &#x2F; openpyxl</td></tr><tr><td>存储</td><td>Neo4j 5.x</td></tr><tr><td>大模型</td><td>DeepSeek &#x2F; Kimi（OpenAI 兼容 API）</td></tr></tbody></table><p>模型可切换：内置 kimi 与 deepseek 两个 OpenAI 兼容供应商，在常量文件里加一项、环境变量里配一个 Key 就能扩展新模型。</p><h2 id="四个值得留意的设计"><a href="#四个值得留意的设计" class="headerlink" title="四个值得留意的设计"></a>四个值得留意的设计</h2><p><strong>只读安全守卫</strong>。LLM 生成的 Cypher 不可信，正则拦截 <code>CREATE / MERGE / DELETE / SET</code> 等写操作，保证图谱数据安全。把「模型输出当作不可信输入」是 AI 应用的基本功。</p><p><strong>「宏定义」式常量中心</strong>。后端 <code>app/constants.py</code>、前端 <code>src/constants.js</code> 各一个文件，集中所有重要数据：端口、限制、错误码、数据导入结构、提示词模板，分 9 个分区管理。改配置不用翻代码，敏感项（Neo4j 密码、API Key）只放 <code>.env</code>。</p><p><strong>统一响应格式与业务错误码</strong>。所有接口返回 <code>{&quot;code&quot;: 0, &quot;message&quot;: &quot;success&quot;, &quot;data&quot;: ...}</code>：</p><table><thead><tr><th>code</th><th>含义</th></tr></thead><tbody><tr><td>40000</td><td>请求参数不合法（空问题 &#x2F; 超长 &#x2F; 不支持的模型）</td></tr><tr><td>50200</td><td>模型服务调用失败</td></tr><tr><td>50300</td><td>关键依赖（如 Neo4j）不可用</td></tr><tr><td>50301</td><td>图查询失败 &#x2F; 被只读守卫拦截</td></tr><tr><td>50302</td><td>所选模型未配置 API Key</td></tr><tr><td>50000</td><td>服务内部错误</td></tr></tbody></table><p><strong>旧接口兼容</strong>。保留 <code>GET /question</code> 旧格式接口，教程的旧调用方不受影响。接口演进而不断旧调用，是维护成本最低的兼容策略。</p><h2 id="数据与导入"><a href="#数据与导入" class="headerlink" title="数据与导入"></a>数据与导入</h2><p><code>scripts/import_data.py</code> 把 Excel 事故记录导入图中，生成 <code>Time / System / Incident / Account / Level / Reason / Loss</code> 节点，并统一与 <code>Incident</code> 建立关联。默认导入会<strong>清空图库现有内容</strong>（<code>--no-clear</code> 可追加），脚本用 pandas&#x2F;openpyxl 读表，适合「表格数据 → 知识图谱」的常见迁移场景。</p><h2 id="接口一览"><a href="#接口一览" class="headerlink" title="接口一览"></a>接口一览</h2><table><thead><tr><th>方法</th><th>路径</th><th>说明</th></tr></thead><tbody><tr><td>GET</td><td><code>/api/health</code></td><td>健康检查（服务 &#x2F; Neo4j &#x2F; 已注册模型）</td></tr><tr><td>POST</td><td><code>/api/qa/ask</code></td><td>标准问答入口，body: <code>{&quot;question&quot;: &quot;...&quot;, &quot;llm&quot;: &quot;deepseek&quot;}</code></td></tr><tr><td>GET</td><td><code>/api/qa/ask</code></td><td>GET 形式：<code>?question=...&amp;llm=...</code></td></tr><tr><td>GET</td><td><code>/question</code></td><td>旧版接口兼容，返回旧格式 <code>{&quot;result&quot;: &quot;...&quot;}</code></td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST http://127.0.0.1:5002/api/qa/ask \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&quot;&#123;\&quot;question\&quot;: \&quot;Invalid事故的发生时间\&quot;, \&quot;llm\&quot;: \&quot;deepseek\&quot;&#125;&quot;</span></span><br></pre></td></tr></table></figure><p>响应 <code>data</code> 中包含 <code>answer</code>（回答）与 <code>cypher</code>（实际执行的查询）。</p><h2 id="一个值得记住的坑"><a href="#一个值得记住的坑" class="headerlink" title="一个值得记住的坑"></a>一个值得记住的坑</h2><p>如果回答与图谱无关、甚至在复读问题，通常不是程序错误——而是<strong>图库数据与提示词调校的场景不匹配</strong>，模型走了「通用知识回答」路径。提示词模板是针对事故数据场景调校的，换业务数据时必须同步调整提示词。RAG 系统的「检索质量」和「提示词场景」是一对必须一起换的齿轮。</p><p>测试方面，后端带 27 个 pytest 用例（API &#x2F; 图服务 &#x2F; 数据导入），前端通过 devServer 代理 <code>/api</code> 到 5002 端口，开发环境一般无需处理跨域。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/Neo-In-sight">Neo-In-sight</a></li></ul>]]></content>
    
    
    <summary type="html">前后端分离的 RAG 知识图谱问答演示项目——自然语言经 LLM 生成 Cypher、在 Neo4j 执行、再由 LLM 生成回答，全过程透明可调试，附带只读安全守卫、统一响应格式与 27 个 pytest 用例。</summary>
    
    
    
    <category term="人工智能" scheme="https://xiaogao-code.space/categories/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
    <category term="知识图谱" scheme="https://xiaogao-code.space/tags/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/"/>
    
    <category term="RAG" scheme="https://xiaogao-code.space/tags/RAG/"/>
    
    <category term="Neo4j" scheme="https://xiaogao-code.space/tags/Neo4j/"/>
    
    <category term="LangChain" scheme="https://xiaogao-code.space/tags/LangChain/"/>
    
    <category term="Cypher" scheme="https://xiaogao-code.space/tags/Cypher/"/>
    
    <category term="Flask" scheme="https://xiaogao-code.space/tags/Flask/"/>
    
    <category term="Vue" scheme="https://xiaogao-code.space/tags/Vue/"/>
    
    <category term="DeepSeek" scheme="https://xiaogao-code.space/tags/DeepSeek/"/>
    
    <category term="大模型应用" scheme="https://xiaogao-code.space/tags/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BA%94%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>STM32 灰度循迹小车：8 路传感器 + PID + 舵机转向</title>
    <link href="https://xiaogao-code.space/2026/09/22/stm32-grayscale-trace-car/"/>
    <id>https://xiaogao-code.space/2026/09/22/stm32-grayscale-trace-car/</id>
    <published>2026-09-22T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>一条黑线、一台小车、一套完整闭环。这个项目用一颗 72MHz 的 STM32F103C8T6，把 8 路灰度传感器、加权位置误差、抗饱和 PID、舵机转向和双后轮调速串成了一条 200Hz 的控制链路，是嵌入式入门到进阶的完整实战参考。</p><span id="more"></span><h2 id="系统架构"><a href="#系统架构" class="headerlink" title="系统架构"></a>系统架构</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">               ┌──────────────────────────────────────────────┐</span><br><span class="line">               │              STM32F103C8T6  72MHz             │</span><br><span class="line">               │                                              │</span><br><span class="line">┌──────────┐   │  ┌────────┐   ┌─────────┐   ┌────────────┐   │   ┌─────────┐</span><br><span class="line">│ 8 路灰度  │──▶│  │ ADC1   │──▶│  加权    │──▶│  PID 控制  │──▶│  MG995   │</span><br><span class="line">│ 传感器    │   │  │ PA1    │   │  位置误差│   │  kp/ki/kd  │   │  舵机     │</span><br><span class="line">│ (CD4051) │   │  └────────┘   └─────────┘   └─────┬──────┘   │   │ 前轮转向  │</span><br><span class="line">└────┬─────┘   │  PB0/PB1/PB10 选通道               │          │   └─────────┘</span><br><span class="line">     │         │                                    ▼          │</span><br><span class="line">3 位地址线      │                            ┌────────────┐   │   ┌─────────┐</span><br><span class="line">               │                            │ 弯道减速策略 │──▶│  L298N   │</span><br><span class="line">               │                            │ PWM 调制    │   │  双后轮  │</span><br><span class="line">               │                            └────────────┘   │   └─────────┘</span><br><span class="line">               └──────────────────────────────────────────────┘</span><br><span class="line">                            控制周期: 5ms (200Hz)</span><br></pre></td></tr></table></figure><h2 id="硬件平台"><a href="#硬件平台" class="headerlink" title="硬件平台"></a>硬件平台</h2><table><thead><tr><th>项目</th><th>规格</th></tr></thead><tbody><tr><td>MCU</td><td>STM32F103C8T6（Cortex-M3, 72MHz, 64KB Flash, 20KB SRAM）</td></tr><tr><td>电机驱动</td><td>L298N 双 H 桥，A&#x2F;B 通道分别驱动两后轮</td></tr><tr><td>舵机</td><td>MG995 金属齿，前轮转向，6V 独立供电</td></tr><tr><td>传感器</td><td>8 通道灰度模块（CD4051 多路复用 + 模拟输出）</td></tr><tr><td>电源</td><td>12V 锂电池 + DC-DC 6V&#x2F;3A（舵机独立供电）</td></tr></tbody></table><blockquote><p>注意：MG995 堵转电流可达 2.5A，不能从 L298N 板载 5V 取电，否则 STM32 会复位。</p></blockquote><h2 id="核心亮点"><a href="#核心亮点" class="headerlink" title="核心亮点"></a>核心亮点</h2><h3 id="资源利用"><a href="#资源利用" class="headerlink" title="资源利用"></a>资源利用</h3><ul><li><strong>CD4051 多路复用</strong>：仅用 1 个 ADC 通道（PA1）+ 3 根地址线（PB0&#x2F;PB1&#x2F;PB10）轮流采样 8 路灰度，引脚与 ADC 资源占用降到最低；</li><li><strong>TIM1 双通道共享时基</strong>：CH1&#x2F;CH4 输出两路独立 2kHz PWM 分别驱动左右后轮，每轮独占通道避免并联超流；</li><li><strong>TIM2 舵机 PWM</strong>：72MHz&#x2F;72 &#x3D; 1MHz 计数，1us 分辨率 + ARR&#x3D;19999 → 精确 50Hz，脉宽直接映射角度；</li><li><strong>无中断、无 DMA</strong>：全部轮询实现，逻辑简单、行为可预测。</li></ul><h3 id="算法优化"><a href="#算法优化" class="headerlink" title="算法优化"></a>算法优化</h3><ul><li><strong>8 路加权位置误差</strong>：对称权重 <code>[-7,-5,-3,-1,1,3,5,7]</code>，对压线传感器取平均，把离散开关量变成连续位置量；</li><li><strong>抗饱和 PID</strong>：积分限幅（±30）+ 误差过零清零，避免大弯道积分饱和导致超调振荡；</li><li><strong>弯道自动减速</strong>：误差越大 PWM 越低（最多降至直道 40%），无需额外传感器；</li><li><strong>舵机平滑步进</strong>：每周期脉宽最多变化 25us 逼近目标角度；</li><li><strong>丢线容错</strong>：8 路全部丢线时沿用上次误差，保持转向趋势而非急停。</li></ul><h2 id="关键算法"><a href="#关键算法" class="headerlink" title="关键算法"></a>关键算法</h2><h3 id="加权位置误差"><a href="#加权位置误差" class="headerlink" title="加权位置误差"></a>加权位置误差</h3><table><thead><tr><th>通道</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th></tr></thead><tbody><tr><td>权重</td><td>-7</td><td>-5</td><td>-3</td><td>-1</td><td>+1</td><td>+3</td><td>+5</td><td>+7</td></tr></tbody></table><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">error = (Σ 权重[i]) / (压在黑线上的传感器个数)</span><br></pre></td></tr></table></figure><p>线居中 → error ≈ 0 → 直行；线偏右 → error &gt; 0 → 舵机右打。误差范围 [-7, +7]。</p><h3 id="平滑步进：抗抖动核心"><a href="#平滑步进：抗抖动核心" class="headerlink" title="平滑步进：抗抖动核心"></a>平滑步进：抗抖动核心</h3><p>误差短暂回零时，PID 输出会瞬间跳回 0°，舵机会”打一下又抽回中位”。解决方法是每控制周期最多改变 25us 脉宽，把”瞬间跳到绝对角度”变为”持续朝目标角度逼近”，±60° 全行程约 70ms 到位——想更跟手就调大 <code>SERVO_MAX_STEP</code>，想更柔和就调小。</p><h2 id="调参指南"><a href="#调参指南" class="headerlink" title="调参指南"></a>调参指南</h2><p>实测初值（<code>APP/trace_task.c</code>）：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">kp = <span class="number">12.0f</span>;  ki = <span class="number">0.0f</span>;  kd = <span class="number">6.0f</span>;   <span class="comment">/* 实测初值 */</span></span><br><span class="line">integral_limit = <span class="number">30.0f</span>;               <span class="comment">/* 积分限幅 */</span></span><br><span class="line">base_pwm = <span class="number">400</span>;                       <span class="comment">/* 直道 PWM (~40%) */</span></span><br><span class="line">min_pwm  = <span class="number">250</span>;                       <span class="comment">/* 弯道 PWM 下限 (&gt;电机死区) */</span></span><br><span class="line">max_servo = <span class="number">60</span>;                       <span class="comment">/* 舵机限幅 ±60° */</span></span><br></pre></td></tr></table></figure><p><strong>PID 整定顺序</strong>：先 kp（增大至小幅震荡再回退一档）→ 再加 kd（抑制震荡、改善过弯手感）→ 最后 ki（循迹场景多为 0）→ 验证（直道画 S 减小 kp，弯道冲出减小 base_pwm 或增大 kd）。</p><h2 id="常见问题排查"><a href="#常见问题排查" class="headerlink" title="常见问题排查"></a>常见问题排查</h2><table><thead><tr><th>现象</th><th>排查方向</th></tr></thead><tbody><tr><td>舵机抖动 &#x2F; STM32 复位</td><td>舵机是否独立供电、是否共地；调小 <code>SERVO_MAX_STEP</code></td></tr><tr><td>舵机转向后抽回中位</td><td>确认使用 <code>Servo_Set_Angle_Smooth()</code></td></tr><tr><td>ADC 全 0 或全满</td><td>PA1 须为模拟输入；检查灰度模块输出类型</td></tr><tr><td>直行偏向一侧</td><td>微调 <code>SERVO_CENTER</code>（1500 ±10us 标定）</td></tr><tr><td>全亮&#x2F;全灭不启动</td><td>安全锁机制：把车正常压在线上再上电</td></tr></tbody></table><h2 id="工程分层"><a href="#工程分层" class="headerlink" title="工程分层"></a>工程分层</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">src/stm32-firmware/</span><br><span class="line">├── APP/      # 应用层：加权误差 + PID + 弯道降速（trace_task.c）</span><br><span class="line">├── BSP/      # 板级层：delay / 灰度 / 电机 / 舵机 / 串口</span><br><span class="line">├── CMSIS/    # Cortex-M3 内核 + 启动文件</span><br><span class="line">├── FWLib/    # ST 标准外设库</span><br><span class="line">└── USER/     # 工程入口：main.c + AllHeader.h</span><br></pre></td></tr></table></figure><p>基于 ST 标准外设库（SPL）开发，无 RTOS、无中断，适合作为嵌入式入门到进阶的完整实战参考。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/stm32-grayscale-trace-car">stm32-grayscale-trace-car</a></li></ul>]]></content>
    
    
    <summary type="html">STM32F103 灰度循迹小车完整实战——CD4051 多路复用采集 8 路灰度、加权位置误差建模、抗饱和 PID 转向、弯道自动减速与舵机平滑步进，5ms 控制周期全闭环。</summary>
    
    
    
    <category term="嵌入式开发" scheme="https://xiaogao-code.space/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="嵌入式" scheme="https://xiaogao-code.space/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="STM32" scheme="https://xiaogao-code.space/tags/STM32/"/>
    
    <category term="PID" scheme="https://xiaogao-code.space/tags/PID/"/>
    
    <category term="灰度循迹" scheme="https://xiaogao-code.space/tags/%E7%81%B0%E5%BA%A6%E5%BE%AA%E8%BF%B9/"/>
    
    <category term="CD4051" scheme="https://xiaogao-code.space/tags/CD4051/"/>
    
    <category term="舵机" scheme="https://xiaogao-code.space/tags/%E8%88%B5%E6%9C%BA/"/>
    
    <category term="L298N" scheme="https://xiaogao-code.space/tags/L298N/"/>
    
    <category term="PWM" scheme="https://xiaogao-code.space/tags/PWM/"/>
    
    <category term="ADC" scheme="https://xiaogao-code.space/tags/ADC/"/>
    
    <category term="电机控制" scheme="https://xiaogao-code.space/tags/%E7%94%B5%E6%9C%BA%E6%8E%A7%E5%88%B6/"/>
    
    <category term="闭环控制" scheme="https://xiaogao-code.space/tags/%E9%97%AD%E7%8E%AF%E6%8E%A7%E5%88%B6/"/>
    
  </entry>
  
  <entry>
    <title>家庭收支记账软件：用整数&quot;分&quot;守护货币精度</title>
    <link href="https://xiaogao-code.space/2026/09/15/personal-finance-manager/"/>
    <id>https://xiaogao-code.space/2026/09/15/personal-finance-manager/</id>
    <published>2026-09-15T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>写记账软件最容易踩的坑，是用 <code>double</code> 存金额。这个家庭收支记账软件把”货币精度”当作第一设计问题：内部用 <code>int64_t</code> 保存”分”，所有运算完成后再格式化显示，顺便演示了一个 C 语言项目如何用四层架构把职责拆干净。</p><span id="more"></span><h2 id="功能特性"><a href="#功能特性" class="headerlink" title="功能特性"></a>功能特性</h2><ul><li>初始账户余额 1000.00；</li><li>登记收入与支出，记录说明；</li><li><strong>余额校验</strong>：支出超过当前余额时拒绝操作并提示余额不足；</li><li>查看每笔收支金额、交易后的账户余额和说明；</li><li>没有交易记录时显示空记录提示；</li><li>退出前 <code>y/n</code> 确认，菜单、金额、说明全部格式校验；</li><li>交易记录用动态数组管理，运行期间持续追加。</li></ul><h2 id="四层模块架构"><a href="#四层模块架构" class="headerlink" title="四层模块架构"></a>四层模块架构</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">personal-finance-manager/</span><br><span class="line">├── src/</span><br><span class="line">│   ├── main.c              # 程序入口</span><br><span class="line">│   ├── app/                # 应用层：流程编排</span><br><span class="line">│   ├── domain/             # 领域层：账户与业务规则</span><br><span class="line">│   ├── shared/             # 共享层：金额解析与格式化</span><br><span class="line">│   └── ui/                 # 界面层：输入读取与展示</span><br><span class="line">└── docs/                   # 需求文档</span><br></pre></td></tr></table></figure><table><thead><tr><th>模块</th><th>职责</th></tr></thead><tbody><tr><td><code>src/app/</code></td><td>应用流程编排，连接账户业务、输入和展示</td></tr><tr><td><code>src/domain/</code></td><td>账户、交易记录和收支业务规则</td></tr><tr><td><code>src/shared/</code></td><td>金额解析与格式化等通用能力</td></tr><tr><td><code>src/ui/</code></td><td>控制台输入读取、校验和输出</td></tr></tbody></table><p>UI 层不直接修改账户内部状态，领域层负责账户余额与交易记录的一致性——这条边界是分层设计里最值得体会的部分。</p><h2 id="金额安全：没有-double-的记账本"><a href="#金额安全：没有-double-的记账本" class="headerlink" title="金额安全：没有 double 的记账本"></a>金额安全：没有 double 的记账本</h2><p>程序没有使用 <code>double</code> 保存余额，而是用 <code>int64_t</code> 保存”分”：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">用户输入 100.50  →  内部保存 10050  →  运算后再格式化为两位小数</span><br></pre></td></tr></table></figure><p>这样所有加减运算都是整数运算，从根本上避免了浮点误差在账目上累积。</p><h2 id="工程化设计"><a href="#工程化设计" class="headerlink" title="工程化设计"></a>工程化设计</h2><ul><li><strong>输入校验</strong>：菜单范围、金额格式、正数约束、小数位数、说明长度、确认输入，避免直接使用不安全的 <code>scanf</code>；</li><li><strong>资源管理</strong>：交易记录动态数组容量不足时自动扩容，退出前释放账户持有的动态内存；</li><li>编译开启 <code>-Wall -Wextra -Wpedantic</code>，GCC 与 Clang 均可零警告构建。</li></ul><h2 id="编译运行"><a href="#编译运行" class="headerlink" title="编译运行"></a>编译运行</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">gcc -std=c11 -Wall -Wextra -Wpedantic -Isrc \</span><br><span class="line">    src/main.c src/app/finance_app.c \</span><br><span class="line">    src/domain/finance_account.c src/shared/money.c \</span><br><span class="line">    src/ui/console_input.c src/ui/console_view.c \</span><br><span class="line">    -o finance-manager</span><br></pre></td></tr></table></figure><h2 id="后续扩展方向"><a href="#后续扩展方向" class="headerlink" title="后续扩展方向"></a>后续扩展方向</h2><ul><li>增加文件或数据库持久化；</li><li>按日期、类型和说明查询交易记录，增加月度统计；</li><li>增加预算和分类管理、单元测试以及 CMake 构建流程。</li></ul><p>数据目前只保存在运行期间，退出即丢失——这也是一个很好的练习起点：补上文件持久化，它就从玩具变成了真能用的工具。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/personal-finance-manager">personal-finance-manager</a></li></ul>]]></content>
    
    
    <summary type="html">基于 C11 的家庭收支记账软件实战——四层模块化架构，金额以 int64_t 分存储规避浮点误差，覆盖余额校验、动态数组扩容和输入格式校验。</summary>
    
    
    
    <category term="项目实战" scheme="https://xiaogao-code.space/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="C语言" scheme="https://xiaogao-code.space/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="分层架构" scheme="https://xiaogao-code.space/tags/%E5%88%86%E5%B1%82%E6%9E%B6%E6%9E%84/"/>
    
    <category term="动态数组" scheme="https://xiaogao-code.space/tags/%E5%8A%A8%E6%80%81%E6%95%B0%E7%BB%84/"/>
    
    <category term="输入校验" scheme="https://xiaogao-code.space/tags/%E8%BE%93%E5%85%A5%E6%A0%A1%E9%AA%8C/"/>
    
    <category term="模块化设计" scheme="https://xiaogao-code.space/tags/%E6%A8%A1%E5%9D%97%E5%8C%96%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="整数运算" scheme="https://xiaogao-code.space/tags/%E6%95%B4%E6%95%B0%E8%BF%90%E7%AE%97/"/>
    
    <category term="金额精度" scheme="https://xiaogao-code.space/tags/%E9%87%91%E9%A2%9D%E7%B2%BE%E5%BA%A6/"/>
    
    <category term="数据持久化" scheme="https://xiaogao-code.space/tags/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>客户信息管理系统：C11 分层架构的控制台实战</title>
    <link href="https://xiaogao-code.space/2026/09/08/customer-management-system/"/>
    <id>https://xiaogao-code.space/2026/09/08/customer-management-system/</id>
    <published>2026-09-08T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>学完 C 语言语法，最缺的就是一个”像样”的项目。这个客户信息管理系统把课程里的单文件示例重构为分层架构：应用层编排流程、领域层管理业务、界面层处理输入输出，并补齐了输入校验、动态数组、结果码和资源释放这些工程细节。</p><span id="more"></span><h2 id="功能特性"><a href="#功能特性" class="headerlink" title="功能特性"></a>功能特性</h2><ul><li><strong>添加客户</strong>：录入姓名、性别、年龄、电话和邮箱；</li><li><strong>修改客户</strong>：按编号修改资料，直接回车保留原值，输入 <code>-1</code> 取消；</li><li><strong>删除客户</strong>：按编号删除，删除前要求 <code>y/n</code> 确认，删除后自动整理后续编号；</li><li><strong>客户列表</strong>：展示所有客户的编号和详细资料；</li><li><strong>输入校验</strong>：菜单、姓名、性别、年龄、电话、邮箱和确认输入全部校验；</li><li><strong>动态数组</strong>：容量不足时自动扩展。</li></ul><h2 id="分层架构"><a href="#分层架构" class="headerlink" title="分层架构"></a>分层架构</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">customer-management-system/</span><br><span class="line">├── src/</span><br><span class="line">│   ├── main.c              # 程序入口</span><br><span class="line">│   ├── app/                # 应用层：编排菜单流程和业务操作</span><br><span class="line">│   ├── domain/             # 领域层：客户资料、目录和业务规则</span><br><span class="line">│   └── ui/                 # 界面层：控制台输入、校验和展示</span><br><span class="line">└── docs/                   # 原始需求文档</span><br></pre></td></tr></table></figure><table><thead><tr><th>模块</th><th>职责</th></tr></thead><tbody><tr><td><code>src/app/</code></td><td>编排菜单流程和业务操作</td></tr><tr><td><code>src/domain/</code></td><td>管理客户资料、目录和业务规则</td></tr><tr><td><code>src/ui/</code></td><td>负责控制台输入、校验和展示</td></tr></tbody></table><p>应用层连接领域层和控制台层，不直接管理客户数组。领域层负责增删改查、编号维护、资料校验和资源生命周期；控制台层只负责读取输入与展示结果。</p><h2 id="校验规则"><a href="#校验规则" class="headerlink" title="校验规则"></a>校验规则</h2><table><thead><tr><th>字段</th><th>规则</th></tr></thead><tbody><tr><td>姓名</td><td>必填，最多 63 字节</td></tr><tr><td>性别</td><td>只接受 <code>f/F</code> 或 <code>m/M</code></td></tr><tr><td>年龄</td><td>1 到 150</td></tr><tr><td>电话</td><td>允许数字、<code>+</code>、<code>-</code>、括号和空格，至少包含 3 位数字</td></tr><tr><td>邮箱</td><td>必须包含一个 <code>@</code>、域名分隔点且不能有空格</td></tr></tbody></table><h2 id="工程化设计要点"><a href="#工程化设计要点" class="headerlink" title="工程化设计要点"></a>工程化设计要点</h2><ul><li>头文件暴露模块接口，用 <code>CustomerDirectory</code> 封装客户集合，用 <code>CustomerResult</code> 表示业务结果；</li><li>客户记录用动态数组保存，目录容量不足时自动扩展；</li><li>退出前调用销毁函数释放动态内存，配合 <code>-Wall -Wextra -Wpedantic</code> 全程零警告。</li></ul><h2 id="编译运行"><a href="#编译运行" class="headerlink" title="编译运行"></a>编译运行</h2><p>标准 C11，无第三方依赖：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">gcc -std=c11 -Wall -Wextra -Wpedantic -Isrc \</span><br><span class="line">    src/main.c src/app/customer_app.c \</span><br><span class="line">    src/domain/customer_directory.c \</span><br><span class="line">    src/ui/console_input.c src/ui/console_view.c \</span><br><span class="line">    -o customer-management-system</span><br></pre></td></tr></table></figure><h2 id="可以继续做的事"><a href="#可以继续做的事" class="headerlink" title="可以继续做的事"></a>可以继续做的事</h2><p>客户数据目前只保存在进程内，后续可以增加文件或数据库持久化、客户查询、分组标签、导入导出、单元测试以及 CMake &#x2F; Makefile 构建流程。</p><p>这个项目最大的价值在于展示了”课本代码”到”工程代码”的距离：同样的功能，加上分层、校验、错误处理和资源管理之后，才算真正能维护的程序。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/customer-management-system">customer-management-system</a></li></ul>]]></content>
    
    
    <summary type="html">基于 C11 的客户信息管理系统实战项目——把单文件示例重构为应用层、领域层和界面层的分层架构，加入动态数组、结果码、输入校验和内存管理。</summary>
    
    
    
    <category term="项目实战" scheme="https://xiaogao-code.space/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="C语言" scheme="https://xiaogao-code.space/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="分层架构" scheme="https://xiaogao-code.space/tags/%E5%88%86%E5%B1%82%E6%9E%B6%E6%9E%84/"/>
    
    <category term="动态数组" scheme="https://xiaogao-code.space/tags/%E5%8A%A8%E6%80%81%E6%95%B0%E7%BB%84/"/>
    
    <category term="控制台应用" scheme="https://xiaogao-code.space/tags/%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%BA%94%E7%94%A8/"/>
    
    <category term="输入校验" scheme="https://xiaogao-code.space/tags/%E8%BE%93%E5%85%A5%E6%A0%A1%E9%AA%8C/"/>
    
    <category term="模块化设计" scheme="https://xiaogao-code.space/tags/%E6%A8%A1%E5%9D%97%E5%8C%96%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="接口设计" scheme="https://xiaogao-code.space/tags/%E6%8E%A5%E5%8F%A3%E8%AE%BE%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>OpenCV 计算机视觉：从像素到特征匹配的十二课</title>
    <link href="https://xiaogao-code.space/2026/08/27/opencv-computer-vision/"/>
    <id>https://xiaogao-code.space/2026/08/27/opencv-computer-vision/</id>
    <published>2026-08-27T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>计算机视觉的第一课，是学会”看”像素。这份笔记配套 12 份课件与逐章可运行的 Python 源码，从图片视频加载开始，经颜色空间、几何变换、滤波、边缘检测、形态学、阈值与轮廓，最终到达 ORB 特征匹配与 Harris 角点检测。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">输入与显示</span><br><span class="line">    ├── 图片读取、视频读取、摄像头访问</span><br><span class="line">    └── OpenCV 窗口、键盘事件和资源释放</span><br><span class="line">            ↓</span><br><span class="line">图像基础</span><br><span class="line">    ├── 几何图形与文字绘制</span><br><span class="line">    ├── 像素访问、图像属性和通道操作</span><br><span class="line">    └── BGR、GRAY、HSV、Lab、YCrCb</span><br><span class="line">            ↓</span><br><span class="line">图像处理</span><br><span class="line">    ├── 缩放、平移、旋转、透视变换和重映射</span><br><span class="line">    ├── 均值、高斯和中值滤波</span><br><span class="line">    ├── Canny 边缘检测</span><br><span class="line">    └── 腐蚀、膨胀、开闭运算和顶帽/黑帽</span><br><span class="line">            ↓</span><br><span class="line">目标分析</span><br><span class="line">    ├── 全局、自适应和 Otsu 阈值</span><br><span class="line">    ├── 轮廓、矩、凸包和外接矩形</span><br><span class="line">    ├── ORB 特征、BF/FLANN 匹配</span><br><span class="line">    └── Harris 角点检测</span><br></pre></td></tr></table></figure><h2 id="章节与源码"><a href="#章节与源码" class="headerlink" title="章节与源码"></a>章节与源码</h2><table><thead><tr><th>编号</th><th>主题</th><th>源码目录</th><th>主要内容</th></tr></thead><tbody><tr><td>001</td><td>图片&amp;视频加载及展示</td><td><code>001-image-video-io</code></td><td><code>cv.imread</code> 读图、<code>cv.VideoCapture</code> 摄像头帧处理</td></tr><tr><td>002</td><td>图像的绘制方法</td><td><code>002-image-drawing</code></td><td>直线、矩形、圆、多边形和文本绘制</td></tr><tr><td>003</td><td>图像的基础操作</td><td><code>003-basic-image-operations</code></td><td>像素访问、<code>shape/size/dtype</code>、通道拆分合并</td></tr><tr><td>004</td><td>颜色空间转换</td><td><code>004-color-space-conversion</code></td><td>GRAY、Lab、YCrCb、HSV 转换</td></tr><tr><td>005</td><td>几何变换</td><td><code>005-geometric-transformation</code></td><td>缩放、平移、旋转、透视变换、重映射</td></tr><tr><td>006</td><td>图像平滑</td><td><code>006-image-smoothing</code></td><td>均值、高斯、中值滤波对比</td></tr><tr><td>007</td><td>边缘检测</td><td><code>007-edge-detection</code></td><td>Canny 算法提取边缘</td></tr><tr><td>008</td><td>形态学处理</td><td><code>008-morphological-operations</code></td><td>腐蚀、膨胀、开闭运算、顶帽和黑帽</td></tr><tr><td>009</td><td>阈值处理</td><td><code>009-thresholding</code></td><td>全局阈值、自适应阈值、Otsu</td></tr><tr><td>010</td><td>轮廓及特征</td><td><code>010-contours-and-features</code></td><td>矩、多边形逼近、凸包、外接矩形</td></tr><tr><td>011</td><td>特征匹配</td><td><code>011-feature-matching</code></td><td>ORB 特征、BF 暴力匹配、FLANN 匹配</td></tr><tr><td>012</td><td>角点检测</td><td><code>012-corner-detection</code></td><td>Harris 角点检测与标记</td></tr></tbody></table><h2 id="几个高频实战点"><a href="#几个高频实战点" class="headerlink" title="几个高频实战点"></a>几个高频实战点</h2><h3 id="几何变换（第-005-课，35-页重点章节）"><a href="#几何变换（第-005-课，35-页重点章节）" class="headerlink" title="几何变换（第 005 课，35 页重点章节）"></a>几何变换（第 005 课，35 页重点章节）</h3><ul><li><code>cv.resize</code> 缩放、仿射矩阵平移、围绕中心旋转；</li><li>透视变换：用四组对应点计算变换矩阵，实现”文档展平”类效果；</li><li>重映射 <code>cv.remap</code>：用坐标映射实现翻转、压缩等自定义变换。</li></ul><h3 id="形态学运算速查（第-008-课）"><a href="#形态学运算速查（第-008-课）" class="headerlink" title="形态学运算速查（第 008 课）"></a>形态学运算速查（第 008 课）</h3><table><thead><tr><th>运算</th><th>效果</th></tr></thead><tbody><tr><td>腐蚀</td><td>消除小亮点，收缩前景</td></tr><tr><td>膨胀</td><td>填充小孔洞，扩张前景</td></tr><tr><td>开运算</td><td>先腐蚀后膨胀，去噪分离物体</td></tr><tr><td>闭运算</td><td>先膨胀后腐蚀，填充内部孔洞</td></tr><tr><td>顶帽</td><td>原图减开运算，突出亮细节</td></tr><tr><td>黑帽</td><td>闭运算减原图，突出暗细节</td></tr></tbody></table><h3 id="特征匹配（第-011-课）"><a href="#特征匹配（第-011-课）" class="headerlink" title="特征匹配（第 011 课）"></a>特征匹配（第 011 课）</h3><p>ORB 提取关键点与描述符，配合汉明距离与交叉检查完成暴力匹配（BFMatcher），或用 FLANN 的 LSH 索引执行 KNN 最近邻匹配。</p><h2 id="环境与运行"><a href="#环境与运行" class="headerlink" title="环境与运行"></a>环境与运行</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">python -m venv .venv</span><br><span class="line">.\.venv\Scripts\Activate.ps1   <span class="comment"># Windows PowerShell</span></span><br><span class="line">python -m pip install opencv-python numpy matplotlib</span><br></pre></td></tr></table></figure><p>图片路径大多是相对当前工作目录解析的，运行脚本前先进入对应章节目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> src/001-image-video-io</span><br><span class="line">python image_read.py</span><br></pre></td></tr></table></figure><h2 id="OpenCV-使用要点"><a href="#OpenCV-使用要点" class="headerlink" title="OpenCV 使用要点"></a>OpenCV 使用要点</h2><ul><li>OpenCV 默认 BGR 通道顺序，Matplotlib 按 RGB 解释，跨库显示时要注意颜色顺序；</li><li><code>cv.imread</code> 读取失败返回空对象，应先确认路径和文件名；</li><li>图像数组按 <code>[行, 列]</code> 即 <code>[y, x]</code> 访问，不要与笛卡尔坐标混淆；</li><li>阈值、边缘和轮廓处理通常需要先灰度化、滤波或二值化；</li><li>摄像头、GUI 窗口属于运行资源，脚本退出前应及时释放。</li></ul><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/opencv-computer-vision-notes">opencv-computer-vision-notes</a></li></ul>]]></content>
    
    
    <summary type="html">OpenCV 计算机视觉入门笔记，12 份课件配套可运行源码，覆盖图像 I/O、绘制、颜色空间、几何变换、滤波平滑、Canny 边缘检测、形态学、阈值分割、轮廓特征、ORB 特征匹配与 Harris 角点检测。</summary>
    
    
    
    <category term="计算机视觉" scheme="https://xiaogao-code.space/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    
    
    <category term="OpenCV" scheme="https://xiaogao-code.space/tags/OpenCV/"/>
    
    <category term="Python" scheme="https://xiaogao-code.space/tags/Python/"/>
    
    <category term="图像处理" scheme="https://xiaogao-code.space/tags/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/"/>
    
    <category term="Canny" scheme="https://xiaogao-code.space/tags/Canny/"/>
    
    <category term="形态学" scheme="https://xiaogao-code.space/tags/%E5%BD%A2%E6%80%81%E5%AD%A6/"/>
    
    <category term="轮廓" scheme="https://xiaogao-code.space/tags/%E8%BD%AE%E5%BB%93/"/>
    
    <category term="ORB" scheme="https://xiaogao-code.space/tags/ORB/"/>
    
    <category term="边缘检测" scheme="https://xiaogao-code.space/tags/%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B/"/>
    
    <category term="特征匹配" scheme="https://xiaogao-code.space/tags/%E7%89%B9%E5%BE%81%E5%8C%B9%E9%85%8D/"/>
    
    <category term="图像滤波" scheme="https://xiaogao-code.space/tags/%E5%9B%BE%E5%83%8F%E6%BB%A4%E6%B3%A2/"/>
    
    <category term="阈值分割" scheme="https://xiaogao-code.space/tags/%E9%98%88%E5%80%BC%E5%88%86%E5%89%B2/"/>
    
    <category term="角点检测" scheme="https://xiaogao-code.space/tags/%E8%A7%92%E7%82%B9%E6%A3%80%E6%B5%8B/"/>
    
  </entry>
  
  <entry>
    <title>ROS 2 Humble 学习记录：现代机器人开发工具链</title>
    <link href="https://xiaogao-code.space/2026/08/15/ros2-robotics-notes/"/>
    <id>https://xiaogao-code.space/2026/08/15/ros2-robotics-notes/</id>
    <published>2026-08-15T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>ROS 2 是机器人开发的新一代基础设施，解决了 ROS 1 在实时性、安全性和多机通信上的诸多局限。这份 165 页的学习记录从节点与功能包讲起，覆盖完整通信机制与工具链，最后延伸到 URDF 建模与 Gazebo 仿真。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">ROS 2 基础</span><br><span class="line">    ├── 机器人、ROS 2 本质、ROS 1 与 ROS 2 对比</span><br><span class="line">    ├── 系统架构、发行版、通信机制和调试工具</span><br><span class="line">    └── Linux、VS Code、Git、Python、C++ 和环境变量</span><br><span class="line">            ↓</span><br><span class="line">节点与功能包</span><br><span class="line">    ├── Python 节点和 C++ 节点</span><br><span class="line">    ├── rclpy、rclcpp、日志和节点生命周期</span><br><span class="line">    ├── ament_python、ament_cmake 和 colcon 工作空间</span><br><span class="line">    └── 面向对象、多线程和回调函数</span><br><span class="line">            ↓</span><br><span class="line">ROS 2 通信</span><br><span class="line">    ├── Topic 发布与订阅</span><br><span class="line">    ├── Service 客户端与服务端</span><br><span class="line">    ├── 自定义消息、服务接口和参数</span><br><span class="line">    └── Launch 多节点启动与配置</span><br><span class="line">            ↓</span><br><span class="line">机器人工具链</span><br><span class="line">    ├── TF 静态与动态坐标变换</span><br><span class="line">    ├── rqt、RViz2 和 ros2 bag</span><br><span class="line">    ├── URDF、Xacro 和机器人模型可视化</span><br><span class="line">    └── Gazebo 仿真基础</span><br></pre></td></tr></table></figure><h2 id="核心概念"><a href="#核心概念" class="headerlink" title="核心概念"></a>核心概念</h2><table><thead><tr><th>概念</th><th>作用</th><th>学习方向</th></tr></thead><tbody><tr><td>Node</td><td>执行具体任务的运行单元</td><td>Python&#x2F;C++ 节点、日志、节点查询</td></tr><tr><td>Topic</td><td>面向持续数据流的异步通信</td><td>速度、位姿、系统状态、文本数据</td></tr><tr><td>Service</td><td>面向请求和响应的一次性通信</td><td>海龟生成、人脸检测、巡逻控制</td></tr><tr><td>Action</td><td>可反馈、可取消的长时间任务</td><td>通信体系的扩展方向</td></tr><tr><td>Parameter</td><td>节点运行时可配置的数据</td><td>声明、读取、更新和 YAML 加载</td></tr><tr><td>Interface</td><td>描述通信数据结构</td><td><code>.msg</code>、<code>.srv</code> 和接口生成</td></tr><tr><td>Launch</td><td>组织多个节点和运行参数</td><td><code>*.launch.py</code> 多节点启动</td></tr><tr><td>TF</td><td>管理机器人中的坐标系关系</td><td>静态 TF、动态 TF、TF 查询</td></tr></tbody></table><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="节点与功能包"><a href="#节点与功能包" class="headerlink" title="节点与功能包"></a>节点与功能包</h3><ul><li>分别用 Python（<code>rclpy</code>）和 C++（<code>rclcpp</code>）编写最小节点，理解初始化与日志；</li><li>用 <code>ament_python</code> 和 <code>ament_cmake</code> 组织功能包，理解 <code>package.xml</code>、<code>setup.py</code> 与 <code>CMakeLists.txt</code> 的职责；</li><li>使用 <code>colcon build</code> 构建工作空间并加载 <code>install/setup.bash</code>；</li><li>Python 和 C++ 中的多线程与回调函数实践。</li></ul><h3 id="话题与服务"><a href="#话题与服务" class="headerlink" title="话题与服务"></a>话题与服务</h3><ul><li>用 <code>geometry_msgs/msg/Twist</code> 控制 Turtlesim 前进、旋转、画圆，订阅位姿实现闭环控制；</li><li>趣味实践：通过话题传输小说文本并用 <code>espeak-ng</code> 转语音，用 <code>psutil</code> 获取系统状态共享数据，用 Qt 显示订阅到的数据；</li><li>自定义消息与服务接口：Python 实现人脸检测服务、C++ 实现巡逻海龟服务；</li><li>参数声明、参数事件、YAML 配置加载，Launch 文件启动多节点并传递参数。</li></ul><h3 id="工具链"><a href="#工具链" class="headerlink" title="工具链"></a>工具链</h3><ul><li>TF 坐标树：Python 发布机械臂底座到相机的静态 TF，C++ 发布地图坐标系的静态与动态 TF 并查询关系；</li><li><code>rqt</code> &#x2F; <code>rqt_tf_tree</code> 检查节点、话题和 TF 树，<code>RViz2</code> 显示坐标变换与机器人状态；</li><li><code>ros2 bag record</code> 记录话题数据并回放测试。</li></ul><h3 id="仿真入门"><a href="#仿真入门" class="headerlink" title="仿真入门"></a>仿真入门</h3><ul><li>创建 ROS 2 描述功能包，使用 URDF 描述机器人连杆、关节与结构；</li><li><code>urdf_to_graphviz</code> 生成模型结构图，RViz2 加载显示机器人模型；</li><li>使用 Xacro 简化和复用 URDF，建立 Gazebo 仿真基础。</li></ul><h2 id="常用命令速查"><a href="#常用命令速查" class="headerlink" title="常用命令速查"></a>常用命令速查</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 环境加载</span></span><br><span class="line"><span class="built_in">source</span> /opt/ros/humble/setup.bash</span><br><span class="line">colcon build &amp;&amp; <span class="built_in">source</span> install/setup.bash</span><br><span class="line"></span><br><span class="line"><span class="comment"># 节点与话题</span></span><br><span class="line">ros2 node list</span><br><span class="line">ros2 topic <span class="built_in">echo</span> /turtle1/pose</span><br><span class="line">ros2 interface show geometry_msgs/msg/Twist</span><br><span class="line"></span><br><span class="line"><span class="comment"># 服务与参数</span></span><br><span class="line">ros2 service list -t</span><br><span class="line">ros2 param <span class="built_in">set</span> /turtlesim background_r 255</span><br><span class="line"></span><br><span class="line"><span class="comment"># 工具</span></span><br><span class="line">rqt &amp;&amp; rviz2</span><br><span class="line">ros2 bag record /turtle1/cmd_vel</span><br></pre></td></tr></table></figure><h2 id="工程注意事项"><a href="#工程注意事项" class="headerlink" title="工程注意事项"></a>工程注意事项</h2><ul><li>修改 <code>package.xml</code>、<code>setup.py</code> 或 <code>CMakeLists.txt</code> 后，应重新执行 <code>colcon build</code> 并重新 <code>source install/setup.bash</code>；</li><li>Topic 的名称、消息类型、QoS 配置需要保持一致；</li><li>自定义 <code>.msg</code>、<code>.srv</code> 接口变更后，应重新生成接口并检查所有依赖节点；</li><li>TF 查询依赖正确的父子坐标系、时间戳和 TF 发布器；</li><li>多线程回调需要明确共享数据、线程退出和资源同步策略。</li></ul><h2 id="推荐实践顺序"><a href="#推荐实践顺序" class="headerlink" title="推荐实践顺序"></a>推荐实践顺序</h2><ol><li>安装 ROS 2 后运行 Turtlesim、键盘控制和 <code>rqt</code>，确认基础环境可用；</li><li>分别用 Python 和 C++ 编写最小节点，理解 <code>rclpy</code> 与 <code>rclcpp</code>；</li><li>创建两类功能包，通过 Turtlesim 学习 Topic 的发布、订阅与闭环控制；</li><li>使用自定义消息和服务接口，理解接口生成与服务端&#x2F;客户端；</li><li>学习参数、Launch、TF、RViz2 和 <code>ros2 bag</code>；</li><li>最后用 URDF、Xacro 和 Gazebo 建立建模与仿真基础。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/ros2-robotics-learning-notes">ros2-robotics-learning-notes</a></li></ul>]]></content>
    
    
    <summary type="html">ROS 2 Humble 学习笔记，覆盖节点与功能包、话题、服务、参数、Launch、TF、rqt/RViz2/ros2 bag 工具链，以及 URDF 建模与 Gazebo 仿真的入门路径。</summary>
    
    
    
    <category term="机器人" scheme="https://xiaogao-code.space/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    
    
    <category term="TF" scheme="https://xiaogao-code.space/tags/TF/"/>
    
    <category term="ROS2" scheme="https://xiaogao-code.space/tags/ROS2/"/>
    
    <category term="Humble" scheme="https://xiaogao-code.space/tags/Humble/"/>
    
    <category term="colcon" scheme="https://xiaogao-code.space/tags/colcon/"/>
    
    <category term="rclpy" scheme="https://xiaogao-code.space/tags/rclpy/"/>
    
    <category term="rclcpp" scheme="https://xiaogao-code.space/tags/rclcpp/"/>
    
    <category term="URDF" scheme="https://xiaogao-code.space/tags/URDF/"/>
    
    <category term="Gazebo" scheme="https://xiaogao-code.space/tags/Gazebo/"/>
    
    <category term="DDS" scheme="https://xiaogao-code.space/tags/DDS/"/>
    
    <category term="机器人建模" scheme="https://xiaogao-code.space/tags/%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%BB%BA%E6%A8%A1/"/>
    
    <category term="功能包" scheme="https://xiaogao-code.space/tags/%E5%8A%9F%E8%83%BD%E5%8C%85/"/>
    
  </entry>
  
  <entry>
    <title>ROS 机器人开发入门：话题、服务与 TF 坐标变换</title>
    <link href="https://xiaogao-code.space/2026/08/03/ros-robotics-notes/"/>
    <id>https://xiaogao-code.space/2026/08/03/ros-robotics-notes/</id>
    <published>2026-08-03T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>机器人软件的核心是”很多个程序如何协作”，ROS 给出了标准答案。这份笔记按照入门课程的 14 讲整理：从 ROS 基础概念与工作空间开始，深入话题、服务两大通信机制，最后到达参数服务器、Launch 文件和 TF 坐标变换，配套可运行的 Turtlesim 示例源码。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">ROS 基础</span><br><span class="line">    ├── ROS 的定位、组成和通信思想</span><br><span class="line">    ├── ROS 环境安装与工作空间配置</span><br><span class="line">    └── ROS 常用术语与命令</span><br><span class="line">            ↓</span><br><span class="line">catkin 工程</span><br><span class="line">    ├── 创建工作空间</span><br><span class="line">    ├── 创建功能包</span><br><span class="line">    ├── 编译与环境加载</span><br><span class="line">    └── package.xml 与 CMakeLists.txt</span><br><span class="line">            ↓</span><br><span class="line">ROS 通信</span><br><span class="line">    ├── Topic 发布与订阅</span><br><span class="line">    ├── Service 客户端与服务端</span><br><span class="line">    ├── 自定义消息</span><br><span class="line">    └── 自定义服务</span><br><span class="line">            ↓</span><br><span class="line">系统能力</span><br><span class="line">    ├── 参数服务器</span><br><span class="line">    ├── Launch 启动文件</span><br><span class="line">    ├── TF 坐标变换</span><br><span class="line">    └── RViz 等可视化工具</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="基础篇（001-004-讲）"><a href="#基础篇（001-004-讲）" class="headerlink" title="基础篇（001-004 讲）"></a>基础篇（001-004 讲）</h3><ul><li>理解 ROS 的定位：硬件抽象、节点间通信与机器人软件生态；</li><li>搭建环境，创建工作空间与功能包，掌握 <code>catkin_make</code> 编译与环境加载流程；</li><li>熟悉节点、话题、服务、参数、消息五个基本概念，以及 <code>rosnode</code>、<code>rostopic</code>、<code>rosservice</code> 等常用命令。</li></ul><h3 id="通信篇（005-010-讲）"><a href="#通信篇（005-010-讲）" class="headerlink" title="通信篇（005-010 讲）"></a>通信篇（005-010 讲）</h3><ul><li><strong>话题通信</strong>：使用 <code>rospy.Publisher</code> 向 <code>/turtle1/cmd_vel</code> 发布 <code>geometry_msgs/Twist</code> 控制海龟运动，用 <code>rospy.Subscriber</code> 订阅 <code>/turtle1/pose</code> 输出位姿；</li><li><strong>自定义消息</strong>：定义 <code>Person.msg</code>（姓名、年龄、性别）并生成接口；</li><li><strong>服务通信</strong>：编写服务端与客户端，调用 Turtlesim 的 <code>/spawn</code> 服务创建海龟，实现 <code>/show_person</code> 自定义服务。</li></ul><h3 id="系统能力篇（011-014-讲）"><a href="#系统能力篇（011-014-讲）" class="headerlink" title="系统能力篇（011-014 讲）"></a>系统能力篇（011-014 讲）</h3><ul><li><strong>参数服务器</strong>：读取和设置 <code>/turtlesim/background_r/g/b</code>，调用 <code>/clear</code> 服务刷新背景；</li><li><strong>Launch 文件</strong>：用一个 Launch 文件同时启动 Turtlesim 和键盘控制节点，组织多节点与参数；</li><li><strong>TF 坐标变换</strong>：广播 <code>world</code> 到海龟坐标系的变换，监听 <code>turtle1</code>、<code>turtle2</code> 的坐标关系，计算速度指令实现跟随控制；</li><li><strong>可视化工具</strong>：用 <code>rqt_graph</code> 观察节点与话题连接，用 RViz 查看 TF 和机器人状态。</li></ul><h2 id="三个示例功能包"><a href="#三个示例功能包" class="headerlink" title="三个示例功能包"></a>三个示例功能包</h2><table><thead><tr><th>功能包</th><th>作用</th><th>主要依赖</th></tr></thead><tbody><tr><td><code>beginner_hiwonder</code></td><td>基础 Topic、Service、自定义消息和服务示例</td><td><code>rospy</code>、<code>std_msgs</code>、<code>message_generation</code></td></tr><tr><td><code>parameter_hiwonder</code></td><td>参数服务器的读取、设置和服务调用</td><td><code>rospy</code>、<code>std_msgs</code></td></tr><tr><td><code>tf_hiwonder</code></td><td>Turtlesim 场景中的 TF 广播、监听和跟随</td><td><code>rospy</code>、<code>tf</code>、<code>turtlesim</code></td></tr></tbody></table><h2 id="常用命令速查"><a href="#常用命令速查" class="headerlink" title="常用命令速查"></a>常用命令速查</h2><table><thead><tr><th>命令</th><th>用途</th></tr></thead><tbody><tr><td><code>roscore</code></td><td>启动 ROS Master 和基础运行环境</td></tr><tr><td><code>rosnode list</code> &#x2F; <code>info</code></td><td>查看节点信息</td></tr><tr><td><code>rostopic list</code> &#x2F; <code>echo</code></td><td>查看话题和消息内容</td></tr><tr><td><code>rosservice list</code> &#x2F; <code>call</code></td><td>查看和调用服务</td></tr><tr><td><code>rosparam get</code> &#x2F; <code>set</code></td><td>读写参数服务器</td></tr><tr><td><code>rosrun</code> &#x2F; <code>roslaunch</code></td><td>运行单个节点 &#x2F; 按 Launch 文件启动</td></tr><tr><td><code>rqt_graph</code> &#x2F; <code>rviz</code></td><td>可视化通信关系和传感器数据</td></tr></tbody></table><h2 id="工程注意事项"><a href="#工程注意事项" class="headerlink" title="工程注意事项"></a>工程注意事项</h2><ul><li>节点、话题、服务和参数名称需要保持一致，名称错误会导致通信失败；</li><li>自定义消息或服务修改后，需要重新执行 <code>catkin_make</code> 并重新加载 <code>devel/setup.bash</code>；</li><li>启动客户端前确认服务端已注册，启动订阅器前确认发布器正在运行；</li><li>TF 示例依赖正确的坐标系名称和时间戳，坐标异常时应优先检查 TF 树和节点日志。</li></ul><h2 id="学习建议"><a href="#学习建议" class="headerlink" title="学习建议"></a>学习建议</h2><ol><li>先运行标准消息的发布器和订阅器，再阅读自定义消息 <code>Person.msg</code>；</li><li>对比 Topic 的持续发布模式与 Service 的请求响应模式；</li><li>使用参数服务器修改 Turtlesim 配置，理解节点与参数服务器的关系；</li><li>每个示例都记录节点名称、话题名称、服务名称、消息类型和启动顺序。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/ros-robotics-learning-notes">ros-robotics-learning-notes</a></li></ul>]]></content>
    
    
    <summary type="html">ROS 1 机器人开发入门笔记，从 catkin 工作空间、话题发布订阅、服务通信、自定义消息，到参数服务器、Launch 启动文件与 TF 坐标变换的编程实现。</summary>
    
    
    
    <category term="机器人" scheme="https://xiaogao-code.space/categories/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    
    
    <category term="ROS" scheme="https://xiaogao-code.space/tags/ROS/"/>
    
    <category term="catkin" scheme="https://xiaogao-code.space/tags/catkin/"/>
    
    <category term="rospy" scheme="https://xiaogao-code.space/tags/rospy/"/>
    
    <category term="Topic" scheme="https://xiaogao-code.space/tags/Topic/"/>
    
    <category term="Service" scheme="https://xiaogao-code.space/tags/Service/"/>
    
    <category term="TF" scheme="https://xiaogao-code.space/tags/TF/"/>
    
    <category term="Turtlesim" scheme="https://xiaogao-code.space/tags/Turtlesim/"/>
    
    <category term="消息通信" scheme="https://xiaogao-code.space/tags/%E6%B6%88%E6%81%AF%E9%80%9A%E4%BF%A1/"/>
    
    <category term="参数服务器" scheme="https://xiaogao-code.space/tags/%E5%8F%82%E6%95%B0%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Launch文件" scheme="https://xiaogao-code.space/tags/Launch%E6%96%87%E4%BB%B6/"/>
    
    <category term="坐标变换" scheme="https://xiaogao-code.space/tags/%E5%9D%90%E6%A0%87%E5%8F%98%E6%8D%A2/"/>
    
  </entry>
  
  <entry>
    <title>Linux 应用层开发：从文件 I/O 到 epoll 高并发</title>
    <link href="https://xiaogao-code.space/2026/07/22/linux-application-development/"/>
    <id>https://xiaogao-code.space/2026/07/22/linux-application-development/</id>
    <published>2026-07-22T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>在 Linux 上写 C 程序，是嵌入式工程师从”操作寄存器”走向”操作系统服务”的必经之路。这份笔记从 GCC 编译链接讲起，深入文件 I&#x2F;O、进程线程、进程间通信、Socket 网络编程，最后到达 epoll 高并发服务器的完整实现。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">Linux C 开发基础</span><br><span class="line">    ├── GCC、glibc、GNU C 和 POSIX</span><br><span class="line">    ├── VSCode 与 GCC 开发环境</span><br><span class="line">    ├── C 语言编译、汇编和链接</span><br><span class="line">    └── Makefile</span><br><span class="line">            ↓</span><br><span class="line">Linux 系统接口</span><br><span class="line">    ├── 标准 I/O 与文件操作</span><br><span class="line">    ├── 系统调用</span><br><span class="line">    └── 文件描述符</span><br><span class="line">            ↓</span><br><span class="line">并发与进程间通信</span><br><span class="line">    ├── 进程创建与执行</span><br><span class="line">    ├── 管道、共享内存、消息队列</span><br><span class="line">    ├── 信号</span><br><span class="line">    ├── 线程和线程同步</span><br><span class="line">    └── 线程池</span><br><span class="line">            ↓</span><br><span class="line">网络应用开发</span><br><span class="line">    ├── TCP/IP 网络模型</span><br><span class="line">    ├── TCP、UDP 和 Unix Domain Socket</span><br><span class="line">    ├── 单连接、多进程和多线程服务器</span><br><span class="line">    └── IP、DNS、ARP、MAC 和物理层</span><br><span class="line">            ↓</span><br><span class="line">服务化与高并发</span><br><span class="line">    ├── 守护进程</span><br><span class="line">    └── select、poll、epoll</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="编译与构建"><a href="#编译与构建" class="headerlink" title="编译与构建"></a>编译与构建</h3><p>理解 GCC、glibc、GNU C 和 POSIX 的关系，掌握 C 语言从源文件到可执行文件的完整过程（预处理 → 编译 → 汇编 → 链接），使用 Makefile 管理编译目标、依赖关系和构建命令。</p><h3 id="文件-I-O"><a href="#文件-I-O" class="headerlink" title="文件 I&#x2F;O"></a>文件 I&#x2F;O</h3><p>区分面向流的标准 I&#x2F;O（<code>fopen</code>&#x2F;<code>fread</code>&#x2F;<code>fwrite</code>）与面向文件描述符的系统 I&#x2F;O（<code>open</code>&#x2F;<code>read</code>&#x2F;<code>write</code>），理解标准输入输出、文件描述符及其在进程中的引用关系。</p><h3 id="进程处理"><a href="#进程处理" class="headerlink" title="进程处理"></a>进程处理</h3><ul><li><code>system</code> 创建子进程、<code>fork</code> 理解父子进程执行流、<code>execve</code> 替换进程映像、<code>waitpid</code> 回收子进程；</li><li>理解文件描述符引用计数、进程树和孤儿进程；</li><li>进程间通信：匿名管道（Pipe）、有名管道（FIFO）、共享内存、消息队列，以及信号处理例程。</li></ul><h3 id="线程处理"><a href="#线程处理" class="headerlink" title="线程处理"></a>线程处理</h3><ul><li>理解 Linux 线程模型与进程的关系，使用线程 API 创建和终止线程；</li><li>认识竞态条件，使用互斥锁、读写锁、自旋锁、条件变量和信号量完成同步；</li><li>使用 Glib 线程池组织任务执行和线程复用。</li></ul><p><strong>并发模型对比</strong>：</p><table><thead><tr><th>模型</th><th>主要特点</th><th>适用方向</th></tr></thead><tbody><tr><td>单进程单线程</td><td>结构简单，资源开销小</td><td>简单命令行程序</td></tr><tr><td>多进程</td><td>地址空间隔离，故障影响小</td><td>独立任务和进程级隔离</td></tr><tr><td>多线程</td><td>共享地址空间，通信成本低</td><td>多连接服务、共享数据处理</td></tr><tr><td>I&#x2F;O 多路复用</td><td>一个执行流管理多个 I&#x2F;O</td><td>大量网络连接、事件驱动</td></tr></tbody></table><h3 id="Socket-编程"><a href="#Socket-编程" class="headerlink" title="Socket 编程"></a>Socket 编程</h3><ul><li>网络基础：OSI 七层、TCP&#x2F;IP 四层模型，数据单元与以太网通信流程；</li><li>TCP：报文段格式、连接建立与释放、可靠传输、滑动窗口和拥塞控制，实现只支持单连接的版本后，再用多线程和多进程扩展；</li><li>UDP 与 Unix Domain Socket 本地进程间通信；</li><li>深入 IP 地址分类、DNS 查询过程、数据链路层、MAC 地址与 ARP。</li></ul><h3 id="守护进程与-I-O-多路复用"><a href="#守护进程与-I-O-多路复用" class="headerlink" title="守护进程与 I&#x2F;O 多路复用"></a>守护进程与 I&#x2F;O 多路复用</h3><ul><li>掌握创建守护进程的基本规则：脱离终端、处理文件描述符、日志记录与优雅关闭；</li><li>对比 <code>select</code>（fd 集合）、<code>poll</code>（事件数组）和 <code>epoll</code>（事件通知）的工作方式；</li><li>理解 <code>epoll</code> 的水平触发（LT）与边沿触发（ET）模式，ET 模式需要配合非阻塞 I&#x2F;O 和持续读取策略。</li></ul><h2 id="常用-API-速查"><a href="#常用-API-速查" class="headerlink" title="常用 API 速查"></a>常用 API 速查</h2><table><thead><tr><th>领域</th><th>常用 API</th><th>主要用途</th></tr></thead><tbody><tr><td>文件描述符</td><td><code>open</code>、<code>close</code>、<code>read</code>、<code>write</code></td><td>系统调用方式访问文件</td></tr><tr><td>进程</td><td><code>system</code>、<code>fork</code>、<code>execve</code>、<code>waitpid</code></td><td>创建、替换和回收进程</td></tr><tr><td>线程</td><td><code>pthread_create</code></td><td>创建、控制和回收线程</td></tr><tr><td>同步</td><td>互斥锁、读写锁、条件变量、信号量</td><td>保护共享资源和协调执行</td></tr><tr><td>TCP Socket</td><td><code>socket</code>、<code>bind</code>、<code>listen</code>、<code>accept</code>、<code>connect</code></td><td>建立 TCP 网络通信</td></tr><tr><td>UDP Socket</td><td><code>sendto</code>、<code>recvfrom</code></td><td>实现无连接通信</td></tr><tr><td>I&#x2F;O 多路复用</td><td><code>select</code>、<code>poll</code>、<code>epoll</code></td><td>监听多个文件描述符</td></tr></tbody></table><h2 id="工程注意事项"><a href="#工程注意事项" class="headerlink" title="工程注意事项"></a>工程注意事项</h2><ul><li>共享内存、消息队列、管道和 Socket 使用后应及时释放或关闭资源；</li><li>TCP 服务端应处理断开、短读、短写、缓冲区边界和异常连接；</li><li>多线程程序需要明确共享数据、锁的所有权、等待条件和退出流程；</li><li>每个系统调用都记录返回值、错误处理、资源释放和并发安全要求。</li></ul><h2 id="学习建议"><a href="#学习建议" class="headerlink" title="学习建议"></a>学习建议</h2><ol><li>先掌握 GCC、编译链接流程和 Makefile，再学习 Linux 系统接口；</li><li>按 <code>fork</code>、<code>execve</code>、<code>waitpid</code> 的顺序理解进程创建和执行；</li><li>先掌握管道和共享内存，再学习消息队列、信号和更复杂的 IPC；</li><li>网络部分先理解 TCP 状态和 Socket API，再对比多进程、多线程和 I&#x2F;O 多路复用服务器。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/linux-application-development-notes">linux-application-development-notes</a></li></ul>]]></content>
    
    
    <summary type="html">Linux 应用层开发笔记，覆盖 GCC 工具链与 Makefile、文件 I/O、进程与线程、IPC、TCP/UDP Socket 编程、守护进程与 select/poll/epoll 高并发模型。</summary>
    
    
    
    <category term="Linux 与工具" scheme="https://xiaogao-code.space/categories/Linux-%E4%B8%8E%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="C语言" scheme="https://xiaogao-code.space/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="Linux" scheme="https://xiaogao-code.space/tags/Linux/"/>
    
    <category term="多线程" scheme="https://xiaogao-code.space/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/"/>
    
    <category term="Socket" scheme="https://xiaogao-code.space/tags/Socket/"/>
    
    <category term="epoll" scheme="https://xiaogao-code.space/tags/epoll/"/>
    
    <category term="进程通信" scheme="https://xiaogao-code.space/tags/%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1/"/>
    
    <category term="Makefile" scheme="https://xiaogao-code.space/tags/Makefile/"/>
    
    <category term="文件IO" scheme="https://xiaogao-code.space/tags/%E6%96%87%E4%BB%B6IO/"/>
    
    <category term="进程管理" scheme="https://xiaogao-code.space/tags/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/"/>
    
    <category term="网络编程" scheme="https://xiaogao-code.space/tags/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/"/>
    
    <category term="守护进程" scheme="https://xiaogao-code.space/tags/%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>Linux、Shell 与正则表达式：文本处理三件套</title>
    <link href="https://xiaogao-code.space/2026/07/10/linux-shell-regex/"/>
    <id>https://xiaogao-code.space/2026/07/10/linux-shell-regex/</id>
    <published>2026-07-10T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>嵌入式开发离不开 Linux。这份笔记整理三块内容：Linux（Ubuntu）系统管理基础、Shell 脚本编程、正则表达式语法，合起来就是日常开发中最常用的”文本处理三件套”。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">Linux 基础</span><br><span class="line">    ├── Ubuntu、终端和远程登录</span><br><span class="line">    ├── 文件系统与目录结构</span><br><span class="line">    ├── 用户、用户组和文件权限</span><br><span class="line">    ├── 软件包、服务和系统管理</span><br><span class="line">    ├── 进程、磁盘和网络</span><br><span class="line">    └── crontab 定时任务</span><br><span class="line">            ↓</span><br><span class="line">Shell 脚本</span><br><span class="line">    ├── 脚本格式与执行</span><br><span class="line">    ├── 变量、参数和运算符</span><br><span class="line">    ├── 条件判断与循环</span><br><span class="line">    ├── 函数和系统命令</span><br><span class="line">    └── cut、awk 等文本处理</span><br><span class="line">            ↓</span><br><span class="line">正则表达式</span><br><span class="line">    ├── 普通字符和元字符</span><br><span class="line">    ├── 字符集、范围和边界</span><br><span class="line">    ├── 量词、分组和选择</span><br><span class="line">    ├── 转义、字符类和反向引用</span><br><span class="line">    └── 与 grep、Shell 文本处理结合</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="Linux（Ubuntu）系统管理"><a href="#Linux（Ubuntu）系统管理" class="headerlink" title="Linux（Ubuntu）系统管理"></a>Linux（Ubuntu）系统管理</h3><ul><li><strong>环境搭建</strong>：VMware + Ubuntu + Xshell 远程登录，理解 Linux 目录层级结构；</li><li><strong>系统管理</strong>：<code>systemctl</code> 管理服务与开机自启、防火墙、APT 软件包管理器；</li><li><strong>基本命令</strong>：<code>pwd</code>、<code>ls</code>、<code>cd</code>、<code>mkdir</code>、<code>cp</code>、<code>rm</code>、<code>mv</code>，输出重定向 <code>&gt;</code>、<code>&gt;&gt;</code> 与管道 <code>|</code>；</li><li><strong>编辑器与用户</strong>：VI&#x2F;VIM 三种模式，<code>adduser</code>、<code>passwd</code>、<code>sudo</code> 等用户管理命令；</li><li><strong>权限与搜索</strong>：<code>chmod</code>、<code>chown</code>、<code>chgrp</code> 管理权限，<code>find</code> 搜索，<code>grep</code> 过滤；</li><li><strong>磁盘、进程与定时任务</strong>：<code>df</code>、<code>du</code>、<code>ps</code>、<code>kill</code>、<code>top</code>、<code>netstat</code>、<code>crontab</code>。</li></ul><h3 id="Shell-脚本编程"><a href="#Shell-脚本编程" class="headerlink" title="Shell 脚本编程"></a>Shell 脚本编程</h3><ul><li>脚本格式与解释器声明，编写第一个 <code>helloworld.sh</code>；</li><li>特殊变量：<code>$n</code>（位置参数）、<code>$#</code>（参数个数）、<code>$*</code>&#x2F;<code>$@</code>（所有参数）、<code>$?</code>（退出状态）；</li><li>条件表达式判断字符串、整数和文件状态，<code>if</code> &#x2F; <code>case</code> 分支，<code>for</code> &#x2F; <code>while</code> 循环；</li><li><code>basename</code>、<code>dirname</code> 等系统函数，自定义 Shell 函数；</li><li><code>cut</code> 提取字段，<code>awk</code> 完成字段处理、过滤和格式化输出。</li></ul><h3 id="正则表达式语法"><a href="#正则表达式语法" class="headerlink" title="正则表达式语法"></a>正则表达式语法</h3><table><thead><tr><th>类别</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td>边界</td><td><code>^</code>、<code>$</code>、<code>\b</code>、<code>\B</code></td><td>行首、行尾与单词边界</td></tr><tr><td>量词</td><td><code>.</code>、<code>*</code>、<code>+</code>、<code>?</code>、<code>{n,m}</code></td><td>重复次数控制</td></tr><tr><td>分组</td><td><code>(pattern)</code>、<code>(?:pattern)</code></td><td>捕获与非捕获分组</td></tr><tr><td>选择</td><td>&#96;x</td><td>y&#96;</td></tr><tr><td>字符集</td><td><code>[xyz]</code>、<code>[^xyz]</code>、<code>[a-z]</code></td><td>字符集、排除集与范围</td></tr><tr><td>字符类</td><td><code>\d</code>、<code>\s</code>、<code>\w</code></td><td>数字、空白、单词字符</td></tr><tr><td>断言</td><td><code>(?=pattern)</code>、<code>(?!pattern)</code></td><td>正向 &#x2F; 负向先行断言</td></tr><tr><td>引用</td><td><code>\num</code></td><td>反向引用，匹配重复内容</td></tr></tbody></table><p>不同工具对正则的支持范围不同，实际使用时应以目标工具的语法实现为准。</p><h2 id="常用命令速查"><a href="#常用命令速查" class="headerlink" title="常用命令速查"></a>常用命令速查</h2><table><thead><tr><th>类别</th><th>命令</th><th>主要用途</th></tr></thead><tbody><tr><td>目录</td><td><code>ls</code>、<code>cd</code>、<code>mkdir</code></td><td>查看、切换和创建目录</td></tr><tr><td>查看</td><td><code>cat</code>、<code>less</code>、<code>tail</code></td><td>查看文件内容</td></tr><tr><td>文本</td><td><code>grep</code>、<code>cut</code>、<code>awk</code></td><td>搜索、截取和处理文本</td></tr><tr><td>权限</td><td><code>chmod</code>、<code>chown</code>、<code>chgrp</code></td><td>修改权限、所有者和用户组</td></tr><tr><td>进程</td><td><code>ps</code>、<code>top</code>、<code>kill</code></td><td>查看和管理进程</td></tr><tr><td>压缩</td><td><code>gzip</code>、<code>tar</code></td><td>压缩、解压和归档</td></tr><tr><td>服务</td><td><code>systemctl</code></td><td>管理系统服务</td></tr><tr><td>定时</td><td><code>crontab</code></td><td>配置周期性任务</td></tr></tbody></table><h2 id="安全注意事项"><a href="#安全注意事项" class="headerlink" title="安全注意事项"></a>安全注意事项</h2><ul><li><code>rm</code>、权限修改和防火墙配置可能影响系统，执行前应确认目标；</li><li>涉及 <code>sudo</code>、系统服务和用户管理的操作，建议先在虚拟机中验证；</li><li>修改权限时遵循最小权限原则，避免无必要地使用 <code>777</code>；</li><li>编写定时任务时确认脚本路径、环境变量、日志路径和执行用户。</li></ul><h2 id="学习建议"><a href="#学习建议" class="headerlink" title="学习建议"></a>学习建议</h2><ol><li>先完成 Linux 文件、目录、权限和进程管理，再学习 Shell 自动化；</li><li>每学习一个命令，都记录输入、输出、退出状态和常用参数；</li><li>使用小规模测试文件验证 <code>grep</code>、<code>cut</code>、<code>awk</code> 和正则表达式；</li><li>将多个命令通过管道、重定向和 Shell 函数组合成可复用脚本。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/linux-shell-regex-notes">linux-shell-regex-notes</a></li></ul>]]></content>
    
    
    <summary type="html">Linux（Ubuntu）系统管理、Shell 脚本编程与正则表达式语法笔记，涵盖文件权限、进程管理、crontab、条件循环、awk 文本处理与正则元字符速查。</summary>
    
    
    
    <category term="Linux 与工具" scheme="https://xiaogao-code.space/categories/Linux-%E4%B8%8E%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="Linux" scheme="https://xiaogao-code.space/tags/Linux/"/>
    
    <category term="Ubuntu" scheme="https://xiaogao-code.space/tags/Ubuntu/"/>
    
    <category term="Shell" scheme="https://xiaogao-code.space/tags/Shell/"/>
    
    <category term="正则表达式" scheme="https://xiaogao-code.space/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"/>
    
    <category term="grep" scheme="https://xiaogao-code.space/tags/grep/"/>
    
    <category term="awk" scheme="https://xiaogao-code.space/tags/awk/"/>
    
    <category term="sed" scheme="https://xiaogao-code.space/tags/sed/"/>
    
    <category term="crontab" scheme="https://xiaogao-code.space/tags/crontab/"/>
    
    <category term="系统管理" scheme="https://xiaogao-code.space/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/"/>
    
    <category term="文本处理" scheme="https://xiaogao-code.space/tags/%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>FreeRTOS 实时操作系统：从裸机到多任务调度</title>
    <link href="https://xiaogao-code.space/2026/06/28/freertos-learning-notes/"/>
    <id>https://xiaogao-code.space/2026/06/28/freertos-learning-notes/</id>
    <published>2026-06-28T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>裸机程序写到一定程度，总会遇到”多个任务如何同时运行”的问题。这份笔记整理 FreeRTOS 的完整学习路径：从任务状态与调度器讲起，覆盖内核移植、任务管理、任务间通信，最后延伸到 Tickless 低功耗与五种堆内存管理方案。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">RTOS 基础</span><br><span class="line">    ├── 裸机与 RTOS 的对比</span><br><span class="line">    ├── FreeRTOS 特点</span><br><span class="line">    ├── 任务调度</span><br><span class="line">    └── 任务状态</span><br><span class="line">            ↓</span><br><span class="line">内核移植与任务管理</span><br><span class="line">    ├── 源码结构和系统配置</span><br><span class="line">    ├── FreeRTOS 移植</span><br><span class="line">    ├── 任务创建与删除</span><br><span class="line">    ├── 任务挂起与恢复</span><br><span class="line">    └── 时间片调度</span><br><span class="line">            ↓</span><br><span class="line">实时系统服务</span><br><span class="line">    ├── 中断管理</span><br><span class="line">    ├── 时间管理</span><br><span class="line">    ├── 消息队列</span><br><span class="line">    ├── 信号量和互斥量</span><br><span class="line">    ├── 队列集、事件组和任务通知</span><br><span class="line">    └── 软件定时器</span><br><span class="line">            ↓</span><br><span class="line">系统级优化</span><br><span class="line">    ├── Tickless 低功耗</span><br><span class="line">    └── FreeRTOS 内存管理</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="RTOS-入门与基础（第-1-2-章）"><a href="#RTOS-入门与基础（第-1-2-章）" class="headerlink" title="RTOS 入门与基础（第 1-2 章）"></a>RTOS 入门与基础（第 1-2 章）</h3><ul><li>对比裸机编程与 RTOS 在任务调度、硬件管理和开发复杂度上的差异；</li><li>了解 FreeRTOS 开源、轻量级、可移植的特点；</li><li>认识任务的运行态、就绪态、阻塞态和挂起态，理解优先级对调度结果的影响。</li></ul><h3 id="内核移植与任务管理（第-3-8-章）"><a href="#内核移植与任务管理（第-3-8-章）" class="headerlink" title="内核移植与任务管理（第 3-8 章）"></a>内核移植与任务管理（第 3-8 章）</h3><ul><li>将内核源码加入 STM32 工程，配置 <code>FreeRTOSConfig.h</code>，修改 <code>stm32f1xx_it.c</code> 完成适配；</li><li>掌握动态创建、静态创建和任务删除 API，理解任务函数、任务栈与任务控制块；</li><li>使用 API 挂起和恢复任务，观察任务在各状态间的切换；</li><li>理解开关中断、临界段和调度器挂起与恢复，区分中断中可调用的 API；</li><li>观察同优先级任务的时间片轮转，查询任务状态与运行时间统计。</li></ul><h3 id="任务间通信（第-10-14-章）"><a href="#任务间通信（第-10-14-章）" class="headerlink" title="任务间通信（第 10-14 章）"></a>任务间通信（第 10-14 章）</h3><table><thead><tr><th>机制</th><th>主要用途</th><th>典型特点</th></tr></thead><tbody><tr><td>消息队列</td><td>传递结构化数据</td><td>支持多个消息，适合生产者与消费者</td></tr><tr><td>二值信号量</td><td>事件同步</td><td>只有可用和不可用两种状态</td></tr><tr><td>计数型信号量</td><td>资源计数</td><td>可表示多个资源或累计事件</td></tr><tr><td>互斥信号量</td><td>保护共享资源</td><td>支持优先级继承</td></tr><tr><td>队列集</td><td>同时等待多个通信对象</td><td>统一管理多个队列或信号量</td></tr><tr><td>事件标志组</td><td>等待多个条件</td><td>通过事件位组合系统状态</td></tr><tr><td>任务通知</td><td>单任务定向通知</td><td>开销小、速度快</td></tr></tbody></table><p>其中互斥量的<strong>优先级继承机制</strong>是重点：它可以降低优先级翻转带来的实时性风险，这也是互斥量与二值信号量最本质的区别。</p><h3 id="软件定时器与系统优化（第-15-17-章）"><a href="#软件定时器与系统优化（第-15-17-章）" class="headerlink" title="软件定时器与系统优化（第 15-17 章）"></a>软件定时器与系统优化（第 15-17 章）</h3><ul><li>区分单次定时器和周期定时器，理解定时器服务任务的调度方式；</li><li>配置 Tickless 模式，观察系统空闲时的低功耗行为；</li><li>对比 <code>heap_1</code> 到 <code>heap_5</code> 五种内存管理方案，根据是否支持释放、内存碎片和系统需求进行选择。</li></ul><h2 id="动态与静态创建对比"><a href="#动态与静态创建对比" class="headerlink" title="动态与静态创建对比"></a>动态与静态创建对比</h2><table><thead><tr><th>方式</th><th>特点</th><th>适用场景</th></tr></thead><tbody><tr><td>动态创建</td><td>从 FreeRTOS 堆中申请任务控制块和任务栈</td><td>任务数量或生命周期需要灵活变化</td></tr><tr><td>静态创建</td><td>由应用程序提供任务控制块和任务栈</td><td>需要确定性内存、避免运行时分配</td></tr></tbody></table><h2 id="学习建议"><a href="#学习建议" class="headerlink" title="学习建议"></a>学习建议</h2><ol><li>先理解任务状态、优先级和调度器，再开始学习通信机制；</li><li>先用动态方法完成任务实验，再用静态方法比较内存管理差异；</li><li>学习每个 API 时同时记录调用环境、阻塞行为、超时参数和中断可用性；</li><li>先掌握队列、二值信号量和互斥量，再学习队列集、事件组和任务通知；</li><li>使用任务状态查询和运行时间统计定位调度、阻塞和优先级问题。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/freertos-learning-notes">freertos-learning-notes</a></li></ul>]]></content>
    
    
    <summary type="html">FreeRTOS 实时操作系统学习笔记，覆盖任务调度、内核移植、消息队列、信号量、事件组、任务通知、软件定时器、Tickless 低功耗与内存管理。</summary>
    
    
    
    <category term="嵌入式开发" scheme="https://xiaogao-code.space/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="FreeRTOS" scheme="https://xiaogao-code.space/tags/FreeRTOS/"/>
    
    <category term="RTOS" scheme="https://xiaogao-code.space/tags/RTOS/"/>
    
    <category term="任务调度" scheme="https://xiaogao-code.space/tags/%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6/"/>
    
    <category term="信号量" scheme="https://xiaogao-code.space/tags/%E4%BF%A1%E5%8F%B7%E9%87%8F/"/>
    
    <category term="消息队列" scheme="https://xiaogao-code.space/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/"/>
    
    <category term="Tickless" scheme="https://xiaogao-code.space/tags/Tickless/"/>
    
    <category term="事件组" scheme="https://xiaogao-code.space/tags/%E4%BA%8B%E4%BB%B6%E7%BB%84/"/>
    
    <category term="软件定时器" scheme="https://xiaogao-code.space/tags/%E8%BD%AF%E4%BB%B6%E5%AE%9A%E6%97%B6%E5%99%A8/"/>
    
    <category term="低功耗" scheme="https://xiaogao-code.space/tags/%E4%BD%8E%E5%8A%9F%E8%80%97/"/>
    
    <category term="内核移植" scheme="https://xiaogao-code.space/tags/%E5%86%85%E6%A0%B8%E7%A7%BB%E6%A4%8D/"/>
    
  </entry>
  
  <entry>
    <title>STM32 单片机开发笔记：从寄存器到物联网通信</title>
    <link href="https://xiaogao-code.space/2026/06/15/stm32-mcu-development-notes/"/>
    <id>https://xiaogao-code.space/2026/06/15/stm32-mcu-development-notes/</id>
    <published>2026-06-15T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>STM32 是嵌入式开发的主战场。这份笔记覆盖基础外设、通信协议、存储器、低功耗、实时系统和工程开发流程，从寄存器与 HAL 库双视角出发，一路延伸到 CAN、以太网、Wi-Fi、蓝牙和 LoRa 等物联网通信。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">STM32 基础</span><br><span class="line">    ├── ARM 内核、STM32 系列和开发工具</span><br><span class="line">    ├── 最小系统、开发板和工程创建</span><br><span class="line">    ├── GPIO、时钟和 HAL 库</span><br><span class="line">    ├── 中断、USART、I2C 和定时器</span><br><span class="line">    ├── DMA、ADC、SPI 和外部存储</span><br><span class="line">    └── FSMC、LCD 和寄存器映射</span><br><span class="line">            ↓</span><br><span class="line">STM32 高级通信</span><br><span class="line">    ├── CAN 总线</span><br><span class="line">    ├── W5500 以太网</span><br><span class="line">    ├── ESP32-C3 Wi-Fi</span><br><span class="line">    ├── ESP32-C3 Bluetooth LE</span><br><span class="line">    └── LoRa 节点与网关</span><br><span class="line">            ↓</span><br><span class="line">STM32 系统扩展</span><br><span class="line">    ├── 电源管理与低功耗</span><br><span class="line">    ├── RTC 与备份寄存器</span><br><span class="line">    ├── 闹钟唤醒和掉电保持</span><br><span class="line">    ├── 独立看门狗与窗口看门狗</span><br><span class="line">    └── HAL 工程结构、编译过程和程序状态</span><br></pre></td></tr></table></figure><h2 id="基础篇：外设与开发流程"><a href="#基础篇：外设与开发流程" class="headerlink" title="基础篇：外设与开发流程"></a>基础篇：外设与开发流程</h2><ol><li><strong>芯片与工程环境</strong>：ARM 内核介绍、STM32 系列命名规则、Keil MDK &#x2F; STM32CubeMX &#x2F; ST-LINK 工具链、最小系统与第一个工程；</li><li><strong>GPIO 与寄存器</strong>：工作模式、端口配置和数据寄存器（<code>GPIOx_CRL/CRH/IDR/ODR/BSRR/BRR/LCKR</code>），寄存器方式实现流水灯；</li><li><strong>系统架构与时钟</strong>：STM32 总体架构与时钟树；</li><li><strong>HAL 库开发</strong>：CubeMX 生成 HAL 工程，理解自动生成代码和用户代码的组织方式；</li><li><strong>中断</strong>：中断体系、NVIC、外部中断控制器与按键检测案例；</li><li><strong>USART 串口通信</strong>：并行&#x2F;串行、单工&#x2F;半双工&#x2F;全双工、同步&#x2F;异步，轮询与中断接收，<code>printf</code> 重定向；</li><li><strong>I2C 通信</strong>：通过 M24C02 案例学习软件模拟 I2C 与硬件 I2C；</li><li><strong>定时器</strong>：SysTick、基本&#x2F;通用&#x2F;高级定时器，PWM 呼吸灯与频率、占空比测量；</li><li><strong>DMA</strong>：ROM 到 RAM、RAM 到串口的数据传输；</li><li><strong>ADC</strong>：逐次逼近型 ADC 原理、单通道采集与多通道采集；</li><li><strong>SPI 与 Flash</strong>：W25Q32 读写，软件模拟 SPI 与硬件 SPI；</li><li><strong>存储器与 FSMC</strong>：存储器映射、FSMC 扩展外部 SRAM、8080 时序控制 LCD。</li></ol><h2 id="高级篇：物联网通信"><a href="#高级篇：物联网通信" class="headerlink" title="高级篇：物联网通信"></a>高级篇：物联网通信</h2><ul><li><strong>CAN 通信</strong>：物理层、协议层、数据帧与总线仲裁，环回静默模式测试与双节点通信；</li><li><strong>以太网与 W5500</strong>：OSI 七层模型、TCP&#x2F;IP 四层模型，TCP 服务端&#x2F;客户端、UDP 通信与简易 Web 服务器；</li><li><strong>Wi-Fi 与 ESP32-C3</strong>：ESP-AT 固件与 AT 指令，STM32 与 ESP32-C3 串口交互，建立 TCP 通信；</li><li><strong>Bluetooth LE</strong>：BLE 协议栈（PHY &#x2F; LL &#x2F; HCI &#x2F; GAP &#x2F; ATT &#x2F; GATT）、广播扫描与透传模式数据收发；</li><li><strong>LoRa</strong>：E220-400M22S 模块、普通节点与网关搭建，验证节点到网关的数据传输。</li></ul><h2 id="扩展篇：系统级功能"><a href="#扩展篇：系统级功能" class="headerlink" title="扩展篇：系统级功能"></a>扩展篇：系统级功能</h2><ul><li><strong>电源控制与低功耗</strong>：睡眠、停机、待机三种低功耗模式与唤醒源管理；</li><li><strong>RTC 与备份域</strong>：掉电继续运行、备份寄存器保存数据、闹钟唤醒待机模式；</li><li><strong>看门狗</strong>：独立看门狗与窗口看门狗的工作方式和触发条件；</li><li><strong>HAL 工程与编译流程</strong>：<code>startup_stm32f103xe.s</code>、<code>system_stm32f1xx.c</code>、<code>HAL_Init()</code> 初始化流程与 Keil MDK 编译过程。</li></ul><h2 id="开发方式对比"><a href="#开发方式对比" class="headerlink" title="开发方式对比"></a>开发方式对比</h2><table><thead><tr><th>方式</th><th>主要特点</th><th>学习重点</th></tr></thead><tbody><tr><td>寄存器开发</td><td>直接操作外设寄存器，接近芯片硬件</td><td>地址、位域、时序和参考手册</td></tr><tr><td>HAL 库开发</td><td>使用 ST 提供的抽象接口，提高开发效率</td><td>CubeMX 配置、回调、状态和生成代码</td></tr><tr><td>混合开发</td><td>在 HAL 工程中针对关键功能使用寄存器</td><td>抽象层边界、时序控制和可维护性</td></tr></tbody></table><h2 id="推荐学习顺序"><a href="#推荐学习顺序" class="headerlink" title="推荐学习顺序"></a>推荐学习顺序</h2><ol><li>完成基础篇中的 GPIO、时钟、HAL 和第一个下载运行工程；</li><li>按 USART、I2C、SPI 的顺序学习常用片上通信接口；</li><li>学习中断、定时器、DMA 和 ADC，建立事件驱动与数据搬运能力；</li><li>学习存储器映射、FSMC 和 LCD，理解外部设备扩展；</li><li>进入高级篇，依次学习 CAN、以太网、Wi-Fi、蓝牙和 LoRa；</li><li>最后学习扩展篇中的低功耗、RTC、备份域、看门狗和 HAL 工程分析。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/stm32-mcu-development-notes">stm32-mcu-development-notes</a></li></ul>]]></content>
    
    
    <summary type="html">STM32 单片机开发课程笔记，覆盖 GPIO、中断、USART、I2C、SPI、DMA、ADC、FSMC 等外设，以及 CAN、以太网、Wi-Fi、BLE、LoRa 等物联网通信。</summary>
    
    
    
    <category term="嵌入式开发" scheme="https://xiaogao-code.space/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="STM32" scheme="https://xiaogao-code.space/tags/STM32/"/>
    
    <category term="HAL" scheme="https://xiaogao-code.space/tags/HAL/"/>
    
    <category term="寄存器" scheme="https://xiaogao-code.space/tags/%E5%AF%84%E5%AD%98%E5%99%A8/"/>
    
    <category term="CAN" scheme="https://xiaogao-code.space/tags/CAN/"/>
    
    <category term="LoRa" scheme="https://xiaogao-code.space/tags/LoRa/"/>
    
    <category term="物联网" scheme="https://xiaogao-code.space/tags/%E7%89%A9%E8%81%94%E7%BD%91/"/>
    
    <category term="GPIO" scheme="https://xiaogao-code.space/tags/GPIO/"/>
    
    <category term="中断系统" scheme="https://xiaogao-code.space/tags/%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="DMA" scheme="https://xiaogao-code.space/tags/DMA/"/>
    
    <category term="通信协议" scheme="https://xiaogao-code.space/tags/%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/"/>
    
  </entry>
  
  <entry>
    <title>原理图与 PCB 设计：从嘉立创 EDA 入门到实战案例</title>
    <link href="https://xiaogao-code.space/2026/06/03/schematic-and-pcb-design/"/>
    <id>https://xiaogao-code.space/2026/06/03/schematic-and-pcb-design/</id>
    <published>2026-06-03T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>从原理图到一块能用的 PCB，中间隔着一条完整的工程流程。这份笔记整理嘉立创 EDA 的使用、原理图设计、PCB 布局布线、自定义符号与封装，以及焊接技能，并附案例练习。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">EDA 与项目基础</span><br><span class="line">    ├── EDA 软件和 PCB 行业工具</span><br><span class="line">    ├── 嘉立创 EDA 环境</span><br><span class="line">    ├── 绘制单位和工程管理</span><br><span class="line">    └── 原理图到 PCB 的完整流程</span><br><span class="line">            ↓</span><br><span class="line">原理图设计</span><br><span class="line">    ├── 搜索与放置元器件</span><br><span class="line">    ├── 电源、接地和网络连接</span><br><span class="line">    ├── 元器件名称、位号和方向</span><br><span class="line">    └── DRC 检查</span><br><span class="line">            ↓</span><br><span class="line">PCB 设计</span><br><span class="line">    ├── 从原理图生成 PCB</span><br><span class="line">    ├── 板框与元器件布局</span><br><span class="line">    ├── 布线、铺铜和网络标识</span><br><span class="line">    ├── 丝印调整与 DRC</span><br><span class="line">    └── 3D 仿真和生产资料导出</span><br><span class="line">            ↓</span><br><span class="line">进阶设计</span><br><span class="line">    ├── 多层板、盲埋孔和泪滴</span><br><span class="line">    ├── 文件导入与导出</span><br><span class="line">    ├── 自定义符号和封装</span><br><span class="line">    └── 封装尺寸与器件绑定</span><br><span class="line">            ↓</span><br><span class="line">案例与焊接</span><br><span class="line">    ├── 可调电阻、独立按键</span><br><span class="line">    ├── 74HC138 译码器</span><br><span class="line">    ├── 74HC245 信号放大器</span><br><span class="line">    ├── LM358 PWM 方波</span><br><span class="line">    └── 电烙铁、焊锡和返修工具</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="第一章：嘉立创-EDA-快速入门"><a href="#第一章：嘉立创-EDA-快速入门" class="headerlink" title="第一章：嘉立创 EDA 快速入门"></a>第一章：嘉立创 EDA 快速入门</h3><ul><li>理解 EDA（Electronic Design Automation）的基本作用；</li><li>以按键点灯为例学习元器件搜索、放置、连线、属性调整和位号管理；</li><li>从原理图生成 PCB，完成板框、布局、布线、网络标识、铺铜和丝印；</li><li>使用 DRC 检查连接错误，查看 PCB 三维仿真效果，了解下单和生产资料准备。</li></ul><h3 id="第二章：PCB-板制作基础"><a href="#第二章：PCB-板制作基础" class="headerlink" title="第二章：PCB 板制作基础"></a>第二章：PCB 板制作基础</h3><p><strong>布局基本原则</strong>：</p><ul><li>电气连接紧密的器件进行模块化布局；</li><li>接口器件靠近板边并明确方向、电压等级和正负极；</li><li>高压、低压、大电流、高频和热源器件合理分区；</li><li>去耦电容和滤波电容靠近电源入口或电源转换器件。</li></ul><p><strong>布线基本原则</strong>：</p><ul><li>根据电流、频率、板厂工艺和信号完整性要求设置线宽线距；</li><li>避免使用小于 90 度的走线拐角；</li><li>高速和高频信号线注意间距与干扰控制。</li></ul><h3 id="第三章：EDA-使用技巧"><a href="#第三章：EDA-使用技巧" class="headerlink" title="第三章：EDA 使用技巧"></a>第三章：EDA 使用技巧</h3><p>批量扇出添加网络标签、排查铺铜后仍存在的飞线、导入外部图片和 Logo、配置多层板与盲埋孔、使用泪滴增强导线与焊盘连接的可靠性，以及工程文件的导入导出。</p><h3 id="第四章：自定义符号及器件封装"><a href="#第四章：自定义符号及器件封装" class="headerlink" title="第四章：自定义符号及器件封装"></a>第四章：自定义符号及器件封装</h3><ul><li>在标准模式和专业模式下创建自定义原理图符号；</li><li>手工绘制 0805 电容封装，使用封装向导生成 CH340N 封装；</li><li>进行封装尺寸检查，将原理图符号与个人封装绑定；</li><li>了解 DIP、QFP、SOP、QFN、BGA 等常见芯片封装。</li></ul><h3 id="第五章：案例与焊接"><a href="#第五章：案例与焊接" class="headerlink" title="第五章：案例与焊接"></a>第五章：案例与焊接</h3><ul><li>可调电阻控制 LED 亮度、独立按键控制 LED 亮灭；</li><li>使用 74HC138 实现 3-8 译码器电路、74HC245 增强驱动能力、LM358 产生 PWM 方波；</li><li>焊接技能：电烙铁使用、有铅&#x2F;无铅焊锡与助焊剂、蓝丁胶固定、放大镜检查、吸锡器拆焊返修。</li></ul><h2 id="PCB-设计流程速查"><a href="#PCB-设计流程速查" class="headerlink" title="PCB 设计流程速查"></a>PCB 设计流程速查</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">需求分析 → 元器件选型 → 建立或确认符号与封装 → 绘制原理图</span><br><span class="line">  → 原理图 DRC → 生成 PCB → 板框和器件布局 → 布线与铺铜</span><br><span class="line">  → 丝印和网络标识 → PCB DRC 与目测检查 → 3D 检查和生产资料导出</span><br><span class="line">  → PCB 制作、焊接、调试与测试</span><br></pre></td></tr></table></figure><h2 id="常用工程检查点"><a href="#常用工程检查点" class="headerlink" title="常用工程检查点"></a>常用工程检查点</h2><table><thead><tr><th>阶段</th><th>重点检查内容</th></tr></thead><tbody><tr><td>元器件选型</td><td>参数、封装、引脚定义、供货和替代型号</td></tr><tr><td>原理图</td><td>电源、地、网络名称、引脚连接、位号和未连接引脚</td></tr><tr><td>原理图 DRC</td><td>悬空引脚、短路、未连接网络和规则警告</td></tr><tr><td>PCB 布局</td><td>模块分区、接口方向、高压间距、散热和去耦位置</td></tr><tr><td>PCB 布线</td><td>线宽、线距、转角、回流路径、干扰和大电流承载能力</td></tr><tr><td>PCB DRC</td><td>间距、短路、未连接网络、板框和设计规则</td></tr><tr><td>生产准备</td><td>板层、板框、丝印、封装、Gerber、BOM 和装配要求</td></tr><tr><td>焊接调试</td><td>极性、焊点、虚焊、连锡、供电电压和通电顺序</td></tr></tbody></table><h2 id="学习建议"><a href="#学习建议" class="headerlink" title="学习建议"></a>学习建议</h2><ol><li>先完成按键点灯案例，熟悉原理图到 PCB 的完整闭环；</li><li>每次绘制原理图后先完成 DRC，再开始 PCB 布局和布线；</li><li>选型时同时查看数据手册、封装尺寸、引脚定义和实际采购信息；</li><li>布局时先划分电源、接口、控制、时钟和信号模块，再处理模块间连接；</li><li>焊接前确认元器件方向、极性、封装和焊盘对应关系。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/schematic-and-pcb-design">schematic-and-pcb-design</a></li></ul>]]></content>
    
    
    <summary type="html">原理图绘制、PCB 设计、EDA 工具使用、元器件封装与焊接技能笔记，附完整 PCB 设计流程与工程检查清单。</summary>
    
    
    
    <category term="硬件设计" scheme="https://xiaogao-code.space/categories/%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/"/>
    
    
    <category term="PCB" scheme="https://xiaogao-code.space/tags/PCB/"/>
    
    <category term="EDA" scheme="https://xiaogao-code.space/tags/EDA/"/>
    
    <category term="原理图" scheme="https://xiaogao-code.space/tags/%E5%8E%9F%E7%90%86%E5%9B%BE/"/>
    
    <category term="封装" scheme="https://xiaogao-code.space/tags/%E5%B0%81%E8%A3%85/"/>
    
    <category term="焊接" scheme="https://xiaogao-code.space/tags/%E7%84%8A%E6%8E%A5/"/>
    
    <category term="嘉立创EDA" scheme="https://xiaogao-code.space/tags/%E5%98%89%E7%AB%8B%E5%88%9BEDA/"/>
    
    <category term="布线" scheme="https://xiaogao-code.space/tags/%E5%B8%83%E7%BA%BF/"/>
    
    <category term="制造工艺" scheme="https://xiaogao-code.space/tags/%E5%88%B6%E9%80%A0%E5%B7%A5%E8%89%BA/"/>
    
  </entry>
  
  <entry>
    <title>数字电路与计算机组成：从逻辑门到自制 CPU</title>
    <link href="https://xiaogao-code.space/2026/05/22/digital-logic-and-computer-organization/"/>
    <id>https://xiaogao-code.space/2026/05/22/digital-logic-and-computer-organization/</id>
    <published>2026-05-22T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>理解计算机最好的方式，是自己造一台。这份笔记从二进制和逻辑门开始，用 Digital 仿真软件逐步设计出一台能运行汇编程序的简单计算机，最后延伸到总线、引导程序和单片机启动流程。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">数字电路基础</span><br><span class="line">    ├── 二进制数据表达</span><br><span class="line">    ├── 基础逻辑门和组合逻辑</span><br><span class="line">    ├── 运算器</span><br><span class="line">    ├── 锁存器、触发器和寄存器</span><br><span class="line">    └── Digital 电路仿真</span><br><span class="line">            ↓</span><br><span class="line">计算机组成原理</span><br><span class="line">    ├── 冯诺依曼模型</span><br><span class="line">    ├── CPU、内存和 I/O</span><br><span class="line">    ├── 程序执行过程</span><br><span class="line">    └── 简单计算机</span><br><span class="line">            ↓</span><br><span class="line">设计计算机硬件</span><br><span class="line">    ├── ALU 和计算单元</span><br><span class="line">    ├── 数据存储和指令存储</span><br><span class="line">    ├── 控制信号和控制器</span><br><span class="line">    ├── RAM、PC 和指令寄存器</span><br><span class="line">    └── 取指、译码与执行</span><br><span class="line">            ↓</span><br><span class="line">汇编语言、总线与引导程序</span><br><span class="line">    ├── 自定义指令集和汇编程序</span><br><span class="line">    ├── 总线与地址映射</span><br><span class="line">    └── 引导流程和单片机启动</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="第一章：数字电路基础"><a href="#第一章：数字电路基础" class="headerlink" title="第一章：数字电路基础"></a>第一章：数字电路基础</h3><ul><li>理解二进制、位（bit）、字节（byte）和数据单位；</li><li>使用 Digital 仿真软件观察数字电路行为；</li><li>掌握与门、或门、非门以及其他基础逻辑门；</li><li>理解 SR 锁存器、D 锁存器和边沿触发 D 触发器，认识寄存器在时序电路中的作用。</li></ul><h3 id="第二章：计算机组成原理"><a href="#第二章：计算机组成原理" class="headerlink" title="第二章：计算机组成原理"></a>第二章：计算机组成原理</h3><ul><li>理解冯诺依曼模型计算机的基本结构、CPU、内存和输入&#x2F;输出系统的职责；</li><li>认识程序从存储到执行的基本过程；</li><li>对比不同计算机体系结构的特点。</li></ul><h3 id="第三章：设计计算机硬件"><a href="#第三章：设计计算机硬件" class="headerlink" title="第三章：设计计算机硬件"></a>第三章：设计计算机硬件</h3><p>本章以逐步扩展的方式设计一台简单计算机，重点关注数据通路、控制信号和指令执行：</p><ul><li>实现 ALU 和简单计算单元，使用寄存器实现数据存储；</li><li>添加指令存储和程序计数器（PC），逐步增加 <code>halt</code>、<code>str</code>、<code>ld</code>、<code>jmp</code>、<code>cmp</code> 和 <code>je</code> 等指令；</li><li>设计控制器并维护控制信号查找表，将指令存储和数据存储合并为统一 RAM；</li><li>增加立即数功能和 B 寄存器，通过测试程序验证指令集与硬件电路。</li></ul><h3 id="第四章：设计计算机汇编语言"><a href="#第四章：设计计算机汇编语言" class="headerlink" title="第四章：设计计算机汇编语言"></a>第四章：设计计算机汇编语言</h3><ul><li>根据自定义指令集编写汇编程序；</li><li>使用加载、加法、跳转、比较和保存等指令组织程序流程；</li><li>通过求和等示例测试汇编程序在自制计算机上的执行结果。</li></ul><h3 id="第五章至第六章：总线与引导程序"><a href="#第五章至第六章：总线与引导程序" class="headerlink" title="第五章至第六章：总线与引导程序"></a>第五章至第六章：总线与引导程序</h3><ul><li>理解总线的作用、基本组成和地址映射，以及 CPU 如何访问不同的存储和 I&#x2F;O 设备；</li><li>理解计算机上电后的引导流程，设计从初始化、加载到跳转执行的启动过程；</li><li>了解单片机引导流程与通用计算机启动过程的联系。</li></ul><h3 id="第七章：常用数字芯片"><a href="#第七章：常用数字芯片" class="headerlink" title="第七章：常用数字芯片"></a>第七章：常用数字芯片</h3><p>与门、或门、非门、<code>74HC245N</code>（缓冲器&#x2F;总线收发器）、<code>74HC138</code>（译码器）和 <code>DS1302</code>（实时时钟芯片）。</p><h2 id="指令设计演进"><a href="#指令设计演进" class="headerlink" title="指令设计演进"></a>指令设计演进</h2><p>课件中的自制计算机按照以下顺序逐步扩展：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">基础加法与减法</span><br><span class="line">    ↓</span><br><span class="line">halt 停机</span><br><span class="line">    ↓</span><br><span class="line">str 存储、ld 加载</span><br><span class="line">    ↓</span><br><span class="line">逻辑运算与寄存器选择</span><br><span class="line">    ↓</span><br><span class="line">jmp 无条件跳转</span><br><span class="line">    ↓</span><br><span class="line">cmp 条件比较、je 条件跳转</span><br><span class="line">    ↓</span><br><span class="line">统一 RAM 与取指/执行周期</span><br><span class="line">    ↓</span><br><span class="line">立即数</span><br><span class="line">    ↓</span><br><span class="line">B 寄存器与更完整的指令集</span><br><span class="line">    ↓</span><br><span class="line">汇编程序和引导程序</span><br></pre></td></tr></table></figure><h2 id="核心概念速查"><a href="#核心概念速查" class="headerlink" title="核心概念速查"></a>核心概念速查</h2><table><thead><tr><th>概念</th><th>作用</th></tr></thead><tbody><tr><td>Bit &#x2F; Byte</td><td>最小数据单位 &#x2F; 通常 8 个 bit</td></tr><tr><td>Logic gate</td><td>对二进制信号执行逻辑运算</td></tr><tr><td>Latch &#x2F; Flip-flop</td><td>按控制条件 &#x2F; 时钟边沿保存数据</td></tr><tr><td>Register</td><td>保存多个 bit 的时序电路</td></tr><tr><td>ALU</td><td>执行算术和逻辑运算</td></tr><tr><td>PC</td><td>保存下一条指令地址的程序计数器</td></tr><tr><td>RAM</td><td>保存可读写的数据或指令</td></tr><tr><td>Control unit</td><td>根据指令生成控制信号</td></tr><tr><td>Bus</td><td>连接 CPU、内存和 I&#x2F;O 的共享传输通道</td></tr><tr><td>Instruction set</td><td>计算机能够识别和执行的指令集合</td></tr></tbody></table><h2 id="学习建议"><a href="#学习建议" class="headerlink" title="学习建议"></a>学习建议</h2><ol><li>先掌握二进制、逻辑门、真值表和基本时序电路；</li><li>使用 Digital 仿真软件跟踪每一个输入、输出和控制信号；</li><li>学习 CPU 设计时，分别记录数据通路、控制通路、时钟状态和指令格式；</li><li>阅读每条指令时，同时关注操作码、操作数、寄存器变化和内存变化；</li><li>从简单指令开始编写测试程序，再逐步验证跳转、立即数、寄存器和 I&#x2F;O 功能。</li></ol><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/digital-logic-and-computer-organization">digital-logic-and-computer-organization</a></li></ul>]]></content>
    
    
    <summary type="html">数字电路、计算机组成原理和计算机硬件设计笔记——用仿真软件从逻辑门开始，逐步搭出一台能运行汇编程序的简单计算机。</summary>
    
    
    
    <category term="硬件设计" scheme="https://xiaogao-code.space/categories/%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/"/>
    
    
    <category term="数字电路" scheme="https://xiaogao-code.space/tags/%E6%95%B0%E5%AD%97%E7%94%B5%E8%B7%AF/"/>
    
    <category term="计算机组成" scheme="https://xiaogao-code.space/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/"/>
    
    <category term="CPU" scheme="https://xiaogao-code.space/tags/CPU/"/>
    
    <category term="汇编" scheme="https://xiaogao-code.space/tags/%E6%B1%87%E7%BC%96/"/>
    
    <category term="逻辑门" scheme="https://xiaogao-code.space/tags/%E9%80%BB%E8%BE%91%E9%97%A8/"/>
    
    <category term="组合逻辑" scheme="https://xiaogao-code.space/tags/%E7%BB%84%E5%90%88%E9%80%BB%E8%BE%91/"/>
    
    <category term="时序逻辑" scheme="https://xiaogao-code.space/tags/%E6%97%B6%E5%BA%8F%E9%80%BB%E8%BE%91/"/>
    
    <category term="触发器" scheme="https://xiaogao-code.space/tags/%E8%A7%A6%E5%8F%91%E5%99%A8/"/>
    
    <category term="指令系统" scheme="https://xiaogao-code.space/tags/%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>模拟电路与常用元器件：软硬件的交界处</title>
    <link href="https://xiaogao-code.space/2026/05/10/analog-circuits-and-components/"/>
    <id>https://xiaogao-code.space/2026/05/10/analog-circuits-and-components/</id>
    <published>2026-05-10T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>写嵌入式软件，离不开对硬件的理解。这份笔记整理模拟电路基础、常用电子元器件、半导体器件和硬件参数英文资料，适合嵌入式软件开发者补齐硬件基础。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">电学基础</span><br><span class="line">    ├── 电流、电压、电阻和电路</span><br><span class="line">    ├── 直流、交流、弱电和强电</span><br><span class="line">    └── 欧姆定律、功率、焦耳定律、串联与并联</span><br><span class="line">            ↓</span><br><span class="line">常见电子元器件</span><br><span class="line">    ├── 电阻器、电容器、电感器</span><br><span class="line">    ├── 磁珠、继电器、保险丝、接插件</span><br><span class="line">    ├── 蜂鸣器、晶振、电池、稳压电源芯片</span><br><span class="line">    └── 万用表和电路仿真软件</span><br><span class="line">            ↓</span><br><span class="line">模拟电路与半导体</span><br><span class="line">    ├── 模拟信号与模拟电路</span><br><span class="line">    ├── 二极管与稳压二极管</span><br><span class="line">    ├── 三极管</span><br><span class="line">    └── MOS 管</span><br><span class="line">            ↓</span><br><span class="line">典型电路实践</span><br><span class="line">    ├── 压敏电阻、上拉电阻、下拉电阻</span><br><span class="line">    ├── 限流电阻、零欧姆电阻</span><br><span class="line">    └── 滤波、耦合和旁路电容</span><br><span class="line">            ↓</span><br><span class="line">测量与工程应用</span><br><span class="line">    ├── 常用电气符号</span><br><span class="line">    ├── 直流稳压电源</span><br><span class="line">    └── 示波器与万用表</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="第一章：电学基础"><a href="#第一章：电学基础" class="headerlink" title="第一章：电学基础"></a>第一章：电学基础</h3><ul><li>区分直流电与交流电、弱电与强电，了解通路、断路、短路和家庭电路的基本组成；</li><li>掌握欧姆定律、功率计算、焦耳定律，理解串联电路和并联电路的基本特点。</li></ul><h3 id="第二章：常见电子元器件"><a href="#第二章：常见电子元器件" class="headerlink" title="第二章：常见电子元器件"></a>第二章：常见电子元器件</h3><ul><li>电阻器：阻值、功率、精度和阻值识别方法，以及光敏、热敏、压敏等特种电阻；</li><li>电容器：容量、耐压、容差，以及固定电容、可变电容和超级电容；</li><li>电感器：储能、通直隔交特性和感抗；</li><li>磁珠、继电器、保险丝、接插件、轻触按键、有源&#x2F;无源蜂鸣器、晶振和稳压电源芯片；</li><li>万用表的基本功能、测量方法和安全注意事项。</li></ul><h3 id="第三章：模拟电路基础"><a href="#第三章：模拟电路基础" class="headerlink" title="第三章：模拟电路基础"></a>第三章：模拟电路基础</h3><ul><li>模拟信号与数字信号的区别，模拟电路在信号滤波、放大和传递中的作用；</li><li>二极管的单向导通特性、发光二极管、数码管和稳压二极管；</li><li>NPN &#x2F; PNP 三极管的基本结构和开关原理；</li><li>MOS 管通过电场控制电流的基本原理；</li><li>结合光感灯案例理解传感器信号与器件控制。</li></ul><h3 id="第四章：典型电路实践"><a href="#第四章：典型电路实践" class="headerlink" title="第四章：典型电路实践"></a>第四章：典型电路实践</h3><ul><li><strong>压敏电阻</strong>：过压保护和尖峰电压钳位；</li><li><strong>上拉 &#x2F; 下拉电阻</strong>：使信号线在空闲状态保持高 &#x2F; 低电平；</li><li><strong>限流电阻</strong>：将电流限制在元器件正常工作范围内；</li><li><strong>零欧姆电阻</strong>：跨接、调试、测量和 PCB 布线调整；</li><li><strong>滤波、耦合、旁路电容</strong>：抑制干扰、隔离直流传递交流、为高频干扰提供旁路。</li></ul><h2 id="硬件参数英文速查"><a href="#硬件参数英文速查" class="headerlink" title="硬件参数英文速查"></a>硬件参数英文速查</h2><table><thead><tr><th>English</th><th>中文含义</th></tr></thead><tbody><tr><td><code>DC / AC</code></td><td>直流 &#x2F; 交流</td></tr><tr><td><code>Current / Voltage / Power</code></td><td>电流 &#x2F; 电压 &#x2F; 功率</td></tr><tr><td><code>Rated Voltage / Current / Power</code></td><td>额定电压 &#x2F; 电流 &#x2F; 功率</td></tr><tr><td><code>Resistance / Capacitance</code></td><td>阻值 &#x2F; 电容量</td></tr><tr><td><code>Tolerance</code></td><td>公差、允许偏差</td></tr><tr><td><code>Operating Temperature Range</code></td><td>工作温度范围</td></tr><tr><td><code>Withstand Voltage</code></td><td>耐压</td></tr><tr><td><code>Forward Voltage</code></td><td>正向电压</td></tr><tr><td><code>Varistor Voltage</code></td><td>压敏电压</td></tr><tr><td><code>Maximum Clamping Voltage</code></td><td>最大钳位电压</td></tr><tr><td><code>Surge Current</code></td><td>冲击电流、浪涌电流</td></tr><tr><td><code>Storage Temperature Range</code></td><td>储存温度范围</td></tr></tbody></table><h2 id="元器件选型关注点"><a href="#元器件选型关注点" class="headerlink" title="元器件选型关注点"></a>元器件选型关注点</h2><p>阅读元器件数据手册时，建议至少确认：工作电压和最大允许电压；工作电流、最大电流和浪涌电流；功率、散热条件和工作温度范围；标称值、容差、精度和温度系数；封装、引脚定义、极性和安装方向；正常工作条件、过载条件和失效保护方式。</p><p>数据手册中的额定值和最大值是工程设计的重要边界，不能仅依据元器件外观或标称名称进行替换。</p><h2 id="安全注意事项"><a href="#安全注意事项" class="headerlink" title="安全注意事项"></a>安全注意事项</h2><ul><li>强电电路和家庭电路存在触电、短路和火灾风险，不能按照低压实验电路处理；</li><li>测量前确认万用表档位、表笔插孔、量程和被测信号范围；</li><li>不要在通电状态下随意更换量程、移动元器件或改变接线；</li><li>对电容器、稳压电源和电池，应确认极性、耐压和放电状态。</li></ul><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/analog-circuits-and-components">analog-circuits-and-components</a></li></ul>]]></content>
    
    
    <summary type="html">模拟电路基础、常用电子元器件、半导体器件复习笔记，附硬件参数常用英文速查表与元器件选型关注点。</summary>
    
    
    
    <category term="硬件设计" scheme="https://xiaogao-code.space/categories/%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/"/>
    
    
    <category term="模拟电路" scheme="https://xiaogao-code.space/tags/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/"/>
    
    <category term="元器件" scheme="https://xiaogao-code.space/tags/%E5%85%83%E5%99%A8%E4%BB%B6/"/>
    
    <category term="二极管" scheme="https://xiaogao-code.space/tags/%E4%BA%8C%E6%9E%81%E7%AE%A1/"/>
    
    <category term="MOS管" scheme="https://xiaogao-code.space/tags/MOS%E7%AE%A1/"/>
    
    <category term="硬件基础" scheme="https://xiaogao-code.space/tags/%E7%A1%AC%E4%BB%B6%E5%9F%BA%E7%A1%80/"/>
    
    <category term="三极管" scheme="https://xiaogao-code.space/tags/%E4%B8%89%E6%9E%81%E7%AE%A1/"/>
    
    <category term="运算放大器" scheme="https://xiaogao-code.space/tags/%E8%BF%90%E7%AE%97%E6%94%BE%E5%A4%A7%E5%99%A8/"/>
    
    <category term="电子元件选型" scheme="https://xiaogao-code.space/tags/%E7%94%B5%E5%AD%90%E5%85%83%E4%BB%B6%E9%80%89%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>数据结构与算法笔记：从线性结构到查找与排序</title>
    <link href="https://xiaogao-code.space/2026/04/28/data-structures-and-algorithms/"/>
    <id>https://xiaogao-code.space/2026/04/28/data-structures-and-algorithms/</id>
    <published>2026-04-28T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>算法是程序的骨架，数据结构是算法的舞台。这份笔记整理数据结构与算法课程的核心内容，覆盖数据结构基础、线性结构、算法复杂度、查找算法和排序算法，并附带一份复杂度速查表。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">数据结构基础</span><br><span class="line">    ├── 逻辑结构与存储结构</span><br><span class="line">    ├── 数据运算与内存</span><br><span class="line">    └── 数据结构与算法的关系</span><br><span class="line">            ↓</span><br><span class="line">线性结构</span><br><span class="line">    ├── 数组</span><br><span class="line">    ├── 链表</span><br><span class="line">    ├── 栈</span><br><span class="line">    └── 队列</span><br><span class="line">            ↓</span><br><span class="line">算法基础</span><br><span class="line">    ├── 时间复杂度</span><br><span class="line">    └── 空间复杂度</span><br><span class="line">            ↓</span><br><span class="line">算法应用</span><br><span class="line">    ├── 查找：顺序查找、二分查找</span><br><span class="line">    └── 排序：冒泡排序、快速排序及其他常见排序</span><br></pre></td></tr></table></figure><h2 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h2><h3 id="第一章：数据结构"><a href="#第一章：数据结构" class="headerlink" title="第一章：数据结构"></a>第一章：数据结构</h3><ul><li><strong>数据结构基础</strong>：逻辑结构、存储结构、数据运算、内存，以及数据结构与算法的关系；</li><li><strong>数组</strong>：连续存储、随机访问、动态扩容、按位置插入、尾部插入、按位置删除、尾部删除和遍历；</li><li><strong>链表</strong>：节点、数据域、指针域、单链表组织方式，以及创建、遍历、插入、删除和释放；</li><li><strong>栈</strong>：后进先出（LIFO）、栈顶、入栈、出栈、查看栈顶，以及数组栈和链式栈；</li><li><strong>队列</strong>：先进先出（FIFO）、队头、队尾、入队、出队，以及顺序队列、循环队列和链式队列。</li></ul><h3 id="第二章：算法"><a href="#第二章：算法" class="headerlink" title="第二章：算法"></a>第二章：算法</h3><ul><li><strong>算法基础</strong>：算法定义、输入、输出、有限性、时间复杂度和空间复杂度；</li><li><strong>查找算法</strong>：顺序查找、二分查找，以及不同查找算法的前提条件和复杂度；</li><li><strong>排序算法</strong>：常见排序思想、冒泡排序、快速排序、复杂度、稳定性和适用场景。</li></ul><h2 id="复杂度速查"><a href="#复杂度速查" class="headerlink" title="复杂度速查"></a>复杂度速查</h2><table><thead><tr><th>结构或算法</th><th>典型操作</th><th>时间复杂度</th><th>说明</th></tr></thead><tbody><tr><td>数组</td><td>按下标访问</td><td><code>O(1)</code></td><td>连续存储支持随机访问</td></tr><tr><td>数组</td><td>中间插入或删除</td><td><code>O(n)</code></td><td>通常需要移动后续元素</td></tr><tr><td>链表</td><td>按位置查找</td><td><code>O(n)</code></td><td>需要从头节点逐步遍历</td></tr><tr><td>链表</td><td>已定位节点后的插入或删除</td><td><code>O(1)</code></td><td>不包含定位节点本身的成本</td></tr><tr><td>栈</td><td>入栈、出栈、查看栈顶</td><td><code>O(1)</code></td><td>操作集中在栈顶</td></tr><tr><td>队列</td><td>入队、出队</td><td><code>O(1)</code></td><td>取决于具体实现方式</td></tr><tr><td>顺序查找</td><td>查找元素</td><td><code>O(n)</code></td><td>可处理无序数据</td></tr><tr><td>二分查找</td><td>查找元素</td><td><code>O(log n)</code></td><td>前提是数据有序且支持按位置访问</td></tr><tr><td>冒泡排序</td><td>排序</td><td><code>O(n²)</code></td><td>适合用于理解排序过程</td></tr><tr><td>快速排序</td><td>排序</td><td>平均 <code>O(n log n)</code></td><td>最坏情况通常为 <code>O(n²)</code></td></tr></tbody></table><h2 id="建议的学习方式"><a href="#建议的学习方式" class="headerlink" title="建议的学习方式"></a>建议的学习方式</h2><ol><li>先阅读数据结构基础，建立逻辑结构、存储结构和内存模型的整体认识；</li><li>分别画出数组、链表、栈和队列的存储示意图，再阅读对应操作；</li><li>对每个操作记录前置条件、数据变化、边界情况和复杂度；</li><li>学习查找和排序时，手工跟踪一组小规模数据的执行过程；</li><li>阅读课件后再补充独立代码实现，并为关键操作编写测试用例。</li></ol><h2 id="后续扩展方向"><a href="#后续扩展方向" class="headerlink" title="后续扩展方向"></a>后续扩展方向</h2><p>当前仓库以课程资料和学习索引为主，后续可以按课件章节补充数组、链表、栈、队列、查找和排序算法的代码实现、边界测试及复杂度实验记录。</p><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/data-structures-and-algorithms">data-structures-and-algorithms</a></li></ul>]]></content>
    
    
    <summary type="html">数据结构与算法课程笔记，覆盖数据结构基础、数组/链表/栈/队列、时间复杂度与空间复杂度、查找算法和排序算法。</summary>
    
    
    
    <category term="数据结构与算法" scheme="https://xiaogao-code.space/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="数据结构" scheme="https://xiaogao-code.space/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    <category term="算法" scheme="https://xiaogao-code.space/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="复杂度" scheme="https://xiaogao-code.space/tags/%E5%A4%8D%E6%9D%82%E5%BA%A6/"/>
    
    <category term="排序" scheme="https://xiaogao-code.space/tags/%E6%8E%92%E5%BA%8F/"/>
    
    <category term="查找" scheme="https://xiaogao-code.space/tags/%E6%9F%A5%E6%89%BE/"/>
    
    <category term="线性表" scheme="https://xiaogao-code.space/tags/%E7%BA%BF%E6%80%A7%E8%A1%A8/"/>
    
    <category term="链表" scheme="https://xiaogao-code.space/tags/%E9%93%BE%E8%A1%A8/"/>
    
    <category term="栈与队列" scheme="https://xiaogao-code.space/tags/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97/"/>
    
    <category term="时间空间复杂度" scheme="https://xiaogao-code.space/tags/%E6%97%B6%E9%97%B4%E7%A9%BA%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6/"/>
    
  </entry>
  
  <entry>
    <title>Java 工程实践手册：三阶段学习路线与案例体系</title>
    <link href="https://xiaogao-code.space/2026/04/15/java-engineering-handbook/"/>
    <id>https://xiaogao-code.space/2026/04/15/java-engineering-handbook/</id>
    <published>2026-04-15T02:00:00.000Z</published>
    <updated>2026-10-15T13:21:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>这份手册整理 Java 学习与工程实践的课程资料、源码案例和学习笔记，内容按三个阶段循序推进：阶段一为 Java 核心与 AI 开发基础；阶段二为 Java 核心与 AI 开发进阶；阶段三为 AI 赋能 Web 开发。源码案例按”一个知识点对应一个小案例”的风格编写，并配有中文注释，方便对照课件学习。</p><span id="more"></span><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">阶段一：Java 核心与 AI 开发基础</span><br><span class="line">    -&gt; 开发环境搭建与 IDEA 开发工具</span><br><span class="line">    -&gt; 基础语法、运算符、方法与流程控制</span><br><span class="line">    -&gt; 数组、面向对象基础与面向对象高级</span><br><span class="line">    -&gt; 常用 API、集合基础</span><br><span class="line">            |</span><br><span class="line">            v</span><br><span class="line">阶段二：Java 核心与 AI 开发进阶</span><br><span class="line">    -&gt; 集合高级（List / Set / Map 体系）</span><br><span class="line">    -&gt; Stream 流、异常、File 类与递归</span><br><span class="line">    -&gt; 常用 API、IO 流</span><br><span class="line">    -&gt; 多线程、网络编程、Java 高级技术</span><br><span class="line">            |</span><br><span class="line">            v</span><br><span class="line">阶段三：AI 赋能 Web 开发</span><br><span class="line">    -&gt; Web 基础知识、HTML + CSS、JavaScript、Vue3</span><br><span class="line">    -&gt; Maven、数据库、SpringBoot（JDBC / MyBatis）</span><br><span class="line">    -&gt; 后端 Web 实战（Tlias 智能学习辅助系统）</span><br><span class="line">    -&gt; 前端 Web 实战、项目部署（Linux）与 Docker</span><br></pre></td></tr></table></figure><h2 id="资料与环境"><a href="#资料与环境" class="headerlink" title="资料与环境"></a>资料与环境</h2><ul><li>课件目录：3 个阶段，48 份 PPTX 与 1 份 PDF，共 49 份；</li><li>编程语言：Java（JDK 21）；</li><li>开发工具：IntelliJ IDEA；</li><li>工程组织：按阶段划分为独立 IDEA 工程，每个章节对应一个独立模块；</li><li>源码包名：<code>com.myproject.*</code>。</li></ul><h2 id="阶段一：Java-核心与-AI-开发基础"><a href="#阶段一：Java-核心与-AI-开发基础" class="headerlink" title="阶段一：Java 核心与 AI 开发基础"></a>阶段一：Java 核心与 AI 开发基础</h2><p>从开发环境到面向对象高级，共 15 份课件，配套 Chapter_01 ~ Chapter_06 源码案例：</p><ul><li><strong>Chapter_01 环境搭建</strong>：Java 背景、JDK 安装、HelloWorld 与程序执行原理、IDEA 使用；</li><li><strong>Chapter_02 基础语法</strong>：注释、字面量、变量与八种基本数据类型、运算符、方法与类型转换；</li><li><strong>Chapter_03 流程控制</strong>：if &#x2F; switch 分支、for &#x2F; while &#x2F; do-while 循环、break &#x2F; continue、Random 猜数字游戏；</li><li><strong>Chapter_04 数组</strong>：静态与动态初始化、元素访问、遍历应用（求和、最大值、反转）、二维数组；</li><li><strong>Chapter_05 面向对象基础</strong>：类与对象、封装与权限修饰符、构造方法、this、static、标准 JavaBean；</li><li><strong>Chapter_06 面向对象高级</strong>：继承与方法重写、抽象类、final、Object 类与 toString 重写。</li></ul><h2 id="阶段二：Java-核心与-AI-开发进阶"><a href="#阶段二：Java-核心与-AI-开发进阶" class="headerlink" title="阶段二：Java 核心与 AI 开发进阶"></a>阶段二：Java 核心与 AI 开发进阶</h2><ul><li><strong>集合高级</strong>：ArrayList &#x2F; LinkedList 与 HashSet &#x2F; LinkedHashSet &#x2F; TreeSet 体系；</li><li><strong>Stream 流</strong>：Lambda 表达式与流式操作；</li><li><strong>异常</strong>：异常体系、处理方式与自定义异常；</li><li><strong>File 类</strong>：常用 API 与递归；</li><li><strong>常用 API</strong>：Math、System、包装类、BigDecimal 与 Arrays；</li><li><strong>IO 流</strong>：字节流与字符流；</li><li><strong>多线程</strong>：线程安全与同步、线程池；</li><li><strong>网络编程</strong>：网络三要素、UDP 与 TCP 通信；</li><li><strong>Java 高级技术</strong>：枚举、类加载器、反射、注解与动态代理。</li></ul><h2 id="阶段三：AI-赋能-Web-开发"><a href="#阶段三：AI-赋能-Web-开发" class="headerlink" title="阶段三：AI 赋能 Web 开发"></a>阶段三：AI 赋能 Web 开发</h2><p>从 Web 基础到完整项目部署：</p><ul><li><strong>Web 基础</strong>：HTML + CSS、JavaScript、Vue3、Web 服务器与静态资源；</li><li><strong>后端基础</strong>：Maven 依赖管理、数据库、JDBC &#x2F; MyBatis &#x2F; MyBatisPlus；</li><li><strong>SpringBoot</strong>：登录认证、AOP、Maven 高级、SpringBoot 原理与分层架构总结；</li><li><strong>后端实战</strong>：Tlias 智能学习辅助系统（部门管理与员工管理：条件分页查询、新增、修改、删除、事务与文件上传）；</li><li><strong>前端实战</strong>：Vue 工程化 + ElementPlus 的 Tlias 案例；</li><li><strong>部署</strong>：Linux 项目部署与 Docker 容器化。</li></ul><h2 id="如何运行"><a href="#如何运行" class="headerlink" title="如何运行"></a>如何运行</h2><ul><li>使用 IntelliJ IDEA 打开对应阶段的工程目录（例如 <code>src/Phase_001</code>）；</li><li>工程默认使用 JDK 21，若本机 JDK 版本不同，可在 <code>File → Project Structure</code> 中调整 Project SDK；</li><li>每个案例类都包含 <code>main</code> 方法，可右键直接运行；</li><li>所有案例仅依赖 JDK 标准库，无需额外安装依赖。</li></ul><h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><ul><li><a href="https://github.com/Ashleycurry/java-engineering-handbook">java-engineering-handbook</a></li></ul>]]></content>
    
    
    <summary type="html">Java 学习与工程实践的课程资料与源码案例，按三个阶段推进：Java 核心与 AI 开发基础、Java 核心与 AI 开发进阶、AI 赋能 Web 开发。</summary>
    
    
    
    <category term="编程语言" scheme="https://xiaogao-code.space/categories/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/"/>
    
    
    <category term="面向对象" scheme="https://xiaogao-code.space/tags/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/"/>
    
    <category term="Java" scheme="https://xiaogao-code.space/tags/Java/"/>
    
    <category term="SpringBoot" scheme="https://xiaogao-code.space/tags/SpringBoot/"/>
    
    <category term="集合" scheme="https://xiaogao-code.space/tags/%E9%9B%86%E5%90%88/"/>
    
    <category term="Web开发" scheme="https://xiaogao-code.space/tags/Web%E5%BC%80%E5%8F%91/"/>
    
    <category term="并发编程" scheme="https://xiaogao-code.space/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/"/>
    
    <category term="AI 开发" scheme="https://xiaogao-code.space/tags/AI-%E5%BC%80%E5%8F%91/"/>
    
    <category term="工程实践" scheme="https://xiaogao-code.space/tags/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/"/>
    
  </entry>
  
</feed>
