前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zephyr笔记 2.1 应用程序开发基础

zephyr笔记 2.1 应用程序开发基础

作者头像
twowinter
发布2020-04-17 18:15:11
1.6K0
发布2020-04-17 18:15:11
举报
文章被收录于专栏:twowintertwowinter

1 前言

本篇笔记先做些应用开发的基础准备工作,官网英文教程见此

官方把这个教程放偏后的位置,导致我之前自己去学习 Cmake 和 Ninja 的相关知识,多做了一些重复工作。

我正在学习 Zephyr,一个很可能会用到很多物联网设备上的操作系统,如果你也感兴趣,可点此查看帖子zephyr学习笔记汇总

2 概览

Zephyr 根目录包含源码,内核配置选项以及编译定义。

根目录下的 application 目录负责 Zephyr 上的应用程序,包含所有与应用程序相关的文件,包括配置选项和源码。

一个应用程序目录一般是这样:

代码语言:javascript
复制
<home>/app
├── CMakeLists.txt
├── prj.conf
└── src
    └── main.c

CMakeLists.txt: 这个文件主要告诉 CMake 编译系统如何找到其他应用程序文件,包括硬件相关的内核配置文件,是否可以在硬件上运行或者debug程序等等。

Kernel configuration files: 每个应用文件都会提供一个配置文件(以 .conf 结尾),用于定义内核配置选项数值。如果忽视这个文件,或者无有效数值,则内核会使用默认的配置数值。

应用程序源码:应用程序的源码使用 C 或者汇编,通常都会放在 src 的子目录下。

3 Creating an Application

// 待补充,后面新建自己程序时再看。

4 编译应用程序 Build an Application

Zephyr 编译系统会编译并链接所有组件成为单个应用镜像。这里使用 ninja 来演示。

i. 基础介绍

1.进入应用程序目录 /app.

2.输入如下命令,将会按照 应用程序的 CMakeLists.txt 文件的设置,编译出应用程序的 zephyr.elf 镜像。

代码语言:javascript
复制
mkdir build
cd build
cmake -GNinja ..
ninja

如果需要,可以使用 CONF_FILE 参数,来指定相关的 .conf 文件来配置编译应用程序。这样设置将会覆盖原本的 .config 文件。例如:

代码语言:javascript
复制
# On Linux/macOS
export CONF_FILE=prj.alternate.conf
# On Windows
set CONF_FILE=prj.alternate.conf

cmake -GNinja ..
ninja

如果需要,可以为不同的硬件板子生成项目文件,通过定义环境变量 BOARD。

CONF_FILE 和 BOARD 参数都可以在编译应用时指定。

ii. 编译目录内容

代码语言:javascript
复制
<home>/app/build
├── build.ninja
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── rules.ninja
└── zephyr
  • build.ninja, 执行它可编译应用程序。
  • zephyr 目录,是编译生成文件的工作目录。

运行 ninja 后,编译输出的文件将会写入 zephyr 子目录。(这不是 Zephyr 根目录,不是 Zephyr 源码目录。)

  • .config, 包含配置信息,用来编译用的。
  • 各类 object 文件 (.o 文件 和 .a 文件) 包含了已编译的内核和应用源码。
  • zephyr.elf, 包含最终的连接应用和内核的二进制文件。其他二进制输出格式,例如 .hex 和 .bin,也都支持。

iii. 重编译应用程序

代码语言:javascript
复制
Zephyr 编译系统只重编译可能影响应用镜像的部分。因此重编译应用程序通常要比第一次要快。

如果需要强制重编译整个系统,可按照如下步骤:

1.打开控制台,进入编译目录/app/build。

2.输入如下命令,可删除应用程序生成的文件,但 .config 文件不会被删除掉。

代码语言:javascript
复制
ninja clean

或者,输入如下命令,可删除应用程序所有生成的文件,包括 .config 文件,它包含了应用程序根据板子类型生成的当前配置信息。

代码语言:javascript
复制
ninja pristine

3.之后可按照上面提到的“编译应用程序”步骤来编译。

5 运行应用程序

应用程序既可以在真实硬件板子上运行,也可以在模拟设备上运行。

在硬件板子上运行

1.编译应用程序。

2.保证你的板子连接到主机。通常都是USB连接。

3.在 build 目录 /app/build,运行如下控制台命令,将会把编译好的 Zephyr 二进制文件写入,并且运行到板子上。

代码语言:javascript
复制
ninja flash

Zephyr 编译系统集成了板子支持文件,使用硬件特定的工具来烧写 Zephyr 二进制文件到你的硬件,之后运行。

每次你运行 flash 命令,你的应用程序将会重编译并重新烧写。

如果板子支持不完全,通过 Zephyr 编译系统就可能无法烧写。如果你收到错误消息,需要到你的板子文档上确认如何烧写。

注意:

当 Linux 上开发时,通常需要安装 特定的 udev 规则,来使能非ROOT用户通过USB设备接入你的板子。如果烧写失败,需要到你的板子文档上确认。

6 自定义板子

7 应用程序调试

8 Eclipse Debugging

9 CMake Details

overview

CMake 用来编译应用程序和内核。CMake 编译分为两步,第一步称作 配置,配置期间,CMakeLists.txt 编译脚本会执行。配置结束后,CMake 便有了内部模型,可以生成针对主机的编译脚本。

CMake 支持为很多编译系统生成脚本,但目前 Zephyr 只支持 Ninja 和 Make 这两个编译系统。配置之后,开始执行生成的编译脚本。这些编译脚本可以重编译应用程序,而不需要执行 CMake。不管怎么样,变动之后,编译前都必须再执行配置步骤。编译脚本会检测这些情况,并自动重新配置,有些时候必须要手动。

Zephyr 使用 CMake 的’target’概念来识别编译。target 可以是可执行文件,一个库文件,或者一个生成文件。对于应用开发者,library target 是最需要了解的。所有的源码都是通过包含 library target 来编译。

Library targets 可以通过如下 CMakeLists.txt 编译脚本来加入源码。

代码语言:javascript
复制
target_sources(app PRIVATE src/main.c)

在上面的 CMakeLists.txt 中,已存在的 library target 名为 app,为其配置包含源码文件 src/main.c。PRIVATE 关键字表明我们正在修改内部。使用 PUBLIC 关键字可以修改链接的其他库文件。这种情况下,使用 PUBLIC 会导致链接 app 的其他 libraries 包含入 src/main.c,这是我们所不期望的。PUBLIC 关键词在修改包含路径是比较有用。

应用程序的 CMakeLists.txt

每个应用程序都必须包含 CMakeLists.txt,这个文件是编译系统的入口。最后的 zephyr.elf 镜像既包含应用程序也包含内核库。

这一小节描述如何在 CMakeLists.txt 进行操作。按照如下步骤执行。

1.如果要针对某个硬件编译,可以写如下语句:

代码语言:javascript
复制
set(BOARD qemu_x86)

2.应用程序都需要配置文件,正常是使用 prj.conf 文件。如果要特殊要求,可以使用 CONF_FILE 变量来定义。

10 Application Configuration

11 Application-Specific Code

12 总结

End

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 前言
  • 2 概览
  • 3 Creating an Application
  • 4 编译应用程序 Build an Application
    • i. 基础介绍
      • ii. 编译目录内容
        • iii. 重编译应用程序
        • 5 运行应用程序
          • 在硬件板子上运行
          • 6 自定义板子
          • 7 应用程序调试
          • 8 Eclipse Debugging
          • 9 CMake Details
            • overview
              • 应用程序的 CMakeLists.txt
              • 10 Application Configuration
              • 11 Application-Specific Code
              • 12 总结
              • End
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档