banner
按时间整理的学习笔记。

文章归档

Scroll down
C

嵌入式 Linux 不等于只能写 C。驱动和底层库仍以 C 为主,但业务服务、网络通信、配置管理、升级程序可以根据资源和团队能力选择 C++、Go 或 Rust。语言选型要看约束,不要只看偏好。

嵌入式 Linux 上的 C 服务代码,不只是能编译运行就可以。它要长期运行,要处理异常输入,要能记录日志,要能重载配置,要能在资源紧张和网络异常时保持可控。

嵌入式 Linux 开发绕不开交叉编译。开发机通常是 x86_64,目标板可能是 ARM、AArch64、MIPS 或 RISC-V。代码在开发机上编译,最终要在目标板上运行,这中间最容易出问题的是架构、动态链接器和依赖库。

学习嵌入式 Linux 最容易遇到的问题,不是资料太少,而是资料太散。今天看驱动,明天看 Buildroot,后天又去研究 U-Boot,结果每个概念都知道一点,但真正拿到一块板子时,还是不知道从哪里开始开发。

更合理的方式,是按真实项目的开发链路学习:先能把系统跑起来,再能改 rootfs,再能开发应用,最后再深入内核和驱动。

一、什么是 RTOS

RTOS 是 Real-Time Operating System,实时操作系统。它常用于单片机和资源受限设备中,用来管理多个任务、定时器、同步和通信。

常见 RTOS:

  • FreeRTOS。
  • RT-Thread。
  • Zephyr。
  • ThreadX。

一、为什么要规范工程结构

小 demo 可以一个 main.c 加一条 gcc 命令解决,但真实项目会有多个模块、多个库、测试、安装和部署。工程结构不清晰,后期会很难维护。

一个比较常见的 C/C++ 项目结构:

1
2
3
4
5
6
7
8
9
10
11
my_app/
├── CMakeLists.txt
├── include/
│ └── my_app/
│ └── version.h
├── src/
│ ├── main.c
│ └── version.c
├── tests/
│ └── test_version.c
└── README.md

一、为什么要重视内存

Linux 应用运行时间越长,内存问题越容易暴露。短时间测试正常,不代表长期运行稳定。内存泄漏、越界访问、重复释放、use-after-free 都可能导致崩溃、性能下降或系统被 OOM killer 杀死。

常见内存问题:

  • 内存泄漏。
  • 空指针访问。
  • 数组越界。
  • 重复释放。
  • 释放后继续使用。
  • 栈空间不足。
  • 内存碎片。

一、什么是 IPC

IPC 是 Inter-Process Communication,也就是进程间通信。Linux 中每个进程默认有独立地址空间,一个进程不能直接访问另一个进程的内存。如果多个进程需要协作,就需要 IPC。

常见 IPC 方式:

  • 管道 pipe。
  • 命名管道 FIFO。
  • 信号 signal。
  • 共享内存 shared memory。
  • 消息队列 message queue。
  • Unix Domain Socket。
  • TCP/UDP socket。

一、什么是嵌入式开发

嵌入式开发是围绕特定硬件设备进行的软件开发。和普通 PC 或服务器开发相比,嵌入式更关注硬件资源、实时性、功耗、启动速度、稳定性和长期运行。

常见设备:

  • 路由器。
  • 工业控制器。
  • 智能家居设备。
  • 车载设备。
  • 摄像头。
  • 网关。
  • 可穿戴设备。

一、网络编程先理解什么

Linux 网络编程的核心是 socket。socket 是应用程序访问网络的接口,HTTP、WebSocket、RPC 等上层协议最终都建立在 socket 之上。

入门需要先理解:

  • IP:主机地址。
  • 端口:进程提供服务的入口。
  • TCP:可靠字节流。
  • UDP:无连接数据报。
  • 服务端:监听端口,等待连接。
  • 客户端:主动连接服务端。
12
请输入关键词进行搜索