NCS-OS系列1 : NCS-SDK编译过程解析

概述

ncs 相关文章,部分为原始文档翻译,水平有限,如果有错误,欢迎指出。

本文参考链接:
https://docs.zephyrproject.org/latest/guides/build/index.html

编译过程总览

nRF Connect SDK的编译过程和zephyr的编译过程是一致的,主要分为两个阶段:

  • 配置阶段由CMake驱动
  • 编译阶段一般由Make或者Ninja ,在ncs中使用Ninja
配置阶段

当我们调用CMake时,配置阶段开始,指定源应用程序目录和板目标开始配置,也就 是我们输入如下指令的时候

cmake -GNinja -DBOARD=nrf9160_pcal0090ns..

当然,在目前的ncs环境中,我们可以通过使用west工具输入下面指令进行配置和构建,它实际上调用了上面的指令,并且额外调用了ninja指令

west build -b nrf9160_pcal0090ns

配置的过程如下图所示:

在这里插入图片描述

CMake首先处理用户应用程序目录中的CMakeLists.txt文件,我们以helloworld为例,打开hello_world\CMakeLists.txt:

1 	cmake_minimum_required(VERSION 3.13.1)
2 	find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
3 	project(hello_world)
4 	target_sources(app PRIVATE src/main.c)

这里1,3,4行都是一些基础配置,比如设置工程名字,添加源代码等,先忽略掉,这里主要看第二行代码:

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})

这里的ZEPHYR_BASE指向的是zephyr的根目录,我们在安装ncs环境的时候,已经配置过该宏定义指向,也就是ncs\zephyr这个目录,然后find_package的作用是在ZEPHYR_BASE目录下找到Zephyr的模块,在cmake中,模块的命名模板为xxxConfig.cmakeFindxxx.cmake,这里我们找到的是ncs\zephyr\share\zephyr-package\cmake\ZephyrConfig.cmake它通过调用ncs\zephyr\cmake\app\boilerplate.cmake来处理devicetree及kconfig等配置文件,输出一组makefile或Ninja文件来驱动构建过程。

Devicetree处理

*. dts (devicetree源文件)和*. dtsi(devicetree源文件包含的文件)从配置的目标架构,SOC ,板子和用户目录中获取
*dts文件通过Cpp也就是C预处理器包含*dtsi文件,C预处理器也可以用于在任何 devicetree的*. overlay文件中进行合并,或者在*. dts,*.dtsi*. overlay文件中展开相应的宏定义

经过预处理的devicetree源文件(存储在*. dts. pre. tmp中)由gen_defines. py进行解 析,生成一个带有预处理宏的devicetree_unfixed. h文件。

同样的,出于调试的目的,gen_defines. py同样会把最终的devicetree写入 zephyr.dts文件中,该文件仅作为参考,没有任何地方会用到。

dtc devivetree编译工具会获取到编译过程中的错误和警告,如果没有出现错误和警 告,则不会用到。

Devicetree fixups 来自目标体系结构、SoC、board和应程序目录的dts_fixup.h的文件被链接到一个 devicetree_fixups. h文件中.dts_fixup. h文件用于将生成的宏重命名为源代码所期望的名称.

源代码通过包含了devicetree_unfixed.hdevicetree_fixups.h文件生成的devicetree.h访问从devicetree生成的预处理器宏

Kconfig

Kconfig文件定义了目标体系结构、SoC、board和应用程序的可用配置选项,以及选项之间的依赖关系。

Kconfig配置存储在配置文件中.最初的配置是通过合并来自板子和应用程序的配置(如pri.conf)来生成的。

Kconfig的输出是一个autoconf.h头文件和一个.config文件,它同时作为已保存的配 置和配置的输出文件(由CMake使用),
Kconfig可以通过在kconfigfunctions.py中定义的函数获得来自devicetree的信息。

构建阶段

构建阶段从用户调用make或ninja开始。它的最终输出是完整的Zephyr应用程序,其格式适合烧录到到所需的目标板,如zephyr.elf或zephyr.hex等等,构建阶段 可以被分解为四个阶段:

  • pre-build
  • first-pass binary
  • final binary
  • post-processing
Pre-build 阶段

在这里插入图片描述

创建offset

当不能立即访问结构和成员的定义时(例如,汇编语言),有时需要通过访问这些结构和成员,通过生成offset .h(通过gen_offset_header.py)来实现这一点。

引用System call

gen_syscall.pyparse_syscalls.py脚本工作,将潜在的系统调用函数与其实现绑定在一起。

First-pass binary阶段

在这里插入图片描述
正常的编译从第一遍二进制文件开始,源文件(C和汇编)从各种子系统收集(在配置阶段决定),并编译成归档文件(参考树中的头文件,以及在配置阶段和预构建阶段生成的头文件)。

如果启用了memory protection,那么gen_appjpartitions.py脚本扫描所有生成的归档文件并输出链接脚本,以确保应用程序分区被正确的分区并且和目础板子的内存保护硬件对齐。

然后使用cpp将来自目标体系结构/SoC的链接器脚本片段、内核树,如果启用了内存保护,还会包含分区输出,以及在配置过程中选择的任何其他片段组合到linker. cmd文件中。然后按照linker .cmd中指定的方式通过Id工具将上面产生的 归档文件链接起来。

在某些配置中,这就是最后的二制文件,下一阶段(Final binary)将被跳过。

Final binary阶段

在这里插入图片描述
在某些配置中,来自上一阶段的二进制数据是不完整的,其中有空的和/或占位符部分,本质上必须由反射来填充。

当启用User Mode时,内核对象的哈希:
gen_kobject_list.py扫描ELF DWARF调试数据,以找到所有内核对象的地址。这个列表被传递给gperf, gperf生成一个合适的散列函数和这些地址的表,然后由process_gperf.py使用我们已知的特殊情况的属性来优化输出。

然后,重复前一阶段的链接过程,这次填充缺失的部分。

Post processing阶段

在这里插入图片描述

最后,如果有必要,将完成的内核从ELF转换为加载程序或目标程序所需要的flash工具所期望的格式。这可以通过使用objdump以一种简单的方式完成。

用到的脚本文件

构建过程中,用到的所有脚本文件如下:
scripts/gen_syscalls.py生成系统调用syscall的脚本
scripts/gen_kobject_list.py 生成内核对象元数据的gpef表的脚本
scripts/gen_offset_header.py 主要用于汇编代码及结构体成员访问部分。 scripts/parse_syscalls.py 扫描Zephyr的包含目录和发出系统调用和子系统元数据的脚本
scripts/gen_relocate_app. py 该脚本将从所需文件中重新定位.text、.rodata、.data 和.bss部分,并将其放到所需的内存区域。
scripts/process_gperf. py文件后处理器脚本,用于将elf格式转换为其他格式
这里只对以上脚本功能做简单说明。
有兴趣可以参考以下链接做具体了解:
https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/guides/build/index.html

<think>嗯,用户需要了解NCS SDK的离线使用指南和资源下载方法。这个问题很实际,因为嵌入式开发中经常需要在无网络环境下工作。用户可能是嵌入式工程师,正在准备离线开发环境,或者需要在内网部署项目。 从引用内容看,用户之前接触过nRF5 SDK,现在转向NCS。引用1提到NCS基于Zephyr OS且持续更新,这解释了用户迁移的原因。引用3关于嵌入式AI部署的内容可能暗示用户项目涉及边缘计算。 需要重点解决几个痛点:首先是SDK的完整离线获取,包括主仓库和所有子模块;其次是开发环境配置;最后是离线验证方法。Nordic官方文档其实有详细说明,但信息分散在多个页面。 关于资源下载,必须强调两点特殊性:一是NCS使用west工具管理多仓库,二是依赖的Zephyr OS本身就有大量子模块。直接克隆主仓库会遗漏关键组件。解决方法是用west manifest命令初始化完整代码库。 对于开发环境,离线安装VS Code扩展和工具链是个难点。建议用户提前下载好nRF Connect for Desktop的离线安装包,以及GNU工具链的压缩文件。这些在Nordic官网都有提供但需要主动寻找。 用户可能没意识到的是离线文档的重要性。在线文档转离线需要特殊操作,比如用wget镜像网站或下载PDF手册。这个需求很常见但容易被忽略。 最后考虑用户可能遇到的问题:证书错误(需导入Nordic根证书)、防火墙拦截(需配置代理白名单)、以及许可证合规性(Nordic SDK是混合许可证)。这些都应该在指南中提醒。 相关问题设计要覆盖延伸需求:离线编译涉及的工具链准备、许可证合规风险、以及企业级离线部署的特殊配置。特别是最后一个问题,很多团队部署内部Git服务器时不知道需要同步manifest仓库。</think>以下是NCS SDK的**离线使用指南**及**资源下载方法**,涵盖环境配置、资源获取和验证流程: --- ### **一、离线资源下载指南** #### 1. **NCS SDK 本体** - **官方下载**: 访问 [Nordic 开发者中心](https://www.nordicsemi.com/Products/Development-software/nrf-connect-sdk/download) → 选择 **nRF Connect SDK vX.X.X** → 下载 **Complete nRF Connect SDK**(含所有依赖的压缩包) → 文件格式:`ncs-<version>.zip`(约 1-2 GB) > ⚠️ 需注册Nordic账户,企业用户可申请离线许可证[^1]。 #### 2. **工具链离线包** - **编译器与工具**: - GNU Arm Embedded Toolchain:从 [Arm 官网](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/download) 下载 **Linux/macOS/Windows** 版本 - CMake & Ninja:官网下载离线安装包 - Python 依赖包:通过 `pip download -r requirements.txt` 下载至本地 #### 3. **VS Code 扩展离线包** - **nRF Connect for VS Code**: 在 [VS Code 市场](https://marketplace.visualstudio.com/items?itemName=nordic-semiconductor.nrf-connect-extension-pack) 页面点击 **Download Extension** → 获得 `.vsix` 文件 → 本地安装至 VS Code。 --- ### **二、离线环境配置步骤 #### 1. **解压与初始化** ```bash unzip ncs-<version>.zip -d ~/ncs cd ~/ncs west update --narrow -o=--depth=1 # 仅初始化必要子模块 ``` #### 2. **工具链路径配置** 编辑 `~/.zephyrrc` 文件,指定本地工具链路径: ```bash export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb export GNUARMEMB_TOOLCHAIN_PATH=/path/to/gcc-arm-none-eabi ``` #### 3. **验证离线编译** ```bash cd ~/ncs/nrf/samples/hello_world west build -b nrf52832dk_nrf52832 # 编译示例项目 ``` ✅ 成功输出:`Build complete: [build]/zephyr/zephyr.hex` --- ### **三、离线开发注意事项** 1. **许可证管理** - 免费用于Nordic芯片开发,但**禁止分发SDK本体** - 第三方组件(如Zephyr OS)遵循Apache 2.0许可证[^1]。 2. **文档离线访问** 下载 [Nordic Docs PDF](https://infocenter.nordicsemi.com/pdf/) 或使用 `wget` 镜像网页: ```bash wget --mirror -p --convert-links -P ./docs https://developer.nordicsemi.com ``` 3. **依赖项缓存** 首次在线执行 `west update` 后,备份 `.west` 目录: ```bash tar czf west-backup.tar.gz .west ``` 离线环境解压即可恢复仓库状态。 --- ### **四、常见问题解决** | 问题 | 解决方案 | |-----------------------|--------------------------------------------------------------------------| | 编译报错:缺失Python包 | 运行 `pip install --no-index --find-links=/path/to/packages -r requirements.txt` | | west update失败 | 检查 `west.yml` 中的Git URL是否支持SSH(内网需替换为HTTPS) | | 证书错误 | 导入 [Nordic根证书](https://www.nordicsemi.com/-/media/software/certificates/certificates.txt) | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值