嵌入式


应用开发

<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>

页面列表

ITEM_HTML