<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LingHui 的技术笔记</title><link>https://plhwiki.cn/</link><description>Recent content on LingHui 的技术笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 04 Aug 2026 14:48:28 +0000</lastBuildDate><atom:link href="https://plhwiki.cn/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://plhwiki.cn/basic/%E5%9F%BA%E6%9C%AC%E5%8A%9F/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/basic/%E5%9F%BA%E6%9C%AC%E5%8A%9F/</guid><description>&lt;h1 id="linux三板斧"&gt;Linux三板斧&lt;/h1&gt;
&lt;h2 id="u-boot"&gt;U-Boot&lt;/h2&gt;
&lt;h3 id="编译uboot"&gt;编译uboot&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://plhwiki.cn/basic/assets/image-20260105185419377.png" alt="image-20260105185419377" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;**&lt;code&gt;u-boot.bin&lt;/code&gt;**只包含 U-Boot proper（第二阶段引导程序)&lt;/p&gt;
&lt;p&gt;**&lt;code&gt;u-boot-with-spl.bin&lt;/code&gt; **= SPL（第一阶段） + U-Boot proper（第二阶段） + 可能的对齐/头部/校验/填充。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/basic/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/basic/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB/</guid><description>&lt;h1 id="目标文件"&gt;目标文件&lt;/h1&gt;
&lt;h2 id="目标文件的格式"&gt;目标文件的格式&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ELF文件类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;实例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;可重定向文件(Relocatable File)&lt;/td&gt;
&lt;td&gt;这类文件包含代码与数据，可以被链接为可执行文件或者共享目标文件，静态链接库也可以归这一类&lt;/td&gt;
&lt;td&gt;Linux的.o文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可执行文件&lt;/td&gt;
&lt;td&gt;已完成链接；内核可直接加载执行&lt;/td&gt;
&lt;td&gt;/bin/bash文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共享目标文件(Shared Object File)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;不能单独执行&lt;/strong&gt;；可链接或运行时动态加载&lt;/td&gt;
&lt;td&gt;Linux的.so&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心转储文件（Core Dump File）&lt;/td&gt;
&lt;td&gt;进程内存快照；含栈/寄存器/状态信息&lt;/td&gt;
&lt;td&gt;&lt;code&gt;core&lt;/code&gt; 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="目标文件的内容"&gt;目标文件的内容&lt;/h2&gt;
&lt;p&gt;![ChatGPT Image 2026年7月2日 11_28_06](assets/ChatGPT Image 2026年7月2日 11_28_06.png)&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/basic/%E7%BC%96%E8%AF%91%E5%99%A8/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/basic/%E7%BC%96%E8%AF%91%E5%99%A8/</guid><description>&lt;p&gt;现代编译器通常采用“三段式”架构，分为：&lt;strong&gt;前端（Frontend）、中端（Optimizer，优化器）和后端（Backend，代码生成器）&lt;/strong&gt;。前端的任务是把程序员编写的、具备特定语法的高级语言源代码（如 C++、Java、Python），翻译成一种与具体硬件平台无关的&lt;strong&gt;中间表示（IR，Intermediate Representation）&lt;/strong&gt;，同时检查代码中的语法和语义错误。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/hardware/%E6%A8%A1%E7%94%B5/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/hardware/%E6%A8%A1%E7%94%B5/</guid><description/></item><item><title/><link>https://plhwiki.cn/linux/common/linux%E5%86%85%E6%A0%B8/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/linux/common/linux%E5%86%85%E6%A0%B8/</guid><description>&lt;h1 id="模块机制"&gt;模块机制&lt;/h1&gt;
&lt;h2 id="可加载模块的概念"&gt;可加载模块的概念&lt;/h2&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;微内核：只保留核心模块，易维护、低性能&lt;/p&gt;
&lt;h2 id="内核许可声明"&gt;内核许可声明&lt;/h2&gt;
&lt;h3 id="协议分类"&gt;协议分类&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://plhwiki.cn/linux/common/assets/image-20250628134458427.png" alt="image-20250628134458427" loading="lazy"&gt;
&lt;/p&gt;
&lt;h1 id="page--cache"&gt;Page Cache&lt;/h1&gt;
&lt;p&gt;​ Page Cache 就是内核为了加速文件读写而在内存中保留的文件页。你每次 read/write 文件时，其实不是直接访问硬盘，而是在和 Page Cache 互动。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/</guid><description>&lt;h1 id="linux-干货速查"&gt;Linux 干货速查&lt;/h1&gt;
&lt;p&gt;面向 &lt;strong&gt;Ubuntu 开发主机 + BusyBox 嵌入式开发板&lt;/strong&gt;的个人速查。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;约定&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ 标记危险命令（误用会丢数据 / 断网 / 毁分区），执行前务必确认设备名和路径。&lt;/li&gt;
&lt;li&gt;命令行为在不同实现下可能不同，差异处标注：（GNU）Ubuntu 自带 / （BusyBox）板子 / （systemd）。&lt;/li&gt;
&lt;li&gt;拿不准的地方标注「待确认」，不猜。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="目录"&gt;目录&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#shell-%e4%b8%8e%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f"&gt;Shell 与环境变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e6%96%87%e4%bb%b6%e4%b8%8e%e7%9b%ae%e5%bd%95%e6%93%8d%e4%bd%9c"&gt;文件与目录操作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e6%96%87%e6%9c%ac%e6%90%9c%e7%b4%a2%e4%b8%8e%e5%a4%84%e7%90%86"&gt;文本搜索与处理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e7%a3%81%e7%9b%98%e5%88%86%e5%8c%ba%e4%b8%8e%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f"&gt;磁盘、分区与文件系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e5%86%85%e5%ad%98cpu-%e4%b8%8e-io-%e6%8e%92%e6%9f%a5"&gt;内存、CPU 与 I/O 排查&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e7%bd%91%e7%bb%9c%e9%85%8d%e7%bd%ae%e4%b8%8e%e6%8a%93%e5%8c%85"&gt;网络配置与抓包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e6%96%87%e4%bb%b6%e4%bc%a0%e8%be%93%e4%b8%8e%e5%85%b1%e4%ba%ab"&gt;文件传输与共享&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#systemd-%e4%b8%8e%e7%b3%bb%e7%bb%9f%e6%9c%8d%e5%8a%a1"&gt;systemd 与系统服务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e8%ae%be%e5%a4%87%e7%ae%a1%e7%90%86udev-%e4%b8%8e-uevent"&gt;设备管理：udev 与 uevent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91%e5%b7%a5%e5%85%b7%e9%93%be"&gt;交叉编译工具链&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plhwiki.cn/linux/common/linux%E5%B9%B2%E8%B4%A7/#%e5%b8%b8%e8%a7%81%e6%95%85%e9%9a%9c%e4%b8%8e%e6%8e%92%e6%9f%a5%e6%a1%88%e4%be%8b"&gt;常见故障与排查案例&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="shell-与环境变量"&gt;Shell 与环境变量&lt;/h2&gt;
&lt;h3 id="重定向"&gt;重定向&lt;/h3&gt;
&lt;p&gt;从文件读入 stdin：&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/common/linux%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/linux/common/linux%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B/</guid><description>&lt;h1 id="文件系统"&gt;文件系统&lt;/h1&gt;
&lt;p&gt;文件索引节点：inode&lt;/p&gt;
&lt;p&gt;两部分
纯数据区&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件真正的数据存储区、基本存储单位为block&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;元数据区&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件属性：磁盘中的存储位置、文件长度等信息&lt;/li&gt;
&lt;li&gt;时间戳：创建时间、修改时间&lt;/li&gt;
&lt;li&gt;读写权限：使用read/write系统调用时，要首先要进行权限检&lt;/li&gt;
&lt;li&gt;所属组、所有者&lt;/li&gt;
&lt;li&gt;链接数&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="挂载"&gt;挂载&lt;/h2&gt;
&lt;p&gt;​ &lt;strong&gt;挂载&lt;/strong&gt;是一个非常重要的功能，使用非常频繁。它指将一个设备(通常是存储设备，可以挂载光盘、硬盘、磁带、光盘镜像文件等)&lt;strong&gt;挂接到一个已存在的目录上，那么，你访问这个目录就是访问这个设备&lt;/strong&gt;（这个目录可以不为空，但挂载后这个目录下以前的内容将不可用）
，&lt;font color = red&gt;一个目录一旦成为&amp;quot;挂载点&amp;quot;，该目录下看到的内容，来自&amp;quot;被挂载的文件系统&amp;quot;， 与父目录的存储介质完全无关。&lt;/font&gt;&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/net/linux%E7%BD%91%E7%BB%9C/</link><pubDate>Tue, 04 Aug 2026 14:48:28 +0000</pubDate><guid>https://plhwiki.cn/linux/net/linux%E7%BD%91%E7%BB%9C/</guid><description>&lt;h1 id="tcp建立连接的过程"&gt;TCP建立连接的过程&lt;/h1&gt;
&lt;h2 id="listen"&gt;listen&lt;/h2&gt;
&lt;p&gt;listen的工作主要是申请和初始化接收队列，包括全连接队列和半连接队列。全/半连接队列是三次握手中重要的数据结构，有它服务端才能响应客户端的三次握手&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/cpp/language/c++11/</link><pubDate>Mon, 03 Aug 2026 19:33:50 +0800</pubDate><guid>https://plhwiki.cn/cpp/language/c++11/</guid><description>&lt;h1 id="基本"&gt;基本&lt;/h1&gt;
&lt;p&gt;函数定义&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;返回值类型&lt;/span&gt; &lt;span class="err"&gt;函数名&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;参数列表&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//函数头
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;函数体&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;函数声明&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;返回值类型&lt;/span&gt; &lt;span class="err"&gt;函数名（参数列表）&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="odr规则"&gt;ODR规则&lt;/h2&gt;
&lt;p&gt;ODR = &lt;strong&gt;One Definition Rule（单一定义规则）&lt;/strong&gt;,C++ 程序有一个核心规则：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个变量、函数、类型，在整个程序中必须满足定义规则&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;禁止：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// a.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;g_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// b.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;g_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在链接的时候会出现&lt;code&gt;multiple definition of g_value&lt;/code&gt;，违反了ODR&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/common/git/</link><pubDate>Mon, 03 Aug 2026 19:33:50 +0800</pubDate><guid>https://plhwiki.cn/linux/common/git/</guid><description>&lt;h1 id="学习资料"&gt;学习资料&lt;/h1&gt;
&lt;p&gt;win11搭建网络映射器：https://m.comcw.cn/jc/4614.html&lt;/p&gt;
&lt;p&gt;音视频学习：https://github.com/0voice/audio_video_streaming&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/multimedia/v4l2/</link><pubDate>Sun, 26 Jul 2026 15:13:45 +0800</pubDate><guid>https://plhwiki.cn/multimedia/v4l2/</guid><description>&lt;h1 id="v4l2-框架核心概念"&gt;V4L2 框架核心概念&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Video for Linux 2 (V4L2)&lt;/strong&gt; 是 Linux 内核中处理视频设备的标准框架，用于统一管理摄像头、视频采集卡等设备。设计 V4L2 框架的核心目的（思想）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户空间和内核空间分离&lt;/strong&gt;：应用通过标准系统调用与内核交互&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备抽象&lt;/strong&gt;：所有视频设备通过 &lt;code&gt;/dev/videoX&lt;/code&gt; 节点暴露&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓冲区队列管理&lt;/strong&gt;：通过 &lt;code&gt;vb2_queue&lt;/code&gt; 实现高效的零拷贝数据传输&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_device&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;media_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mdev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;list_head&lt;/span&gt; &lt;span class="n"&gt;subdevs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;spinlock_t&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_subdev&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_ctrl_handler&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctrl_handler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_prio_state&lt;/span&gt; &lt;span class="n"&gt;prio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;kref&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;v4l2_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v4l2_dev&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;获取当前的格式&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/hardware/i2c/</link><pubDate>Sat, 18 Jul 2026 18:01:54 +0800</pubDate><guid>https://plhwiki.cn/hardware/i2c/</guid><description>&lt;h1 id="i2c"&gt;I2C&lt;/h1&gt;
&lt;p&gt;​ I2C（Inter-Integrated Circuit）协议是由Philips公司于1980年代提出的一种 &lt;strong&gt;同步、半双工、多主从结构&lt;/strong&gt; 的串行通信协议，广泛应用于嵌入式系统中的芯片间通信。其核心特点在于仅使用 两条信号线 ： &lt;strong&gt;SDA（数据线） 与 SCL（时钟线）&lt;/strong&gt; ，即可实现多个设备之间的可靠数据传输。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/common/kernel/</link><pubDate>Sat, 18 Jul 2026 18:01:54 +0800</pubDate><guid>https://plhwiki.cn/linux/common/kernel/</guid><description>&lt;h1 id="tty终端"&gt;TTY终端&lt;/h1&gt;
&lt;h2 id="终端"&gt;终端&lt;/h2&gt;
&lt;p&gt;终端是一个电子（或电气）设备，用于向系统输入数据（input），或者将系统接收到的数据显示出来（output），即我们常说的“人机交互设备”。
TTY(Teletypewriter)代表终端设备的概念，它允许用户与系统进行交互，在Linux中，TTY可分为如下几类:&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/common/makefile/</link><pubDate>Sat, 18 Jul 2026 18:01:54 +0800</pubDate><guid>https://plhwiki.cn/linux/common/makefile/</guid><description>&lt;h1 id="make-与-cmake-构建笔记"&gt;Make 与 CMake 构建笔记&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;面向 Linux / C/C++ / 交叉编译（ARM、MIPS uClibc 工具链）的构建笔记。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="make-基础概念"&gt;Make 基础概念&lt;/h2&gt;
&lt;p&gt;Make 通过比较**目标（target）与其依赖（prerequisite）的修改时间（mtime）**决定是否重建：只要任一依赖比目标新，就执行该目标的命令，并沿依赖图递归向上。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/ai/ai/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/ai/ai/</guid><description>&lt;h1 id="claude"&gt;claude&lt;/h1&gt;
&lt;h2 id="claudemd"&gt;CLAUDE.md&lt;/h2&gt;
&lt;p&gt;CLAUDE.md 的多层级设计借鉴了 Git 的配置分层（system → global → local）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scss" data-lang="scss"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Managed&lt;/span&gt; &lt;span class="o"&gt;(/&lt;/span&gt;&lt;span class="nt"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;claude-code&lt;/span&gt;&lt;span class="o"&gt;/)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;企业管理员&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;User&lt;/span&gt; &lt;span class="o"&gt;(~/&lt;/span&gt;&lt;span class="nc"&gt;.claude&lt;/span&gt;&lt;span class="o"&gt;/)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;个人全局&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Project&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;CLAUDE&lt;/span&gt;&lt;span class="nc"&gt;.md&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;团队共享&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Local&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;CLAUDE&lt;/span&gt;&lt;span class="nc"&gt;.local.md&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="nt"&gt;个人私有&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mcp"&gt;MCP&lt;/h2&gt;
&lt;p&gt;让 AI 工具能连接外部数据源和服务。把它想象成 Claude Code 的 USB 接口：插上不同的 MCP 服务器，Claude 就获得了对应的能力。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/basic/industry_term/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/basic/industry_term/</guid><description>&lt;h1 id="技术术语"&gt;技术术语&lt;/h1&gt;
&lt;h2 id="最小可行性产品-minimum-viable-product"&gt;最小可行性产品 (Minimum Viable Product)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：指用&lt;strong&gt;最快的时间、最低的成本&lt;/strong&gt;开发出一个只包含&lt;strong&gt;核心功能&lt;/strong&gt;的产品原型，直接推向市场让真实用户使用，以此来验证这个产品的核心逻辑是否能跑通、用户是否愿意买单。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="软件即服务-software-as-a-service"&gt;软件即服务 (Software as a Service)&lt;/h2&gt;
&lt;p&gt;在 SaaS/互联网行业中：&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/hardware/4g/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/hardware/4g/</guid><description>&lt;h1 id="短信相关"&gt;短信相关&lt;/h1&gt;
&lt;p&gt;​ 发送短信的流程就是配置短信模式-&amp;gt;配置字符集-&amp;gt;下发发送命令-&amp;gt;等待，提示符-&amp;gt;发送正文/PDU -&amp;gt;发送ctrl+z &amp;ndash;&amp;gt;等待结果&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/drive/4g/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/linux/drive/4g/</guid><description>&lt;h1 id="驱动移植"&gt;驱动移植&lt;/h1&gt;
&lt;p&gt;​ 4G模块加载 &lt;strong&gt;USB 转串口驱动option&lt;/strong&gt;后会在/dev/下创建ttyUSB0、ttyUSB1 和 ttyUSB2 等设备文件。如果没有出现，需要在drivers/usb/serial/option.c里添加VID（Vendor ID）与PID（Product ID）&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/linux/drive/dts/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/linux/drive/dts/</guid><description>&lt;h1 id="平台设备驱动程序"&gt;平台设备驱动程序&lt;/h1&gt;
&lt;h2 id="片上设备"&gt;片上设备&lt;/h2&gt;
&lt;p&gt;物理存在于 SoC 内部的硬件模块，其特点是焊死在芯片内部，不可插拔，不可枚举(无discovery机制)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UART 控制器&lt;/li&gt;
&lt;li&gt;I2C 控制器&lt;/li&gt;
&lt;li&gt;SPI 控制器&lt;/li&gt;
&lt;li&gt;GPIO&lt;/li&gt;
&lt;li&gt;Timer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="平台设备"&gt;平台设备&lt;/h2&gt;
&lt;h1 id="设备树"&gt;设备树&lt;/h1&gt;
&lt;h2 id="设备树解决什么问题"&gt;设备树解决什么问题&lt;/h2&gt;
&lt;p&gt;Device Tree 用来描述板级硬件资源，尤其适合描述 SoC 内部这类无法自动枚举的设备，例如
UART、I2C、SPI、GPIO、Timer 等。Bootloader 启动内核前把 &lt;code&gt;.dtb&lt;/code&gt; 放到内存中，内核启动后解析
&lt;code&gt;.dtb&lt;/code&gt;，再根据节点中的 &lt;code&gt;compatible&lt;/code&gt;、&lt;code&gt;reg&lt;/code&gt;、&lt;code&gt;interrupts&lt;/code&gt;、&lt;code&gt;pinctrl&lt;/code&gt; 等信息完成设备创建和驱动匹配。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/multimedia/protocol/gb28181/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/multimedia/protocol/gb28181/</guid><description>&lt;h1 id="gb28181协议"&gt;GB28181协议&lt;/h1&gt;
&lt;p&gt;GB28181协议会话通道实际上使用的是SIP协议，并且在SIP协议的基础之上做了些私有化处理。SIP是一个由IETF MMUSIC工作组开发的协议，作为标准被提议用于创建，修改和终止包括视频，语音，即时通信，在线游戏和虚拟现实等多种多媒体元素在内的交互式用户会话。SIP中一个比较重要的概念是&lt;strong&gt;用户代理（User Agent）&lt;/strong&gt;，指的是一个SIP逻辑网络端点，用于创建、发送、接收SIP消息并管理一个SIP会话。SIP用户代理又可分为用户代理客户端UAC（User Agent Client）和用户代理服务端UAS（User Agent Server）。UAC创建并发送SIP请求，UAS接收处理SIP请求，发送SIP响应。SIP协议会与许多其它的协议协同工作，如SIP报文内容发送会话描述协议（Session Description Protocol，SDP）4，SDP协议描述了会话所使用流媒体细节，如：使用哪个IP端口，采用哪种编解码器等等。SIP的一个典型用途是：SIP会话传输一些简单的经过报文的实时传输协议流，RTP本身才是语音或视频的载体。在GB28181协议中，联网系统在进行视音频传输及控制时应建立两个传输通道: 会话通道和媒体流通道。会话通道用于在设备之间建立会话并传输系统控制命令; 媒体流通道用于传输视音频数据， 经过压缩编码的视音频流采用流媒体协议RTP/RTCP传输。GB28181协议中具体通信协议结构图如下图所示：&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/multimedia/sip/</link><pubDate>Mon, 13 Jul 2026 20:01:13 +0800</pubDate><guid>https://plhwiki.cn/multimedia/sip/</guid><description>&lt;h1 id="sip协议介绍"&gt;SIP协议介绍&lt;/h1&gt;
&lt;p&gt;​ SIP 是一个应用层的控制协议，可以用来建立、修改、和终止多媒体会话（或者会议）例如 Internet 电话/视频会议系统&lt;/p&gt;</description></item><item><title>目录</title><link>https://plhwiki.cn/catalog/</link><pubDate>Wed, 08 Jul 2026 23:30:57 +0800</pubDate><guid>https://plhwiki.cn/catalog/</guid><description>按目录结构浏览全部笔记</description></item><item><title/><link>https://plhwiki.cn/basic/system_architecture/</link><pubDate>Fri, 26 Jun 2026 18:02:00 +0800</pubDate><guid>https://plhwiki.cn/basic/system_architecture/</guid><description>&lt;h1 id="软件资产"&gt;软件资产&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;易于理解：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最小表面积&lt;/li&gt;
&lt;li&gt;规范简洁的呈现&lt;/li&gt;
&lt;li&gt;清晰且完整的参考注释&lt;/li&gt;
&lt;li&gt;有关的用况&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;易于使用：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有效的使用模型&lt;/li&gt;
&lt;li&gt;直观的接口&lt;/li&gt;
&lt;li&gt;合适的安全等级&lt;/li&gt;
&lt;li&gt;最小的物理依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;高性能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;执行(真实和CPU)运行时间&lt;/li&gt;
&lt;li&gt;进程（即内核内存）大小&lt;/li&gt;
&lt;li&gt;编译时间（或编译时耦合的程度）&lt;/li&gt;
&lt;li&gt;链接时间（或链接时的依赖程度）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;可移植的：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/cpp/language/template/</link><pubDate>Fri, 26 Jun 2026 18:02:00 +0800</pubDate><guid>https://plhwiki.cn/cpp/language/template/</guid><description>&lt;h1 id="可变参数模板"&gt;可变参数模板&lt;/h1&gt;
&lt;p&gt;声明可变参数模板的时候&lt;strong&gt;需要在typename或class 后面带上省略号&lt;code&gt;...&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;声明一个参数包，这个参数包中可以包含0到任意个板参数。&lt;/li&gt;
&lt;li&gt;在模板定义的右边，可以将参数包展开成一个一个独立的参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;coout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ZLMediaKit的模板&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/multimedia/protocol/media_protocol/</link><pubDate>Thu, 18 Jun 2026 17:50:55 +0800</pubDate><guid>https://plhwiki.cn/multimedia/protocol/media_protocol/</guid><description>&lt;h1 id="流媒体协议"&gt;流媒体协议&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://plhwiki.cn/multimedia/protocol/assets/image-20260520092716153.png" alt="image-20260520092716153" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;RTSP 在上层&lt;strong&gt;发号施令&lt;/strong&gt;（管控制），RTP 在底层&lt;strong&gt;埋头搬砖&lt;/strong&gt;（运数据），RTCP 在旁边&lt;strong&gt;盯着质量&lt;/strong&gt;（做监督）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三者关系：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RTSP (应用层)：&lt;/strong&gt; &lt;strong&gt;流媒体的“遥控器”。&lt;/strong&gt; 它不传数据，只负责播放、暂停、快进和挂断等控制信令，并在正式传输前商量好底层数据通道的端口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTP (传输层/应用层)：&lt;/strong&gt; &lt;strong&gt;流媒体的“快递员”。&lt;/strong&gt; 它负责将庞大的音视频切片、打包、加上时间戳和序列号，然后通过 UDP 疯狂地发往目的地。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTCP (应用层)：&lt;/strong&gt; &lt;strong&gt;流媒体的“质检员”。&lt;/strong&gt; 它不传数据，只在 RTP 旁边拉一条线，定期汇报丢包率和网络延迟。上层流媒体服务器（如 ZLMediaKit）根据它的反馈来决定是否降低码率或进行丢包重传（NACK）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在实际传输中，RTP 和 RTCP 就像连体婴儿，它们的网络端口是&lt;strong&gt;成对绑定&lt;/strong&gt;的：&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/cpp/language/thread/</link><pubDate>Thu, 11 Jun 2026 17:02:46 +0800</pubDate><guid>https://plhwiki.cn/cpp/language/thread/</guid><description>&lt;h1 id="线程管理的基础"&gt;线程管理的基础&lt;/h1&gt;
&lt;h2 id="启动线程"&gt;启动线程&lt;/h2&gt;
&lt;p&gt;std::thread 可传函数、函数对象、lambda&lt;/p&gt;
&lt;h3 id="正确写法"&gt;正确写法&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;background_task&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;background_task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 传函数指针，不要加 ()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 或
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;background_task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 显式取地址，等价
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;函数名在表达式中会 衰变为函数指针，正好符合 std::thread 对 callable 的要求。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/database/sqlite3/</link><pubDate>Thu, 11 Jun 2026 17:02:46 +0800</pubDate><guid>https://plhwiki.cn/database/sqlite3/</guid><description>&lt;h1 id="命令行"&gt;命令行&lt;/h1&gt;
&lt;p&gt;命令行都是由&amp;rsquo;.&amp;lsquo;开始，&amp;rsquo;;&amp;lsquo;结束。&lt;/p&gt;
&lt;p&gt;SQLite 中「新建数据库」和「打开数据库」是同一个命令（文件不存在则创建，存在则打开）：&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/hardware/flash/</link><pubDate>Thu, 11 Jun 2026 17:02:46 +0800</pubDate><guid>https://plhwiki.cn/hardware/flash/</guid><description>&lt;h1 id="概述与定义"&gt;概述与定义&lt;/h1&gt;
&lt;h2 id="spi-flash"&gt;SPI Flash&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;接口协议&lt;/strong&gt;（芯片与主机的通信方式）&lt;/p&gt;
&lt;h2 id="nor-flash"&gt;NOR Flash&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NOR Flash&lt;/strong&gt;是一种非易失性存储器，采用&amp;quot;或非门&amp;quot;(NOR)架构。它的特点是支持随机访问，可以直接在芯片上执行代码(XIP)，常用于存储启动代码、固件等对可靠性要求较高的应用。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/hardware/mipi/</link><pubDate>Fri, 05 Jun 2026 23:53:06 +0800</pubDate><guid>https://plhwiki.cn/hardware/mipi/</guid><description/></item><item><title/><link>https://plhwiki.cn/linux/drive/char_driver/</link><pubDate>Wed, 27 May 2026 00:10:57 +0800</pubDate><guid>https://plhwiki.cn/linux/drive/char_driver/</guid><description/></item><item><title/><link>https://plhwiki.cn/basic/data_structure/</link><pubDate>Thu, 21 May 2026 18:03:46 +0800</pubDate><guid>https://plhwiki.cn/basic/data_structure/</guid><description/></item><item><title/><link>https://plhwiki.cn/cpp/language/design/</link><pubDate>Thu, 21 May 2026 18:03:46 +0800</pubDate><guid>https://plhwiki.cn/cpp/language/design/</guid><description>&lt;h1 id="单例模式"&gt;单例模式&lt;/h1&gt;
&lt;h2 id="service-locator"&gt;Service Locator&lt;/h2&gt;
&lt;p&gt;这实际上是属于一种&lt;strong&gt;全局获取依赖对象&lt;/strong&gt;的设计模式，可以理解为“我不通过构造函数传进来，而是到一个全局注册中心里去拿对象。”&lt;/p&gt;
&lt;h2 id="meyers-singleton"&gt;Meyer&amp;rsquo;s Singleton&lt;/h2&gt;
&lt;p&gt;经典代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StreamManager&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;StreamManager&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;StreamManager&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;StreamManager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//使用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CmsStreamManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;h4 id="隐式依赖"&gt;隐式依赖&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RecordController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//它内部还依赖：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CmsStreamManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="生命周期不可控"&gt;生命周期不可控&lt;/h4&gt;
&lt;p&gt;谁创建？ 谁销毁？ 什么时候初始化？全隐藏。&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/interview/nvr/</link><pubDate>Wed, 13 May 2026 18:03:29 +0800</pubDate><guid>https://plhwiki.cn/interview/nvr/</guid><description>&lt;h1 id="花屏情况"&gt;花屏情况&lt;/h1&gt;
&lt;h2 id="起因"&gt;起因&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;修改了uboot 的bootargs里的rmem导致花屏，&lt;code&gt;mem=254M@0x0 rmem=258M@0xFE00000&lt;/code&gt;就会绿屏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ddr大小不匹配，512MB与256MB芯片的编译选项选择错误。remap_array的值不对&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/interview/basic/</link><pubDate>Wed, 29 Apr 2026 20:00:46 +0800</pubDate><guid>https://plhwiki.cn/interview/basic/</guid><description>&lt;ol&gt;
&lt;li&gt;mcu是否可以跑linux系统？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;普通 MCU 通常不能直接运行完整 Linux。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Linux 一般需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MMU&lt;/strong&gt;：内存管理单元，用于虚拟地址、进程隔离。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;较大 RAM&lt;/strong&gt;：通常至少几十 MB，实际产品常见 64MB、128MB 以上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储空间&lt;/strong&gt;：内核、rootfs、动态库、应用都需要空间。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title/><link>https://plhwiki.cn/basic/com_protocl/</link><pubDate>Mon, 27 Apr 2026 20:00:42 +0800</pubDate><guid>https://plhwiki.cn/basic/com_protocl/</guid><description>&lt;h1 id="编码方式"&gt;编码方式&lt;/h1&gt;
&lt;h2 id="base64"&gt;Base64&lt;/h2&gt;
&lt;p&gt;​ 把任意二进制数据安全地表示成只含可打印 ASCII 字符的文本，便于在只支持文本的协议里传输，比如邮件 SMTP、HTTP、JSON 嵌入二进制、证书/密钥文本化等。它不是加密，也不是压缩；任何人都可以轻易还原&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/cpp/3rdpart/zlmediakit/</link><pubDate>Mon, 27 Apr 2026 20:00:42 +0800</pubDate><guid>https://plhwiki.cn/cpp/3rdpart/zlmediakit/</guid><description/></item><item><title/><link>https://plhwiki.cn/cpp/3rdpart/zltoolkit/</link><pubDate>Mon, 27 Apr 2026 20:00:42 +0800</pubDate><guid>https://plhwiki.cn/cpp/3rdpart/zltoolkit/</guid><description>&lt;h1 id="zltoolkit源码框架"&gt;ZLToolKit源码框架&lt;/h1&gt;
&lt;p&gt;主要分为Thread、Poller、Network、Util四大部分。&lt;/p&gt;
&lt;h1 id="thread文件夹"&gt;Thread文件夹&lt;/h1&gt;
&lt;h3 id="taskexecutorh"&gt;TaskExecutor.h&lt;/h3&gt;
&lt;p&gt;有&lt;strong&gt;cpu负载计算，Task函数指针模板，任务执行器管理，管理任务执行线程池&lt;/strong&gt;&lt;/p&gt;</description></item><item><title/><link>https://plhwiki.cn/cpp/3rdpart/openssl/</link><pubDate>Wed, 22 Apr 2026 18:03:59 +0800</pubDate><guid>https://plhwiki.cn/cpp/3rdpart/openssl/</guid><description/></item></channel></rss>