# embedded
**Repository Path**: embeddedpro/embedded
## Basic Information
- **Project Name**: embedded
- **Description**: The repository for the book of Professional Embedded Software Development
- **Primary Language**: C
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 42
- **Forks**: 16
- **Created**: 2021-11-03
- **Last Updated**: 2025-05-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Embedded
本项目是 2012 年出版的《专业嵌入式软件开发:全面走向高质高效编程》一书的配套代码(购书请发邮件给作者),旨在帮助读者成为高效且高质量的(嵌入式和非嵌入式)程序员。当年实践书中的代码需要安装 VMware 虚拟机软件,并运行在 32 位的 Linux 操作系统上。十多年后的今天,随着 Windows 操作系统从 Windows 10 开始支持 WSL(Windows Subsystem for Linux),安装 VMware 虚拟机软件已成为过去式,本项目中的代码也已升级为运行在 64 位的 Linux 操作系统上。
对于程序员来说,最好的学习方法是“做中学”,因此本项目的设计与实现充分考虑了这一点。例如:
- 为了帮助读者深入理解实时操作系统的原理,编写了一个可以在 Linux 上运行的操作系统 **ClearRTOS**,从源代码级别帮助读者掌握任务(task)、队列(queue)、信号量(semaphore)、互斥锁(mutex)、事件组(event group)、定时器(timer)等核心概念。
- 从工具和流程的工程方法论层面,示范了如何打造高效且高质量的开发环境。通过无缝整合单元测试、静态分析、动态分析、性能分析等工具,帮助读者提升工作效率和代码质量。
---
## 准备环境
### Windows 10(及以上)
#### 1)安装 `Windows 终端`(Windows Terminal)
请从 [这里](https://github.com/microsoft/terminal/releases) 下载最新的绿色软件包,解压后直接运行即可。`Windows 终端` 相比 Windows 自带的 `Command Prompt` 和 `Windows PowerShell` 更好用(例如,支持 `Ctrl` + `+`/`-` 缩放界面字体),因此推荐安装使用。
> **注意**:此步骤为可选项。
#### 2)启用 Windows 的开发者模式(Developer Mode)
设置路径为:**开始菜单 > 设置 > 更新与安全 > 开发者选项**。
打开开发者模式开关后,在弹出的对话框中选择“是”。
#### 3)启用 WSL 功能
通过 `Win` + `R` 组合键运行 `optionalfeatures.exe`,找到 **WSL** 选项并勾选,点击“确定”后按照提示重启系统。
#### 4)安装 Ubuntu Linux
打开 **Microsoft Store**,搜索“ubuntu”并选择安装 **Ubuntu 24.04.x LTS**(“x”表示最新的版本号;“LTS”是 Long Term Support 的缩写,表示长期支持版本)。
安装完成后,点击“打开”。
等待后续的安装工作完成。
#### 5)配置 Ubuntu Linux
Ubuntu Linux 安装完成后,会提示新建一个用户。输入“iubuntu”后回车(当然,你可以自定义用户名)。
接着,输入该用户的密码并进行确认。请注意,此密码也是系统自动创建的“root”用户(类似于 Windows 中的 Administrator 管理员)的密码,在使用 Linux 的 `sudo` 命令时需要输入。
最后,出现类似以下界面表示 Ubuntu Linux 已准备就绪。
如果你安装了 `Windows 终端`,可以在 `Windows 终端` 中运行 `wsl` 命令启动 Ubuntu Linux。此时,`Windows 终端` 的操作环境即为 Linux。
#### 6)升级到 WSL 2
在 `Windows 终端` 或 `Windows PowerShell` 中运行以下命令,启用 Windows 的虚拟机平台功能:
```bash
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
接着,分别执行以下命令将 WSL 版本设置为 2,并更新 WSL:
```bash
wsl --set-default-version 2
wsl --update
wsl --set-version Ubuntu-24.04 2
```
---
### Ubuntu Linux
无论你是在 Windows WSL 下还是原生安装的 Ubuntu Linux 中,接下来的环境准备工作都是相同的,且必不可少。
#### 1)更新 Linux(可选)
如果你的 Linux 是全新安装的,建议先运行以下命令更新系统,以避免后续步骤出错。注意,运行 `sudo` 命令时需要输入 root 用户的密码。
```bash
sudo apt update
sudo apt upgrade
```
#### 2)安装编译工具
运行以下命令安装本项目所需的工具:
```bash
sudo apt install gcc g++ gdb make valgrind lcov kcachegrind cppcheck clang clang-tools
```
当提示是否继续时,输入“Y”并回车。安装过程可能需要一些时间。
---
## 着手开发
接下来的步骤均在 Ubuntu Linux 中以命令行方式完成。
### 获取代码
在 `Windows 终端` 中进入 Linux 代码存放的目录:
```bash
cd /home/iubuntu
```
运行以下命令获取本项目的代码:
```bash
git clone https://gitee.com/embeddedpro/embedded.git
```
### 编译
进入本项目的 `build` 子目录。注意:`buildv1` 至 `buildv5` 的功能与 `build` 相同,展示了整个项目构建能力的演进过程,便于你更好地学习和掌握。
```bash
cd embedded/build
```
编译选项包括:
- `make` 或 `make release`:编译生成 release 版本(采用 O2 优化)的程序,生成的可执行文件位于 `release` 子目录中。
- `make debug`:编译生成 debug 版本的程序,生成的可执行文件位于 `debug` 子目录中。
- `make unitest`:编译单元测试程序,生成的可执行文件位于 `unitest` 子目录中。
- `make test`:执行单元测试。
- `make coverage`:生成单元测试代码覆盖率报告。生成的报告位于 `coverage` 子目录中,用浏览器打开其中的 `index.html` 文件即可查看。
- `make cppcheck`:使用 cppcheck 对代码进行静态分析。
- `make scan-build`:使用 scan-build 对代码进行静态分析。
- `make asan`:编译生成 Address Sanitizer(ASAN)所需的程序,生成的可执行文件位于 `asan` 子目录中。
- `make do-asan`:执行 Address Sanitizer(ASAN)测试。
- `make profile`:执行性能分析,分析生成的数据可用 `KCachegrind` 工具查看。`KCachegrind` 是一个开源的 Linux 可视化工具,用于查看性能分析结果。
- `make clean`:清理编译生成的中间文件和可执行文件。
---
## 目录说明
- `build`:包含工程构建相关的文件,例如关键的 Makefile。`buildv1` 至 `buildv5` 展示了构建系统的演进过程。
- `code`:包含源代码。
- `application`:应用层代码。
- `framework`:框架层代码。
- `platform`:平台层代码。
- `tools`:项目自建工具链相关代码。
- `docs`:包含 ABI 规范、CPU 指令手册等文档。
- `test`:包含单元测试框架和项目的单元测试代码。
- `cmocka`:cmocka 单元测试框架。
- `application`:应用层的单元测试代码。
- `framework`:框架层的单元测试代码。
- `platform`:平台层的单元测试代码。
- `tools`:包含第三方工具链。
---
## 联系作者
如果你遇到任何问题,可以通过以下方式联系作者:
- 在项目中提交一个 Issue。
- 通过微信公众号“至简李云”与我取得联系。