应用开发
<h3>最简单的目录结构</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/ada5c045c53f0772eaec62cf5fb90af9?showdoc=.jpg" alt="" /></p>
<ul>
<li>
<p><strong><code>CMakeLists.txt</code></strong>: 告知构建系统应用文件在哪,并将应用目录与<code>Zephyr CMake</code>构建系统连接到一起,这个连接提供了<code>Zephyr</code>构建系统支持的特性入板级内核配置文件,调试和允许编译后的二进制文件等等</p>
</li>
<li>
<p><strong>内核配置文件</strong>: 一个应用的配置文件指定特定于应用的配置值,这些配置与板级配置合并到一起产生一个内核配置</p>
</li>
<li><strong>应用源代码文件</strong>:一个应用一般提供一个或更多的特定于应用的<code>C</code>或汇编语言的文件,这些文件一般放在<code>src</code>的目录下</li>
</ul>
<blockquote>
<p>必须自行创建<code>build</code>目录,然后在该目录下执行<code>cmake</code></p>
</blockquote>
<h3>创建一个应用</h3>
<ol>
<li>
<p>在<code>Zephyr</code>目录外的其他地方创建应用目录,如在<code>Unix shell</code>或<code>Windows cmd.exe</code>进入到你想创建的目录</p>
<pre><code>mkdir app</code></pre>
<blockquote>
<p><font color=red>目录中不能有空格</font></p>
</blockquote>
</li>
<li>
<p>推荐将所有源代码放到<code>src</code>目录下,如</p>
<pre><code>cd app
mkdir src</code></pre>
</li>
<li>
<p>创建<code>CMakeLists.txt</code>,其内容如下:</p>
<pre><code># Boilerplate code, which pulls in the Zephyr build system.
cmake_minimum_required(VERSION 3.13.1)
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
project(my_zephyr_app)
# Add your source file to the "app" target. This must come after
# the boilerplate code, which defines the target.
target_sources(app PRIVATE src/main.c)</code></pre>
<p><code>boilerplate</code>代码设定了<code>CMake</code>的最低版本,并加入<code>Zephyr</code>构建系统 ,将源代码加入到目标</p>
</li>
</ol>
<blockquote>
<p><code>boilerplate.cmake</code>也会调用<code>cmake_minimum_required()</code>
设置应用中需要的任何<code>Kconfig</code>值,如创建<code>prj.conf</code>打开或禁止<code>Kconfig</code>特性</p>
</blockquote>
<ol>
<li>你也可以配置任何的<strong>设备树</strong>(可选)</li>
</ol>
<h3>最重要的构建系统变量</h3>
<ul>
<li>
<p><strong><code>ZEPHYR_BASE</code></strong>: <code>Zephyr</code>路径,构建系统的<code>boilerplate</code>文件需要它,它在<code>zephyr-env.sh</code>或<code>zephyr-env.cmd</code>脚本中设置</p>
</li>
<li>
<p><strong><code>BOARD</code></strong>: 选择应用使用的板子的默认配置,这在<code>CMakeLists.txt</code>设置,或在<code>cmake</code>命令行中指定</p>
</li>
<li>
<p><strong><code>CONF_FILE</code></strong>: 指定更多配置文件名,多个文件通过空格或逗号分隔,每个文件都包含<code>Kconfig</code>配置项,这都将覆盖默认值,类似于<code>BOARD</code>,这也是定义在<code>CMakeLists.txt</code>或<code>cmake</code>命令行中指定</p>
</li>
<li>DTC_OVERLAY_FILE: 指定<strong>设备树</strong>文件,每个文件包含设备树值,这将覆盖默认值. 类似于<code>CONF_FILE</code>,这也是定义在<code>CMakeLists.txt</code>或<code>cmake</code>命令行中指定</li>
</ul>
<h3>构建一个应用</h3>
<p><code>Zephyr</code>构建系统编译和连接一个应用的所有组件到一个应用文件中,这个文件可以在模拟硬件或真实硬件上运行</p>
<blockquote>
<p>在<code>Linux</code>和<code>macOS</code>系统中可以使用<code>make</code>或<code>ninja</code>,然而<code>Windows</code>中只能使用<code>ninja</code></p>
</blockquote>
<ol>
<li>
<p>使用下面没了构建应用文件<code>zephyr.elf</code></p>
<pre><code>mkdir build
cd build
cmake -GNinja ..
ninja</code></pre>
<p>如果需要,你可以使用<code>CONF_FILE</code>指定的<code>.conf</code>文件的配置构建应用,这些设定值将覆盖应用的<code>.config</code>或默认<code>.conf</code>文件,如:</p>
<pre><code># On Linux/macOS
export CONF_FILE=prj.alternate.conf
# On Windows
set CONF_FILE=prj.alternate.conf
cmake -GNinja ..
ninja</code></pre>
<p>如果需要,通过环境变量中<code>BOARD</code>值你可以为不同的板子类型生成工程文件</p>
</li>
</ol>
<h3>构建目录内容</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/2a47edf44f26b9e4f0a9158f5bd5f2f6?showdoc=.jpg" alt="" /></p>
<ul>
<li>
<p><strong><code>build.ninja</code></strong>: 使用它构建一个应用</p>
</li>
<li>
<p><strong><code>zephyr</code></strong>目录: 生成的构建系统的工作目录,大部分生成的文件都放在这</p>
<blockquote>
<p>在运行<code>ninja</code>后下面的构建输出文件将放到*<code>zephyr</code>目录下</p>
</blockquote>
</li>
<li>
<p><strong><code>.config</code></strong>: 构建应用的配置文件</p>
<blockquote>
<p>之前版本的<code>.config</code>将保存为<code>.config.old</code></p>
</blockquote>
</li>
<li>
<p><code>obj</code>文件(<code>.o</code>和<code>.a</code>)包含内核和应用代码</p>
</li>
<li><code>zephyr.elf</code>: 最终的二进制文件,也支持其他格式的文件,如<code>.hex</code>和<code>.bin</code></li>
</ul>
<h3>重新构建</h3>
<p>当程序的变更可以持续测试时应用开发将可以非常快速,频繁的重建应用使得越来越复杂的应用调试起来越来越轻松。在任何应用文件的改变都重建应用是个好主意</p>
<blockquote>
<p><strong><font color=red><code>Zephyr</code>构建系统只重建受变化影响的部分,所有重建一个应用经常比第一次构建快很多</font></strong>
<strong><font color=red>有时构建系统不能正确的重建一个应用,这是由于它重建一个或多个文件时出现失败。你可以通过下面的步骤强制构建整个应用</font></strong></p>
<pre><code># 删除所有应用生成的文件,除了.configw文件
ninja clean
或
# 删除所有应用生成的文件,包括.configw文件
ninja pristine</code></pre>
</blockquote>
<h3>运行一个应用</h3>
<ul>
<li>
<p><strong>在板子中运行</strong></p>
<pre><code>ninja flash</code></pre>
<blockquote>
<ul>
<li><code>Zephyr</code>构建系统集成了板子支持文件来使用硬件特定工具烧录<code>Zephyr</code>二进制文件到硬件中,然后运行它</li>
<li>每次运行<code>flash</code>命令应用将被重建然后烧录</li>
<li>当在<code>Linux</code>开发需要安装<code>udev</code>规则来允许非<code>root</code>访问USB设备</li>
</ul>
</blockquote>
</li>
<li><strong>在模拟器中允许</strong>
内核内建模拟器支持<code>QEMU</code>(不支持<code>Windows</code>),它允许你允许和测试应用程序, <code>BOARD</code>设定值如下
<ul>
<li>qemu_x86: 模拟<code>X86</code>板子</li>
<li>qemu_cortex_m3: 模拟<code>ARM Cortex M3</code>板子
<pre><code>ninja run</code></pre>
<p>按<code>Ctrl-A, X</code> 停止运行</p>
<blockquote>
<p>运行目标默认使用的是<code>Zephyr SDK</code>里的<code>QEMU</code>库。若使用其他版本通过环境变量<code>QEMU_BIN_PATH</code>指定</p>
</blockquote></li>
</ul></li>
</ul>