blob: 8a665d62eb297d83c97a7f4635ee809b0a6e600f [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- This is broken by doc revisioning.
-->
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>Create Your First Project - Apache Mynewt</title>
<link href="../../../css/bootstrap-3.0.3.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../../css/highlight.css">
<link href="../../../css/base.css" rel="stylesheet">
<link href="../../../css/custom.css" rel="stylesheet">
<link href="../../../css/v2.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="Create Your First Project">
<div class="container">
<div class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released (April 4, 2024)
</div>
</div>
</div>
</div>
<nav id="navbar" class="navbar navbar-inverse affix-top" data-spy="affix" data-offset-top="150" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li
class=""
>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li
class="important"
>
<a href="/quick-start/">Quick Start</a>
</li>
<li
class=""
>
<a href="/about/">About</a>
</li>
<li
class=""
>
<a href="/talks/">Talks</a>
</li>
<li
class="active"
>
<a href="/documentation/">Documentation</a>
</li>
<li
class=""
>
<a href="/download/">Download</a>
</li>
<li
class=""
>
<a href="/community/">Community</a>
</li>
<li
class=""
>
<a href="/events/">Events</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-3 v2-sidebar sidebar-container"><div id="docSidebar" class="hidden-print" role="complementary">
<div class="top">
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search documentation" />
</div>
</form>
</div>
</div>
<ul class="toc-nav">
<li class="doc-version"><select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest">
Version: master
</option>
<option value="/v1_12_0/" >
Version: 1.12.0
</option>
<option value="/v1_11_0/" >
Version: 1.11.0
</option>
<option value="/v1_10_0/" >
Version: 1.10.0
</option>
<option value="/v1_9_0/" >
Version: 1.9.0
</option>
<option value="/v1_8_0/" >
Version: 1.8.0
</option>
<option value="/v1_7_0/" >
Version: 1.7.0
</option>
<option value="/v1_6_0/" >
Version: 1.6.0
</option>
<option value="/v1_5_0/" >
Version: 1.5.0
</option>
<option value="/v1_4_0/" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" selected="selected" >
Version: 0.9.0
</option>
</select></li>
<li ><a href="../../introduction/">Mynewt Documentation</a>
<ul>
<li ><a href="../get_started/">Basic Setup</a>
<ul>
<li >
<a href="../docker/">Docker Container Option</a>
</li>
<li ><a href="../native_tools/">Native install Option</a>
</li>
<li class="active">
<a href="./">Create Your First Project</a>
</li>
</ul>
</li>
<li >
<a href="../vocabulary/">Concepts</a>
</li>
<li ><a href="../../tutorials/tutorials/">Tutorials</a>
</li>
<li ><a href="../../os_user_guide/">OS User Guide</a>
</li>
<li><a href="
../../../network/ble/ble_intro/
">BLE User Guide</a>
</li>
<li ><a href="../../../newt/newt_intro/">Newt Tool Guide</a>
</li>
<li ><a href="../../../newtmgr/overview/">Newt Manager Guide</a>
</li>
<li >
<a href="../../../known_issues/">Known Issues</a>
</li>
</ul>
</li>
<li><a href="
../../../faq/how_to_edit_docs/
">Appendix</a>
</li>
</ul>
</div></div>
<div class="col-md-9" role="main">
<div class="doc-header">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="/documentation/">Docs</a></li>
<li>&raquo; <a href="os/get_started/get_started/">Basic Setup</a></li>
<li>&raquo; <a href="os/introduction/">Mynewt Documentation</a></li>
<li>&raquo; Create Your First Project</li>
</ul>
</div>
</div>
<div class="alert alert-warning">
<p>
Version 0.9.0 is not the most recent version of the Apache Mynewt
documentation. Click <a href="/latest">here</a> to read the latest
version.
</p>
</div>
<h2 id="create-your-first-mynewt-project">Create Your First Mynewt Project</h2>
<p>This page shows how to create a Mynewt Project using the <code>newt</code> command-line tool.</p>
<p><br></p>
<h3 id="pre-requisites">Pre-Requisites</h3>
<ul>
<li>Newt:<ul>
<li>If you have taken the Docker route, you have already installed Newt.</li>
<li>If you have taken the native install route, you have to ensure that you have installed the Newt tool following the instructions for <a href="../../../newt/install/newt_mac/">Mac</a> or <a href="../../../newt/install/newt_linux/">Linux</a> as appropriate, and that the <code>newt</code> command is in your system path. </li>
</ul>
</li>
<li>You must have Internet connectivity to fetch remote Mynewt components.</li>
<li>You must <a href="../native_tools/">install the compiler tools</a> to
support native compiling to build the project this tutorial creates. </li>
</ul>
<p><br></p>
<h3 id="newt-new">Newt New</h3>
<p>Choose a project name. For this tutorial we will call this project <code>myproj</code>.
Enter the <code>newt new myproj</code> command. </p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt new myproj
Downloading project skeleton from apache/incubator-mynewt-blinky...
Installing skeleton in myproj...
Project myproj successfully created.
</code></pre></div>
<p><br></p>
<p>Newt populates this new project with a base skeleton of a new Apache Mynewt
project. It has the following structure. </p>
<p><strong>Note</strong>: If you do not have <code>tree</code>, install it by running <code>brew install tree</code>.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ cd myproj
$ tree
.
├── DISCLAIMER
├── LICENSE
├── NOTICE
├── README.md
├── apps
│   └── blinky
│   ├── pkg.yml
│   └── src
├── project.yml
└── targets
├── my_blinky_sim
│   ├── pkg.yml
│   └── target.yml
└── unittest
├── pkg.yml
└── target.yml
6 directories, 10 files
</code></pre></div>
<p><br></p>
<p>The Newt tool has installed the base files for a project comprising the following:</p>
<ol>
<li>The file <code>project.yml</code> contains the repository list that the project uses to fetch
its packages. Your project is a collection of repositories. In this case, the project just
comprises the core mynewt repository. Later you will add more repositories
to include other mynewt components.</li>
<li>The file <code>apps/blinky/pkg.yml</code> contains the description of your application
and its package dependencies.</li>
<li>A <code>target</code> directory containing <code>my_blinky_sim</code>, a target descriptor used to
build a version of myproj. Use <code>newt target show</code> to see available build
targets.</li>
<li>A non-buildable target called <code>unittest</code>. This is used internally by <code>newt</code> and is not a formal build target.</li>
</ol>
<p><strong>NOTE:</strong> the actual code and package files are not installed
(except the template for <code>main.c</code>). See the next step for installing the packages.</p>
<p><br></p>
<h3 id="newt-install">Newt Install</h3>
<p>Once you've switched into your new project's directory, the next step is to fetch
any dependencies this project has. By default, all Newt projects rely on a
single remote repository, apache-mynewt-core. The <em>newt install</em> command will
fetch this repository.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt install
apache-mynewt-core
</code></pre></div>
<p><strong>NOTE:</strong> <em>apache-mynewt-core</em> may take a while to download. To see progress,
use the <em>-v</em> (verbose) option to install. </p>
<p><br></p>
<p>Once <em>newt install</em> has successfully finished, the contents of <em>apache-mynewt-core</em> will have been downloaded into your local directory. You can view them by issuing the following commands in the base directory of the new project:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ tree -L 2 repos/apache-mynewt-core/
.
&lt;snip&gt;
├── fs
│   ├── fs
│   └── nffs
├── hw
│   ├── bsp
│   ├── hal
│   └── mcu
├── libs
│   ├── baselibc
│   ├── bootutil
│   ├── cmsis-core
│   ├── console
│   ├── elua
│   ├── flash_test
│   ├── imgmgr
│   ├── json
│   ├── mbedtls
│   ├── newtmgr
│   ├── os
│   ├── shell
│   ├── testreport
│   ├── testutil
│   └── util
├── net
│   └── nimble
&lt;snip&gt;
</code></pre></div>
<p>As you can see, the core of the Apache Mynewt operating system has been brought
into your local directory. </p>
<p><br></p>
<h3 id="test-the-projects-packages">Test the project's packages</h3>
<p>You have already built your first basic project. You can ask Newt to execute the unit tests in a package. For example, to test the <code>libs/os</code> package in the <code>apache-mynewt-core</code> repo, call newt as shown below.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt test @apache-mynewt-core/libs/os
Testing package @apache-mynewt-core/libs/os
Compiling hal_bsp.c
Compiling os_bsp.c
Compiling sbrk.c
Archiving native.a
Compiling flash_map.c
&lt;snip&gt;
</code></pre></div>
<p><br></p>
<p>To test all the packages in a project, specify <code>all</code> instead of the package name.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt test all
...lots of compiling and testing...
...about 2 minutes later ...
Archiving bootutil.a
Linking test_bootutil
Executing test: /myproj/bin/unittest/libs/bootutil/test_bootutil
Passed tests: [net/nimble/host fs/nffs libs/os hw/hal libs/mbedtls libs/util sys/config libs/bootutil]
All tests passed
</code></pre></div>
<p><br></p>
<h3 id="build-the-project">Build the Project</h3>
<p>To build and run your new application, simply issue the following command:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt build my_blinky_sim
Compiling base64.c
Compiling cbmem.c
Compiling datetime.c
Compiling tpq.c
Archiving util.a
Compiling main.c
Archiving blinky.a
Compiling flash_map.c
Compiling hal_flash.c
Archiving hal.a
Compiling cons_fmt.c
Compiling cons_tty.c
&lt;snip&gt;
Linking blinky.elf
App successfully built: /Users/sterling/dev/tmp/my_app/bin/my_blinky_sim/apps/blinky/blinky.elf
</code></pre></div>
<p><br></p>
<h3 id="run-the-project">Run the Project</h3>
<p>You can run the simulated version of your project and see the simulated LED
blink.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt run my_blinky_sim
No download script for BSP hw/bsp/native
Debugging /workspace/bin/my_blinky_sim/apps/blinky/blinky.elf
&lt;snip&gt;
Reading symbols from /workspace/bin/my_blinky_sim/apps/blinky/blinky.elf...done.
(gdb)
</code></pre></div>
<p>Type <code>r</code> at the <code>(gdb)</code> prompt to run the project. You will see an output indicating that the <code>hal_gpio</code> pin is toggling between 1 and 0 in a simulated blink. </p>
<p><br></p>
<h3 id="complete">Complete</h3>
<p>Congratulations, you have created your first project! The blinky application
is not terribly exciting when it is run in the simulator, as there is no LED to
blink. Apache Mynewt has a lot more functionality than just running simulated
applications. It provides all the features you'll need to cross-compile your
application, run it on real hardware and develop a full featured application.</p>
<p>If you're interested in learning more, a good next step is to dig in to one of
the <a href="../tutorials/tutorials">tutorials</a> and get a Mynewt project running on real hardware.</p>
<p>Happy Hacking!</p>
<div class="row">
<ul class="nav nav-pills" style="margin-bottom: 10px">
<li>
</li>
<li class="pull-right">
</li>
</ul>
</div>
<footer class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt (incubating) is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<a href="https://www.apache.org/">
<img src="/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
</a>
<p>
Copyright © 2015-2021 The Apache Software Foundation.<br>
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt
project logo are either registered trademarks or trademarks of the Apache
Software Foundation in the United States and other countries.
</small>
</p>
<a href="">
<img src="https://www.countit.com/images/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
<a href="https://www.apache.org/licenses/">
<button class="button-footer-asf">
License
</button>
</a>
<a href="https://www.apache.org/foundation/sponsorship.html">
<button class="button-footer-asf">
Sponsorship
</button>
</a>
<a href="https://www.apache.org/foundation/thanks.html">
<button class="button-footer-asf">
Thanks
</button>
</a>
<a href="https://www.apache.org/security/">
<button class="button-footer-asf">
Security
</button>
</a>
<a href="https://apache.org/events/current-event">
<button class="button-footer-asf">
ASF Events
</button>
</a>
</footer>
</div>
</div>
</div>
<script src="../../../js/jquery-1.10.2.min.js"></script>
<script src="../../../js/bootstrap-3.0.3.min.js"></script>
<script src="../../../js/highlight.pack.js"></script>
<script src="../../../js/base.js"></script>
<script src="../../../js/custom.js"></script>
<script src="search/main.js"></script>
</body>
</html>