Zephyr kernel Build System (CMake)介绍

news2025/7/15 13:14:53

目录

概述

1. 结构介绍

2  构建和配置阶段

2.1 配置阶段

2.2 Cmake编译

3 Zephy项目目录结构

3.1 文件架构

3.2 文件content


概述

本文主要介绍Zephyr kernel Build System CMake的功能,以及使用该工具构建项目,并详细介绍了每个目录以及目录下文件的作用。

1. 结构介绍

CMake 用于与 Zephyr 内核一起构建您的应用程序。一个 CMake 构建分两个阶段完成。第一阶段称为 configuration。在配置过程中,CMakeLists.txt构建脚本是 执行。配置完成后,CMake 有一个 Zephyr 构建,并且可以生成主机原生的构建脚本平台。

CMake 支持为多个构建系统生成脚本,但仅支持 Ninja 和 Make 由 Zephyr 测试和支持。配置后,您可以通过执行生成的构建脚本来开始构建阶段。这些生成脚本 可以重新编译应用程序,而无需涉及 CMake following 大多数代码更改。但是,在某些更改之后,配置步骤必须 在构建之前再次执行。构建脚本可以检测到其中的一些 情况并自动重新配置,但在某些情况下,这必须 手动完成。

Zephyr 使用 CMake 的“目标”概念来组织构建。一个 target 可以是可执行文件、库或生成的文件。为 应用程序开发人员,库目标是最重要的 理解。Zephyr 构建中的所有源代码都是通过以下方式实现的 包含在库目标中,甚至是应用程序代码。

库目标具有源代码,这些源代码是通过 CMakeLists.txt 构建如下脚本:

target_sources(app PRIVATE src/main.c)

解释:

app:    配置源文件的地址  src/main.c

PRIVATE: keyword 表示我们正在修改库的内部的程序库

 

2  构建和配置阶段

Zephyr 构建过程可以分为两个主要阶段:配置 阶段(由 CMake 驱动)和构建阶段(由 Make 或 Ninja 驱动)。 

2.1 配置阶段

当用户调用 CMake 生成 build system,指定源应用程序目录和 Board 目标。

CMake 首先在应用程序中处理文件 CMakeLists.txt目录中,该目录引用 Zephyr 中的 CMakeLists.txt顶级目录,该目录又引用文件 CMakeLists.txt在整个 build 树中(直接和间接)。它的主要输出是一个 一组 Makefile 或 Ninja 文件来驱动构建过程,但 CMake 脚本也会执行一些自己的处理,这将在此处进行说明。

2.2 Cmake编译

运行Cmake后,会创建build/目录

Cmake 编译的log信息:

-- west build: building domain(s): observer
[0/1] Re-running CMake...
Loading Zephyr default modules (Zephyr base (cached)).
-- Application: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer
-- CMake version: 3.21.0
-- Cache files will be written to: D:/ncs/v2.9.0/zephyr/.cache
-- Zephyr version: 3.7.99 (D:/ncs/v2.9.0/zephyr)
-- Found west (found suitable version "1.2.0", minimum required is "0.14.0")
-- Board: nrf52840dk, qualifiers: nrf52840
-- Found host-tools: zephyr 0.17.0 (C:/ncs/toolchains/b620d30767/opt/zephyr-sdk)
-- Found toolchain: zephyr 0.17.0 (C:/ncs/toolchains/b620d30767/opt/zephyr-sdk)
-- Found BOARD.dts: D:/ncs/v2.9.0/zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts
-- Generated zephyr.dts: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/zephyr.dts
-- Generated devicetree_generated.h: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/include/generated/zephyr/devicetree_generated.h
-- Including generated dts.cmake file: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/dts.cmake
Parsing D:/ncs/v2.9.0/zephyr/Kconfig
Loaded configuration 'D:/ncs/v2.9.0/zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_defconfig'
Merged configuration 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/prj.conf'
Merged configuration 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/.config.sysbuild'
No change to configuration in 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/.config'
No change to Kconfig header in 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/include/generated/zephyr/autoconf.h'
-- Configuring done
-- Generating done
-- Build files have been written to: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer
[4/18] Generating include/generated/zephyr/version.h
-- Zephyr version: 3.7.99 (D:/ncs/v2.9.0/zephyr), build: v3.7.99-ncs2
[18/18] Linking C executable zephyr\zephyr.elf
Memory region         Used Size  Region Size  %age Used
           FLASH:       81792 B         1 MB      7.80%
             RAM:       23056 B       256 KB      8.80%
        IDT_LIST:          0 GB        32 KB      0.00%
Generating files from D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/zephyr.elf for board: nrf52840dk
 *  Terminal will be reused by tasks, press any key to close it. 

3 Zephy项目目录结构

使用vscode打开Zephy提供的demo,笔者以adc_dt项目为例,介绍Zephy架构下的项目文件结构,具体项目位置:C:\ncs\v2.9.1\zephyr\samples\drivers\adc\adc_dt。

3.1 文件架构

工程目录下包含两个文件夹和4个文件,其具体作用如下:

1) boards 目录:


.overlay文件:   包括和板块相关的配置,主要是根据板块的特性,重写设备树文件,该文件的后缀名为.overlay

.conf文件: 其主要用于使能Zephy提供的一些程序模块,通过对相应的模块配置y或者n,以打开或者关闭该功能


2) src目录


其主要用于包括和项目相关的工程文件,demo中的src目录只包括一个文件main.c,实际开发项目是,可在该目录添加更多的文件


3)CMakeLists.txt


编译项目相关的设置,包括项目名称,添加.c文件,文件路径等内容


4)prj.conf


在进行编译项目代码时,系统默认会选择该文件作为编译配置项,实际开发项目时,可根据需要进行改写


5)README.rst


说明文件,主要用于介绍项目的功能,编译环境,板块信息,使用方法,应用场景等
 


6)sample.yaml


编译选项配置文件

3.2 文件content

1) .overlay文件

/*
 * SPDX-License-Identifier: Apache-2.0
 *
 * Copyright (c) 2022 Nordic Semiconductor ASA
 */


/ {
	zephyr,user {
		io-channels = <&adc 0>, <&adc 1>, <&adc 7>;
	};
};

&adc {
	#address-cells = <1>;
	#size-cells = <0>;

	channel@0 {
		reg = <0>;
		zephyr,gain = "ADC_GAIN_1_6";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,input-positive = <NRF_SAADC_AIN1>; /* P0.03 */
		zephyr,resolution = <12>;
	};

	channel@1 {
		reg = <1>;
		zephyr,gain = "ADC_GAIN_1_6";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,input-positive = <NRF_SAADC_VDD>;
		zephyr,resolution = <14>;
		zephyr,oversampling = <8>;
	};

	channel@7 {
		reg = <7>;
		zephyr,gain = "ADC_GAIN_1_5";
		zephyr,reference = "ADC_REF_VDD_1_4";
		zephyr,vref-mv = <750>;
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,input-positive = <NRF_SAADC_AIN6>; /* P0.30 */
		zephyr,input-negative = <NRF_SAADC_AIN7>; /* P0.31 */
		zephyr,resolution = <12>;
	};
};

2) .conf文件结构

3) CMakeLists.txt

# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(ADC)

target_sources(app PRIVATE src/main.c)

4)  sample.yaml

sample:
  name: ADC devicetree driver sample
tests:
  sample.drivers.adc.adc_dt:
    tags:
      - adc
    depends_on: adc
    platform_allow:
      - nucleo_l073rz
      - disco_l475_iot1
      - cc3220sf_launchxl
      - cc3235sf_launchxl
      - cy8cproto_063_ble
      - stm32l496g_disco
      - stm32h735g_disco
      - nrf51dk/nrf51822
      - nrf52840dk/nrf52840
      - nrf54l15dk/nrf54l15/cpuapp
      - nrf54h20dk/nrf54h20/cpuapp
      - mec172xevb_assy6906
      - gd32f350r_eval
      - gd32f450i_eval
      - gd32vf103v_eval
      - gd32f403z_eval
      - esp32_devkitc_wroom/esp32/procpu
      - esp32_devkitc_wrover/esp32/procpu
      - esp32s2_saola
      - esp32c3_devkitm
      - gd32l233r_eval
      - lpcxpresso55s36
      - mr_canhubk3
      - longan_nano
      - longan_nano/gd32vf103/lite
      - rd_rw612_bga
      - frdm_mcxn947/mcxn947/cpu0
      - ucans32k1sic
    integration_platforms:
      - nucleo_l073rz
      - nrf52840dk/nrf52840
    harness: console
    timeout: 10
    harness_config:
      type: multi_line
      regex:
        - "ADC reading\\[\\d+\\]:"
        - "- .+, channel \\d+: -?\\d+"

参考文献:

https://docs.zephyrproject.org/latest/build/cmake/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2343505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相对论大师-记录型正负性质BFS/图论-链表/数据结构

看到这一题我的第一个思路就是双向bfs 起点是a&#xff0c;终点还是a&#xff0c;但是flag是相反的&#xff08;“越”的方向&#xff09; tip1.可以用字典vis来存储flag 刚开始初始化时vissta,visend一个对应0、1 要求两个队列相…

Jenkins流水线管理工具

文章目录 前言&#xff1a; DevOps时代的自动化核心 —Jenkins一、Jenkins是什么&#xff1f;二、Linux安装Jenkinswar包方式安装依赖环境下载 Jenkins WAR 包启动 Jenkins 服务启动日志验证配置插件镜像源 docker镜像方式安装依赖环境拉取 Jenkins 镜像运行 Jenkins 容器获取初…

嵌入式开发:基础知识介绍

一、嵌入式系统 1、介绍 以提高对象体系智能性、控制力和人机交互能力为目的&#xff0c;通过相互作用和内在指标评价的&#xff0c;嵌入到对象体系中的专用计算机系统。 2、分类 按其形态的差异&#xff0c;一般可将嵌入式系统分为&#xff1a;芯片级&#xff08;MCU、SoC&am…

el-table中el-input的autofocus无法自动聚焦的解决方案

需求 有一个表格展示了一些进度信息&#xff0c;进度信息可以修改&#xff0c;需要点击进度信息旁边的编辑按钮时&#xff0c;把进度变为输入框且自动聚焦&#xff0c;当鼠标失去焦点时自动请求更新接口。 注&#xff1a;本例以vue2 element UI为例 分析 这个需求看着挺简单…

一文了解智慧教育顶刊TLT的研究热点

本文聚焦于IEEE Transactions on Learning Technologies&#xff08;TLT&#xff09;期刊&#xff0c;通过图文结合的方式&#xff0c;梳理了2025年第18卷的研究热点&#xff0c;帮助读者把握教育技术与人工智能交叉领域的研究进展&#xff0c;深入了解智能学习系统、自适应学习…

统计术语学习

基期、现期 作为对比参照的时期称为基期&#xff0c;而相对于基期的称为现期。 描述具体数值时我们称之为基期量和现期量。 【例 1】2017 年比 2016 年第三产业 GDP 增长 6.8%&#xff0c; &#xff08;2016&#xff09;为基期&#xff0c;&#xff08;2017&#xff09; 为现…

飞机会员日

各航空公司会员日日期 主要航空公司会员日整理如下&#xff08;数据截至2025年3月最新信息&#xff09;&#xff1a;‌ 1 2 ‌中国国际航空&#xff08;国航&#xff09;‌ 每月"同月同日"&#xff08;如1月1日、2月2日类推&#xff09; ‌中国南方航空&#xff08…

论分布式事务及其解决方案 架构师论文范文(考试笔记)

请围绕“论分布式事务及其解决方案”论题&#xff0c;依次从以下三个方面进行论述。 1、概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。 2、请介绍4种分布式事务的解决方案及简单说明。 3、具体阐述你参与的软件项目是如何做到分布式事务的&#xff0c;过程中…

ROS 快速入门教程04

12.激光雷达工作原理 激光雷达的作用是探照周围障碍物的距离&#xff0c;按照测量维度可以分为单线雷达和多线雷达。 按照测量原理可以分为三角测距雷达和TOF雷达。按照工作方式可以分为固态雷达和机械旋转雷达。 本次讲解以TOF雷达为例&#xff0c;雷达发射器发射激光遇到障碍…

2025 年导游证报考条件新政策解读与应对策略

2025 年导游证报考政策有了不少新变化&#xff0c;这些变化会对报考者产生哪些影响&#xff1f;我们又该如何应对&#xff1f;下面就为大家详细解读新政策&#xff0c;并提供实用的应对策略。 最引人注目的变化当属中职旅游类专业学生的报考政策。以往&#xff0c;中专学历报考…

vscode切换Python环境

跑深度学习项目通常需要切换python环境&#xff0c;下面介绍如何在vscode切换python环境&#xff1a; 1.点击vscode界面左上角 2.在弹出框选择对应kernel

Spark-Streaming(三)

一. kafka和flume的整合 任务需求一:利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台 1. 在flume/conf/目录下添加flume-kafka.conf文件 配置文件如下 2. 启动flume和kafka消费者 3. 传入数据 查看fl…

SQLite 是什么?

&#x1f4cc; 一、SQLite 是什么&#xff1f; SQLite 是一个轻量级、嵌入式数据库&#xff0c;意思是它直接集成在你的 App 内部&#xff0c;不需要单独安装数据库服务端。 ✅ 特点&#xff1a; 特点说明本地使用所有数据保存在手机内部存储文件形式数据以 .db 文件形式存储…

海之淀攻略

家长要做的功课 家长可根据孩子情况&#xff0c;需要做好以下功课&#xff1a; 未读小学的家长&#xff1a;了解小学小升初派位初中校额到校在读小学的家长&#xff1a;了解小升初派位初中校额到校在读初中的家长&#xff1a;了解初中校额到校 越是高年级的家长&#xff0c;…

PCIe具体解释分析

参考文章 PCIe总线详解_STATEABC-GitCode 开源社区 https://zhuanlan.zhihu.com/p/652808759 PCI总线学习(一)&#xff1a;PCI总线结构-CSDN博客 PCI——第1章——PCI总线的基本知识-CSDN博客 计算机中register、cache、memory的区别 - Lines Blog 什么是内存管理单元&#xff…

Golang | 迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种顺序访问聚合对象&#xff08;如列表、树等集合结构&#xff09;中元素的方法&#xff0c;而无需暴露其底层实现细节。通过将遍历逻辑与集合本身解耦&#xff0c;迭代器模式使…

使用命令行加密混淆C#程序

C#作为托管语言编译生成的IL中间代码极易被反编译工具还原源码。据统计&#xff0c;超过83%的商业软件曾遭遇过代码逆向风险&#xff0c;导致核心算法泄露、授权被跳过. 因此对于C#语言开发的程序来说, 在发布前进行混淆和加密非常有必要. 本文主要介绍如何使用恒盾C#混淆加密…

当智驾成标配,车企暗战升级|2025上海车展

文&#xff5c;刘俊宏 编&#xff5c;王一粟 智能化无处不在的2025年上海车展&#xff0c;回归了卖车的初衷。 光锥智能在展会暴走两天&#xff0c;最大的感触是今年的车展少了争奇斗艳&#xff0c;多了些许务实。 回顾智能汽车时代的三场重要车展。2023年的上海车展充满了…

在网上找的资料怎样打印出来?

在数字化时代&#xff0c;我们经常需要从互联网上获取各种资料&#xff0c;无论是学术论文、工作文档还是学习资料。然而&#xff0c;如何高效地将这些网上的资料打印出来&#xff0c;却是一个值得探讨的问题。本文将为您提供一个全面的解决方案&#xff0c;帮助您轻松完成网上…

算法训练营 Day1

努力追上那个曾经被寄予厚望的自己 —— 25.4.25 一、LeetCode_26 删除有序数组中的重复项 给你⼀个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现⼀次 &#xff0c;返回删除后数组的 新⻓度。元素的 相对顺序 应该保持 ⼀致 …