深入源码,构建可靠的
嵌入式系统
fishBlog 按八条专题整理源码、算法与协议:算法、工业协议、SLAM、AI、Zephyr RTOS、Linux 内核、ROS 2、Ceph。从视觉算法开始,再进入设备通信、机器人、本地大模型、板级内核与分布式存储。
system.algorithmOpenCV · YOLOv5system.protocolModbus · CANopen · EtherCAT · MQTTsystem.roboticsSLAM · ROS 2system.intelligenceAI · GGML · RAGsystem.runtimeZephyr · Linuxsystem.storageCeph · SPDK八个阅读专题
按算法、工业协议、SLAM、AI、Zephyr、Linux、ROS 2、Ceph 八条线进入,再选对应分类或章节。
视觉算法
从 OpenCV 4.13.0 的图像处理基础设施读到 YOLOv5 7.0 的训练、推理和模型导出,覆盖传统视觉与深度学习检测两条路径。
算法专题以真实源码为主线。OpenCV 部分梳理模块依赖、Mat 数据模型、典型算法流水线、HAL 与性能优化;YOLOv5 部分沿模型构建、数据加载、损失函数、训练验证、多后端推理和部署展开。
- OpenCV:Core、Imgproc、DNN、Calib3d 与 Features2d
- 性能:SIMD、CPU dispatch、HAL、OpenCL 与并行执行
- YOLOv5:模型 YAML、Detect 头、Anchor、损失与数据增强
- 工程:训练、验证、推理、模型导出与多后端部署
工业通信协议
从设备寄存器、CAN 对象字典和实时以太网,到面向物联网的发布订阅,系统整理 Modbus、CANopen、EtherCAT 与 MQTT。
协议专题先解释每种协议解决的问题和分层位置,再进入帧格式、状态机、寻址、实时同步与可靠投递。每条线同时覆盖开源实现、调试工具和 ROS 2 集成,便于从规范快速落到设备接入与现场排障。
- Modbus:数据模型、功能码、RTU / ASCII、TCP 与 MBAP
- CANopen:对象字典、NMT、SDO / PDO、CiA 402 与 LSS
- EtherCAT:帧寻址、邮箱协议、分布式时钟与主站实现
- MQTT:主题、会话、QoS、控制报文、安全与 Broker
SLAM
面向室内 AMR / AGV 的 2D 激光 SLAM。输入 LaserScan 和轮速里程计,输出占用栅格与 map→odom。内核是改过的 Open Karto,回环交给 Ceres。
笔记对照 slam_toolbox 2.10.0(ros2 分支)。先看三层:ROS Lifecycle 封装、async/sync/localization 等模式、Karto Mapper。再沿一帧 /scan 走进匹配、位姿图和栅格。后半段是 TF、序列化、YAML 排障,以及该改哪一层做二次开发。系统 apt 的 Humble 是 2.6.10,不要和这份源码的 launch 混用。
- 架构:LifecycleNode → 模式层 → Karto + Ceres
- 数据:一帧扫描如何变成 map→odom 和 /map
- 模式:在线 async、离线 sync、定位窗口、lifelong
- 落地:编译 overlay、接口参数、读码顺序
AI
七十篇源码笔记已归纳成十七章顺序教材:从 GGML 张量内核读到 llama.cpp 推理,再读 LLaMA-Factory 训练,最后用 LlamaIndex 接到本地 RAG。
阅读顺序固定为 00→16。先建立全栈边界,再读 GGML 0.15.3 的图、量化与 Backend;接着编译 llama.cpp、走 C API 与 llama-server;然后进入 LLaMA-Factory 0.9.6.dev0 的 v0/v1、SFT 与对齐;LlamaIndex 0.14.23 负责摄取、检索和 Agent。最后一章用命令把训练产物接到 GGUF、server 和索引查询。
- 00 总览:训练 → 转换 → 推理 → RAG 的职责边界
- 01–07:GGML 内核与 llama.cpp / llama-server
- 08–11:LLaMA-Factory 环境、训练、Board 与对齐
- 12–16:LlamaIndex RAG / Agent,以及全栈落地命令
Zephyr RTOS
面向 MCU 与受限设备的实时内核。关心的不是「会不会用 API」,而是一块板子从复位到驱动就绪,中间经过哪些层。
笔记从软件分层和目录地图入手,再读构建系统:Kconfig 决定编进什么,设备树决定实例化什么。接着沿启动路径看线程、调度器、超时与工作队列;内核对象一章把信号量、互斥、队列、堆和内存域放在同一套模式里。后半段进入设备模型、电源管理、日志/网络/存储等子系统,最后落到移植、调试和本工程的板级定制。
- 分层:应用 → 系统服务 → 驱动/设备模型 → 内核
- 构建:West、Kconfig、Devicetree overlay 如何对上驱动
- 运行:reset、线程切换、同步对象、heap/slab
- 落地:GPIO/总线驱动、PM、以及当前板级目录怎么改
Linux 内核
以 Linux 6.1 / RK3588 工作区为主,按真实源码目录拆子系统。目标是读到「这条调用链从 syscall 或中断走进了哪个 .c」。
目前 Linux 专题有四百多篇笔记,覆盖进程与线程、内存管理、文件系统、网络、块层和驱动模型。阅读顺序建议先建立内核目录地图,再选一条日常会碰到的路径:缺页与反向映射、VFS 打开文件、socket 收包,或 platform/总线设备如何绑定驱动。每篇尽量标源码路径,方便对照仓库。
- 调度与进程:task、调度类、同步与中断下半部
- 内存:页分配、缺页、rMap、cgroup 与回收
- 存储与网络:VFS/文件系统、block IO、协议栈与网卡
- 驱动:设备模型、总线、DT 绑定,以及各类子系统驱动
ROS 2
面向 Humble 完整工作区:节点为什么这样分层,消息如何从 rclcpp 走到 rmw,再交给 DDS。
总览部分先放环境、目录、整体架构和面试题,用来建立地图。核心栈围绕 rcl、rclcpp、rmw、rosidl。中间件放在同一专题里读:CycloneDDS 的发现与可靠传输、iceoryx 共享内存,以及 Fast-DDS。再往外是可视化、感知和工具包。排障时就能判断该看节点图、QoS,还是已经到了 DDS。
- 总览:Humble 环境、src 目录、模块职责和架构图
- 核心:rcl / rclcpp / rmw / rosidl 的边界
- 中间件:CycloneDDS、iceoryx、Fast-DDS
- 外围:Visualization、Perception、Tooling
Ceph
分布式存储按 OSD、CRUSH、BlueStore、Crimson 和 SPDK 拆开。关心对象写进去之后谁选主、谁落盘、故障时数据怎么回来。
现有笔记覆盖 OSD 启动与线程池、PG / Peering、纠删码,以及 CRUSH 如何把对象映射到 OSD。存储引擎一侧读 BlueStore 写路径、RocksDB 和 IO 栈;下一代路径则是 Crimson、SeaStore 和 SPDK。客户端面还有 MDS 与 RBD 对象映射。按子模块进分类即可。
- OSD:启动、op 线程池、PG、Peering、EC
- CRUSH:伪随机映射、bucket 与 rule
- BlueStore / IO:写事务、RocksDB、libaio / io_uring / SPDK
- Crimson / SPDK:SeaStore、用户态 IO 与 DPDK