Zephyr编译生成的build目录完全解析

Zephyr编译生成的build目录完全解析

引言

在Zephyr RTOS开发中,执行west build命令后会在项目目录下生成一个build目录。这个目录包含了编译过程中生成的所有中间文件、配置文件、编译产物和调试信息。理解build目录的结构和内容,对于调试、分析和优化Zephyr应用程序至关重要。

本文将深入解析Zephyr编译生成的build目录结构、重要文件的作用,以及如何利用这些信息进行开发调试。


一、build目录概述

1.1 build目录的生成

build目录由CMake和Ninja构建系统自动生成:
#mermaid-svg-zBuXrCyrCpogJZ86{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zBuXrCyrCpogJZ86 .error-icon{fill:#552222;}#mermaid-svg-zBuXrCyrCpogJZ86 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zBuXrCyrCpogJZ86 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 .marker.cross{stroke:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zBuXrCyrCpogJZ86 p{margin:0;}#mermaid-svg-zBuXrCyrCpogJZ86 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster-label text{fill:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster-label span{color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster-label span p{background-color:transparent;}#mermaid-svg-zBuXrCyrCpogJZ86 .label text,#mermaid-svg-zBuXrCyrCpogJZ86 span{fill:#333;color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .node rect,#mermaid-svg-zBuXrCyrCpogJZ86 .node circle,#mermaid-svg-zBuXrCyrCpogJZ86 .node ellipse,#mermaid-svg-zBuXrCyrCpogJZ86 .node polygon,#mermaid-svg-zBuXrCyrCpogJZ86 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .rough-node .label text,#mermaid-svg-zBuXrCyrCpogJZ86 .node .label text,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape .label,#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape .label{text-anchor:middle;}#mermaid-svg-zBuXrCyrCpogJZ86 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .rough-node .label,#mermaid-svg-zBuXrCyrCpogJZ86 .node .label,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape .label,#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape .label{text-align:center;}#mermaid-svg-zBuXrCyrCpogJZ86 .node.clickable{cursor:pointer;}#mermaid-svg-zBuXrCyrCpogJZ86 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 .arrowheadPath{fill:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zBuXrCyrCpogJZ86 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zBuXrCyrCpogJZ86 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zBuXrCyrCpogJZ86 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zBuXrCyrCpogJZ86 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zBuXrCyrCpogJZ86 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster text{fill:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster span{color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zBuXrCyrCpogJZ86 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 rect.text{fill:none;stroke-width:0;}#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape p,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape .label rect,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zBuXrCyrCpogJZ86 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zBuXrCyrCpogJZ86 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zBuXrCyrCpogJZ86 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} west build
CMake配置
生成构建文件
Ninja编译
生成build目录
中间文件
编译产物
调试信息

bash 复制代码
# 基本编译命令
west build -b qemu_x86 samples/basic/blinky

# 指定build目录名称
west build -b qemu_x86 samples/basic/blinky -d mybuild

# 清理build目录
west build -t clean

# 完全清理
west build -t pristine

1.2 build目录位置

#mermaid-svg-CzQXqGrf1tSLxtAx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CzQXqGrf1tSLxtAx .error-icon{fill:#552222;}#mermaid-svg-CzQXqGrf1tSLxtAx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CzQXqGrf1tSLxtAx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx .marker.cross{stroke:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CzQXqGrf1tSLxtAx p{margin:0;}#mermaid-svg-CzQXqGrf1tSLxtAx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster-label text{fill:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster-label span{color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster-label span p{background-color:transparent;}#mermaid-svg-CzQXqGrf1tSLxtAx .label text,#mermaid-svg-CzQXqGrf1tSLxtAx span{fill:#333;color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .node rect,#mermaid-svg-CzQXqGrf1tSLxtAx .node circle,#mermaid-svg-CzQXqGrf1tSLxtAx .node ellipse,#mermaid-svg-CzQXqGrf1tSLxtAx .node polygon,#mermaid-svg-CzQXqGrf1tSLxtAx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .rough-node .label text,#mermaid-svg-CzQXqGrf1tSLxtAx .node .label text,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape .label,#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape .label{text-anchor:middle;}#mermaid-svg-CzQXqGrf1tSLxtAx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .rough-node .label,#mermaid-svg-CzQXqGrf1tSLxtAx .node .label,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape .label,#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape .label{text-align:center;}#mermaid-svg-CzQXqGrf1tSLxtAx .node.clickable{cursor:pointer;}#mermaid-svg-CzQXqGrf1tSLxtAx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx .arrowheadPath{fill:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CzQXqGrf1tSLxtAx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CzQXqGrf1tSLxtAx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CzQXqGrf1tSLxtAx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CzQXqGrf1tSLxtAx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CzQXqGrf1tSLxtAx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster text{fill:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster span{color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CzQXqGrf1tSLxtAx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx rect.text{fill:none;stroke-width:0;}#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape p,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape .label rect,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CzQXqGrf1tSLxtAx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CzQXqGrf1tSLxtAx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CzQXqGrf1tSLxtAx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 项目目录
源代码
build/
默认位置
自定义位置
项目根目录/build/
-d 参数指定

位置类型 路径示例
默认位置 ~/zephyrproject/zephyr/build/
自定义位置 ~/zephyrproject/zephyr/mybuild/
应用目录 ~/myapp/build/

二、build目录顶层结构

2.1 目录概览

复制代码
build/
├── CMakeCache.txt              # CMake配置缓存
├── CMakeFiles/                 # CMake内部文件
├── cmake_install.cmake         # 安装脚本
├── Makefile                    # 构建文件(如果使用Make)
├── build.ninja                 # Ninja构建文件
├── rules.ninja                 # Ninja构建规则
├── compile_commands.json       # 编译命令数据库
├── zephyr/                     # Zephyr编译产物
│   ├── CMakeFiles/
│   ├── zephyr.elf              # ELF可执行文件
│   ├── zephyr.bin              # 二进制文件
│   ├── zephyr.hex              # HEX文件
│   ├── zephyr.map              # 链接映射文件
│   ├── include/                # 生成的头文件
│   ├── Kconfig/                # Kconfig输出
│   └── modules/                # 模块编译产物
├── modules/                    # 外部模块编译产物
├── boards/                     # 板级编译产物
└── zephyr_modules.txt          # 模块列表

2.2 目录大小分布

#mermaid-svg-mTcBPS2eGWKoGxcd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mTcBPS2eGWKoGxcd .error-icon{fill:#552222;}#mermaid-svg-mTcBPS2eGWKoGxcd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mTcBPS2eGWKoGxcd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mTcBPS2eGWKoGxcd .marker.cross{stroke:#333333;}#mermaid-svg-mTcBPS2eGWKoGxcd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mTcBPS2eGWKoGxcd p{margin:0;}#mermaid-svg-mTcBPS2eGWKoGxcd .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-mTcBPS2eGWKoGxcd .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-mTcBPS2eGWKoGxcd .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-mTcBPS2eGWKoGxcd .slice{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-mTcBPS2eGWKoGxcd .legend text{fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-mTcBPS2eGWKoGxcd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 35% 20% 20% 15% 10% build目录大小分布 zephyr.elf zephyr.bin CMakeFiles 中间文件 其他


三、核心编译产物详解

3.1 zephyr目录结构

复制代码
build/zephyr/
├── zephyr.elf                  # ELF格式可执行文件
├── zephyr.bin                  # 原始二进制文件
├── zephyr.hex                  # Intel HEX格式文件
├── zephyr.map                  # 链接映射文件
├── zephyr.lst                  # 反汇编列表文件
├── zephyr.stat                 # 统计信息文件
├── zephyr.symbols              # 符号表文件
├── zephyr.log                  # 构建日志
├── CMakeFiles/
│   ├── zephyr.dir/
│   └── ...
├── include/
│   ├── generated/
│   │   ├── autoconf.h          # Kconfig生成的配置头文件
│   │   ├── devicetree.h        # 设备树生成的头文件
│   │   ├── devicetree_unfixed.h
│   │   └── device_extern.h
│   └── zephyr/
│       └── ...
├── Kconfig/
│   ├── Kconfig                 # Kconfig配置
│   └── Kconfig.soc             # SoC配置
├── modules/
│   ├── hal/
│   └── lib/
└── soc/
    └── ...

3.2 ELF文件详解

zephyr.elf 是主要的编译产物,包含完整的程序信息:

bash 复制代码
# 查看ELF文件信息
arm-zephyr-eabi-readelf -h build/zephyr/zephyr.elf

# 输出示例
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Entry point address:               0x00000000

ELF文件内容:

内容 说明
代码段 .text - 程序代码
数据段 .data - 已初始化数据
BSS段 .bss - 未初始化数据
符号表 .symtab - 符号信息
调试信息 .debug_* - 调试数据

3.3 二进制文件详解

zephyr.bin 是可直接烧录的二进制文件:

bash 复制代码
# 查看bin文件大小
ls -lh build/zephyr/zephyr.bin

# 输出示例
-rw-r--r-- 1 user user 128K Jun 14 10:00 zephyr.bin

# 查看bin文件内容
hexdump -C build/zephyr/zephyr.bin | head -20

3.4 HEX文件详解

zephyr.hex 是Intel HEX格式文件,常用于烧录工具:

bash 复制代码
# 查看HEX文件内容
head -20 build/zephyr/zephyr.hex

# 输出示例
:020000040000FA
:10000000XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
:10001000XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
...
:00000001FF

HEX格式说明:

字段 格式 说明
起始码 : 每行开始
字节数 02 数据字节数
地址 0000 数据地址
类型 00 数据类型
数据 XXXX... 实际数据
校验 FF 校验和

3.5 MAP文件详解

zephyr.map 是链接映射文件,包含符号和地址信息:

bash 复制代码
# 查看MAP文件
head -100 build/zephyr/zephyr.map

# 输出示例
Archive member included to satisfy reference by file (symbol)

...
Memory Configuration

Name             Origin             Length             Attributes
FLASH            0x00000000         0x00080000         xr
SRAM             0x20000000         0x00010000         xrw
*default*        0x00000000         0xffffffff

Linker script and memory map

LOAD build/zephyr/CMakeFiles/zephyr.dir/...
...

MAP文件关键信息:

信息类型 说明
内存配置 FLASH、SRAM等区域配置
符号地址 函数和变量的地址
段大小 各代码段和数据段的大小
引用关系 符号之间的引用关系

四、配置生成文件详解

4.1 autoconf.h文件

autoconf.h 由Kconfig生成,包含所有配置选项:

c 复制代码
// build/zephyr/include/generated/autoconf.h

// 内核配置
#define CONFIG_KERNEL_VERSION "3.5.0"
#define CONFIG_KERNEL_MEM_POOL_SIZE 1024

// 线程配置
#define CONFIG_NUM_COOP_PRIORITIES 16
#define CONFIG_NUM_PREEMPT_PRIORITIES 32
#define CONFIG_MAIN_THREAD_PRIORITY 0

// 调试配置
#define CONFIG_DEBUG_OPTIMIZATIONS 1
#define CONFIG_DEBUG_THREAD_INFO 1

// 驱动配置
#define CONFIG_GPIO 1
#define CONFIG_SERIAL 1
#define CONFIG_UART_INTERRUPT_DRIVEN 1

// 网络配置
#define CONFIG_NETWORKING 1
#define CONFIG_NET_IPV4 1
#define CONFIG_NET_TCP 1

4.2 devicetree.h文件

devicetree.h 由设备树生成,包含设备信息:

c 复制代码
// build/zephyr/include/generated/devicetree.h

// 设备节点定义
#define DT_NODELABEL__gpio0 DT_NODELABEL_from_alias_gpio0
#define DT_NODELABEL__uart0 DT_NODELABEL_from_alias_uart0

// 设备属性
#define DT_INST_0_nordic_nrf_uart_BASE_ADDRESS 0x40002000
#define DT_INST_0_nordic_nrf_uart_IRQ_0 2
#define DT_INST_0_nordic_nrf_uart_IRQ_0_PRIORITY 1

// GPIO配置
#define DT_INST_0_nordic_nrf_gpio_BASE_ADDRESS 0x50000000
#define DT_INST_0_nordic_nrf_gpio_IRQ_0 0

4.3 device_extern.h文件

device_extern.h 包含设备结构体声明:

c 复制代码
// build/zephyr/include/generated/device_extern.h

// 设备结构体声明
extern const struct device __device__gpio_0;
extern const struct device __device__uart_0;
extern const struct device __device__timer_0;

// 设备区域定义
extern const struct device __device_start[];
extern const struct device __device_end[];

五、CMake相关文件详解

5.1 CMakeCache.txt

CMakeCache.txt 包含所有CMake配置变量:

cmake 复制代码
# build/CMakeCache.txt

// 构建类型
CMAKE_BUILD_TYPE:STRING=Debug

// 编译器路径
CMAKE_C_COMPILER:FILEPATH=/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc
CMAKE_CXX_COMPILER:FILEPATH=/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-g++

// 目标板
BOARD:STRING=nrf52840dk_nrf52840

// Zephyr基础路径
ZEPHYR_BASE:PATH=/home/user/zephyrproject/zephyr

// 架构
CONFIG_ARCH:STRING=arm

// SoC
CONFIG_SOC:STRING=nrf52840

5.2 compile_commands.json

compile_commands.json 包含所有编译命令,用于IDE集成:

json 复制代码
[
  {
    "directory": "/home/user/zephyrproject/zephyr/build",
    "command": "/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc 
      -DKERNEL -I/home/user/zephyrproject/zephyr/include 
      -I/home/user/zephyrproject/zephyr/build/zephyr/include/generated 
      -mcpu=cortex-m4 -mthumb -Wall -Werror -O2 -g 
      -c /home/user/zephyrproject/zephyr/kernel/main.c 
      -o CMakeFiles/zephyr.dir/kernel/main.c.obj",
    "file": "/home/user/zephyrproject/zephyr/kernel/main.c"
  },
  ...
]

5.3 build.ninja

build.ninja 是Ninja构建系统的主构建文件:

ninja 复制代码
# build/build.ninja

# 构建规则
rule C_COMPILER
  command = /opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc $ARGS -c $in -o $out
  description = Building C object $out

rule LINKER
  command = /opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc $ARGS $in -o $out
  description = Linking $out

# 构建目标
build CMakeFiles/zephyr.dir/kernel/main.c.obj: C_COMPILER ../kernel/main.c
build zephyr.elf: LINKER CMakeFiles/zephyr.dir/kernel/main.c.obj ...

六、调试信息文件详解

6.1 zephyr.lst文件

zephyr.lst 是反汇编列表文件:

bash 复制代码
# 查看反汇编列表
head -100 build/zephyr/zephyr.lst

# 输出示例
build/zephyr/zephyr.elf:     file format elf32-littlearm

Disassembly of section .text:

00000000 <z_main>:
   0:   e92d 4ff0    stmdb   sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
   4:   e24dd018     sub     sp, sp, #24
   8:   e59f0034     ldr     r0, [pc, #52]
   c:   e5900000     ldr     r0, [r0]
  ...

6.2 zephyr.stat文件

zephyr.stat 包含统计信息:

bash 复制代码
# 查看统计信息
cat build/zephyr/zephyr.stat

# 输出示例
Memory region         Used Size   Region Size  %age Used
           FLASH:       128 KB       512 KB     25.00%
            SRAM:        32 KB       128 KB     25.00%
         IDT_LIST:          0 GB         2 KB      0.00%

Total flash used: 128 KB
Total sram used: 32 KB

6.3 zephyr.symbols文件

zephyr.symbols 包含符号表:

bash 复制代码
# 查看符号表
head -50 build/zephyr/zephyr.symbols

# 输出示例
00000000 T z_main
00000010 T z_thread_entry
00000020 T z_swap
00000030 T z_sched_lock
00000040 T z_sched_unlock
...

七、模块编译产物详解

7.1 modules目录结构

复制代码
build/modules/
├── hal/
│   ├── nordic/
│   │   ├── CMakeFiles/
│   │   ├── hal_nrf.a           # HAL静态库
│   │   └── ...
│   ├── stm32/
│   │   ├── CMakeFiles/
│   │   ├── hal_stm32.a
│   │   └── ...
│   └── ...
├── lib/
│   ├── mbedtls/
│   │   ├── CMakeFiles/
│   │   ├── mbedtls.a           # mbedtls静态库
│   │   └── ...
│   ├── littlefs/
│   │   ├── CMakeFiles/
│   │   ├── littlefs.a
│   │   └── ...
│   └── ...
└── tee/
    └── tf-m/
        ├── CMakeFiles/
        └── tf-m.a

7.2 静态库文件

每个模块编译后生成静态库(.a文件):

bash 复制代码
# 查看静态库内容
arm-zephyr-eabi-ar -t build/modules/hal/nordic/hal_nrf.a

# 输出示例
nrf_gpio.o
nrf_uart.o
nrf_spi.o
nrf_timer.o
...

# 查看静态库符号
arm-zephyr-eabi-nm build/modules/lib/mbedtls/mbedtls.a

八、构建过程与文件生成

8.1 构建流程图

#mermaid-svg-W4VaEqqNnjlCfEAn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-W4VaEqqNnjlCfEAn .error-icon{fill:#552222;}#mermaid-svg-W4VaEqqNnjlCfEAn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-W4VaEqqNnjlCfEAn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn .marker.cross{stroke:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-W4VaEqqNnjlCfEAn p{margin:0;}#mermaid-svg-W4VaEqqNnjlCfEAn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster-label text{fill:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster-label span{color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster-label span p{background-color:transparent;}#mermaid-svg-W4VaEqqNnjlCfEAn .label text,#mermaid-svg-W4VaEqqNnjlCfEAn span{fill:#333;color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .node rect,#mermaid-svg-W4VaEqqNnjlCfEAn .node circle,#mermaid-svg-W4VaEqqNnjlCfEAn .node ellipse,#mermaid-svg-W4VaEqqNnjlCfEAn .node polygon,#mermaid-svg-W4VaEqqNnjlCfEAn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .rough-node .label text,#mermaid-svg-W4VaEqqNnjlCfEAn .node .label text,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape .label,#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape .label{text-anchor:middle;}#mermaid-svg-W4VaEqqNnjlCfEAn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .rough-node .label,#mermaid-svg-W4VaEqqNnjlCfEAn .node .label,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape .label,#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape .label{text-align:center;}#mermaid-svg-W4VaEqqNnjlCfEAn .node.clickable{cursor:pointer;}#mermaid-svg-W4VaEqqNnjlCfEAn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn .arrowheadPath{fill:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-W4VaEqqNnjlCfEAn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-W4VaEqqNnjlCfEAn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W4VaEqqNnjlCfEAn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-W4VaEqqNnjlCfEAn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W4VaEqqNnjlCfEAn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster text{fill:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster span{color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-W4VaEqqNnjlCfEAn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn rect.text{fill:none;stroke-width:0;}#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape p,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape .label rect,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W4VaEqqNnjlCfEAn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-W4VaEqqNnjlCfEAn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-W4VaEqqNnjlCfEAn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} west build
CMake配置阶段
解析Kconfig
处理设备树
生成配置文件
autoconf.h
devicetree.h
CMakeCache.txt
Ninja编译阶段
编译源文件
编译模块
.o目标文件
.a静态库
链接阶段
zephyr.elf
zephyr.bin
zephyr.hex
zephyr.map

8.2 文件生成顺序

阶段 生成的文件
CMake配置 CMakeCache.txt, build.ninja
Kconfig解析 autoconf.h, Kconfig/
设备树处理 devicetree.h, devicetree_unfixed.h
编译阶段 .o目标文件, .a静态库
链接阶段 zephyr.elf, zephyr.bin, zephyr.hex
后处理 zephyr.map, zephyr.lst, zephyr.stat

九、常用调试与分析命令

9.1 查看编译产物

bash 复制代码
# 查看ELF文件信息
arm-zephyr-eabi-readelf -h build/zephyr/zephyr.elf

# 查看ELF文件段
arm-zephyr-eabi-readelf -S build/zephyr/zephyr.elf

# 查看符号表
arm-zephyr-eabi-nm build/zephyr/zephyr.elf

# 查看反汇编
arm-zephyr-eabi-objdump -d build/zephyr/zephyr.elf

# 查看段大小
arm-zephyr-eabi-size build/zephyr/zephyr.elf

9.2 查看内存使用

bash 复制代码
# 查看内存统计
cat build/zephyr/zephyr.stat

# 查看MAP文件中的内存配置
grep "Memory Configuration" build/zephyr/zephyr.map

# 查看段大小
arm-zephyr-eabi-size -A build/zephyr/zephyr.elf

9.3 查看配置信息

bash 复制代码
# 查看Kconfig配置
cat build/zephyr/include/generated/autoconf.h

# 查看设备树配置
cat build/zephyr/include/generated/devicetree.h

# 查看CMake配置
grep "CONFIG_" build/CMakeCache.txt

9.4 查看编译命令

bash 复制代码
# 查看所有编译命令
cat build/compile_commands.json

# 查看特定文件的编译命令
grep "main.c" build/compile_commands.json

十、build目录管理

10.1 清理build目录

bash 复制代码
# 清理编译产物(保留配置)
west build -t clean

# 完全清理(删除整个build目录)
west build -t pristine

# 手动删除
rm -rf build/

10.2 重新配置

bash 复制代码
# 重新运行CMake配置
west build -t cmake

# 更新配置后重新编译
west build -b qemu_x86 samples/basic/blinky -- -DCONFIG_DEBUG_OPTIMIZATIONS=y

# 使用menuconfig配置
west build -t menuconfig

10.3 build目录命名

bash 复制代码
# 使用自定义build目录名
west build -b qemu_x86 samples/basic/blinky -d mybuild

# 多build目录管理
west build -b nrf52840dk_nrf52840 samples/basic/blinky -d build-nrf
west build -b qemu_x86 samples/basic/blinky -d build-qemu

十一、常见问题与解决方案

11.1 build目录过大

问题:build目录占用大量磁盘空间

解决:

bash 复制代码
# 清理中间文件
west build -t clean

# 使用pristine清理
west build -t pristine

# 定期清理旧的build目录
rm -rf build-*

11.2 配置未生效

问题:修改Kconfig配置后未生效

解决:

bash 复制代码
# 检查autoconf.h
grep "CONFIG_MY_OPTION" build/zephyr/include/generated/autoconf.h

# 重新配置
west build -t pristine
west build -b <board> <app>

11.3 设备树错误

问题:设备树配置错误导致编译失败

解决:

bash 复制代码
# 检查设备树生成文件
cat build/zephyr/include/generated/devicetree.h

# 检查设备树绑定
ls build/zephyr/dts/bindings/

11.4 链接错误

问题:链接阶段出现未定义符号错误

解决:

bash 复制代码
# 查看MAP文件中的符号
grep "undefined" build/zephyr/zephyr.map

# 检查静态库是否包含所需符号
arm-zephyr-eabi-nm build/modules/lib/mbedtls/mbedtls.a

11.5 编译缓存问题

问题:修改代码后编译结果未更新

解决:

bash 复制代码
# 强制重新编译
west build -t pristine
west build

# 或删除特定目标文件
rm build/zephyr/CMakeFiles/zephyr.dir/kernel/main.c.obj
west build

十二、build目录与调试工具

12.1 GDB调试

bash 复制代码
# 使用GDB调试ELF文件
arm-zephyr-eabi-gdb build/zephyr/zephyr.elf

# GDB命令示例
(gdb) target remote localhost:3333
(gdb) break main
(gdb) continue
(gdb) info registers
(gdb) disassemble

12.2 QEMU仿真

bash 复制代码
# 使用QEMU运行
west build -t run

# 手动运行QEMU
qemu-system-arm -M nrf52840dk -kernel build/zephyr/zephyr.elf

12.3 烧录工具

bash 复制代码
# 使用nrfjprog烧录(Nordic芯片)
nrfjprog --program build/zephyr/zephyr.hex --sectoranduicrerase

# 使用openocd烧录
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg \
  -c "program build/zephyr/zephyr.elf verify reset exit"

十三、build目录最佳实践

13.1 build目录管理建议

#mermaid-svg-2THw1c5LonknLbF1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2THw1c5LonknLbF1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2THw1c5LonknLbF1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2THw1c5LonknLbF1 .error-icon{fill:#552222;}#mermaid-svg-2THw1c5LonknLbF1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2THw1c5LonknLbF1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2THw1c5LonknLbF1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2THw1c5LonknLbF1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2THw1c5LonknLbF1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2THw1c5LonknLbF1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2THw1c5LonknLbF1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2THw1c5LonknLbF1 .marker.cross{stroke:#333333;}#mermaid-svg-2THw1c5LonknLbF1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2THw1c5LonknLbF1 p{margin:0;}#mermaid-svg-2THw1c5LonknLbF1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster-label text{fill:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster-label span{color:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster-label span p{background-color:transparent;}#mermaid-svg-2THw1c5LonknLbF1 .label text,#mermaid-svg-2THw1c5LonknLbF1 span{fill:#333;color:#333;}#mermaid-svg-2THw1c5LonknLbF1 .node rect,#mermaid-svg-2THw1c5LonknLbF1 .node circle,#mermaid-svg-2THw1c5LonknLbF1 .node ellipse,#mermaid-svg-2THw1c5LonknLbF1 .node polygon,#mermaid-svg-2THw1c5LonknLbF1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .rough-node .label text,#mermaid-svg-2THw1c5LonknLbF1 .node .label text,#mermaid-svg-2THw1c5LonknLbF1 .image-shape .label,#mermaid-svg-2THw1c5LonknLbF1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2THw1c5LonknLbF1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .rough-node .label,#mermaid-svg-2THw1c5LonknLbF1 .node .label,#mermaid-svg-2THw1c5LonknLbF1 .image-shape .label,#mermaid-svg-2THw1c5LonknLbF1 .icon-shape .label{text-align:center;}#mermaid-svg-2THw1c5LonknLbF1 .node.clickable{cursor:pointer;}#mermaid-svg-2THw1c5LonknLbF1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2THw1c5LonknLbF1 .arrowheadPath{fill:#333333;}#mermaid-svg-2THw1c5LonknLbF1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2THw1c5LonknLbF1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2THw1c5LonknLbF1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2THw1c5LonknLbF1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2THw1c5LonknLbF1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2THw1c5LonknLbF1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2THw1c5LonknLbF1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .cluster text{fill:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster span{color:#333;}#mermaid-svg-2THw1c5LonknLbF1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2THw1c5LonknLbF1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2THw1c5LonknLbF1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2THw1c5LonknLbF1 .icon-shape,#mermaid-svg-2THw1c5LonknLbF1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2THw1c5LonknLbF1 .icon-shape p,#mermaid-svg-2THw1c5LonknLbF1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2THw1c5LonknLbF1 .icon-shape .label rect,#mermaid-svg-2THw1c5LonknLbF1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2THw1c5LonknLbF1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2THw1c5LonknLbF1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2THw1c5LonknLbF1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} build目录管理
定期清理
版本控制
命名规范
使用clean/pristine
删除旧build目录
不纳入Git
记录配置
按板命名
按应用命名

13.2 实践建议

建议 说明
不纳入版本控制 build目录不应提交到Git
定期清理 使用west build -t pristine清理
命名规范 使用-d build-<board>命名
记录配置 保存prj.conf而非build目录
备份重要文件 备份.elf和.hex文件

13.3 .gitignore配置

gitignore 复制代码
# .gitignore
build/
*.bin
*.elf
*.hex
*.map
*.lst
*.o
*.a
CMakeCache.txt
CMakeFiles/
cmake_install.cmake
compile_commands.json

结束语

通过本文的深入解析,相信您已经全面理解了Zephyr编译生成的build目录:

目录/文件 内容
zephyr.elf ELF可执行文件(含调试信息)
zephyr.bin 原始二进制文件
zephyr.hex Intel HEX格式文件
zephyr.map 链接映射文件
autoconf.h Kconfig配置头文件
devicetree.h 设备树头文件
CMakeCache.txt CMake配置缓存
compile_commands.json 编译命令数据库
modules/ 模块编译产物

理解build目录结构对于:

  1. 调试分析 :使用.elf和.map文件进行调试
  2. 内存优化 :分析.stat文件优化内存使用
  3. 配置验证 :检查autoconf.h确认配置生效
  4. 烧录部署 :使用.hex或.bin文件烧录

建议在实际开发中充分利用build目录中的信息,提高开发效率和调试能力。


参考资料:

相关推荐
wotaifuzao12 天前
(十)BLE GATT与ATT深度解剖-从属性表到CCCD-订阅收不到数据的终极答案
低功耗蓝牙·ble·nrf52·zephyr·gatt·cccd
星源~12 天前
zephyr-Linux环境下搭建步骤
linux·mcu·嵌入式开发·zephyr
dozenyaoyida21 天前
Zephyr BLE 上行链路源码拆解:一个空中报文怎么从 radio 跑到应用回调(NCS v3.2.1)
controller·嵌入式开发·ble·host·zephyr·协议栈·软链路层
dozenyaoyida23 天前
Zephyr BLE GATT Server 注册到收发调用链源码解析(NCS v3.2.1)
ble·zephyr·gatt·ble协议栈
iini2 个月前
nRF Connect SDK 开发新体验:VS Code + Claude Code + DeepSeek + Nordic MCP 全流程(蓝牙开发实例)
agent·ai编程·nrf connect sdk·zephyr·蓝牙开发·deepseek·mcp·claude code·nordic mcp
fitpolo2 个月前
详解Zephyr设备树与设备驱动模型
zephyr
乐鑫科技 Espressif2 个月前
用 AI 开发 Zephyr-IoT 应用
人工智能·物联网·esp32·乐鑫科技·zephyr
固执的你2 个月前
串口中断接收协议数据并用状态机解析_printk()打印内容
zephyr
fitpolo2 个月前
Zephyr的SPI
zephyr
toradexsh3 个月前
基于 NXP i.MX8M Plus 测试 Zephyr RTOS
arm·rtos·nxp·imx8mp·zephyr